1. 程式人生 > >【設計模式學習筆記】空物件模式

【設計模式學習筆記】空物件模式

空物件模式:一個空物件取代 NULL 物件例項的檢查。Null 物件不是檢查空值,而是反應一個不做任何動作的關係。這樣的 Null 物件也可以在資料不可用的時候提供預設的行為。【菜鳥】

文章目錄

當我們的系統中找不到某種車型的時候,直接返回物件肯定是個null。這時候如果你不做什麼判斷處理直接呼叫物件中的方法肯定是會不報錯的。退一步說直接返回為空,是否有點暴力,太不人性化了。

1.1 抽象物件及對應的繼承類。

這裡我們搞了一個抽象物件,並用一個RealCar和NullCar繼承它。當我們從工廠類中獲取到對應的Car時就返回RealCar,獲取不到就返回NullCar。

package nullobject;

import util.StringUtil;

/************************************************
 *@ClassName : AbstractCar
 *@Description : TODO
 *@Author : NikolaZhang
 *@Date : 【2018/12/15 0015 19:30】
 *@Version : 1.0.0
 *************************************************/
public abstract class AbstractCar { protected String name; public boolean isNull(){ if(StringUtil.isEmpty(this.name)){ return true; }else{ return false; } } public abstract String getName(); }
package nullobject;

/************************************************
 *@ClassName : AbstractCar
 *@Description : TODO
 *@Author : NikolaZhang
 *@Date : 【2018/12/15 0015 19:30】
 *@Version : 1.0.0
 *************************************************/
public class NullCar extends AbstractCar{ @Override public String getName() { return "dont have such car!"; } }
package nullobject;

/************************************************
 *@ClassName : AbstractCar
 *@Description : TODO
 *@Author : NikolaZhang
 *@Date : 【2018/12/15 0015 19:30】
 *@Version : 1.0.0
 *************************************************/

public class RealCar extends AbstractCar {
    @Override
    public String getName() {
        return "存在這輛車";
    }

    public RealCar(String name) {
        super.name = name;
    }
}

1.2 工廠

package nullobject;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

/************************************************
 *@ClassName : CarFactory
 *@Description : TODO
 *@Author : NikolaZhang
 *@Date : 【2018/12/15 0015 19:39】
 *@Version : 1.0.0
 *************************************************/

public class CarFactory {
    private static List<String> cars = new ArrayList<>();
    static {
        cars.add("bwm");
        cars.add("benz");
    }
    public static AbstractCar getCar(String name){
        Iterator<String> iterator = cars.iterator();
        while (iterator.hasNext()){
            if(name.equals(iterator.next())) {
                return new RealCar(name);
            }
        }
        return new NullCar();
    }
}



1.3 測試

package nullobject;

/************************************************
 *@ClassName : Test
 *@Description : TODO
 *@Author : NikolaZhang
 *@Date : 【2018/12/15 0015 17:34】
 *@Version : 1.0.0
 *************************************************/

public class Test {
    public static void main(String[] args) {
        System.out.println(CarFactory.getCar("bwm").getName());
        System.out.println(CarFactory.getCar("asdfsa").getName());
    }
}

1.4 結果

在這裡插入圖片描述