Android 小知識點(三)

那些年你未曾注意過的設計模式

1.工廠模式(簡單靜態工廠)

public abstract class Drink {

    public void make() {
        // 1. 拿出一次性飲料杯
        System.out.println("拿出一次性飲料杯");

        // 2. 加入速溶橙汁粉
        System.out.println("加入" + getInstantPackage());

        // 3. 加水衝兌
        System.out.println("加水");

        // 4. 加蓋, 打包
        System.out.println("加蓋, 打包");
    }

    abstract String getInstantPackage();
}



public class Coke extends Drink {
    @Override
    String getInstantPackage() {
        return "速溶可樂粉";
    }
}

public class PlumJuice extends Drink {
    @Override
    String getInstantPackage() {
        return "速溶酸梅粉";
    }
}

public class OrangeJuice extends Drink {
    @Override
    String getInstantPackage() {
        return "速溶橙汁粉";
    }
}


public class Factory{

    public static Drink create(String drinkType) {

        //  Java7開始, switch支持String
        switch (drinkType) {
            case "橙汁":
                return new OrangeJuice();

            case "酸梅湯":
                return new PlumJuice();

            case "可樂":
                return new Coke();

            default:
                return new OrangeJuice();
        }
    }
}

同時在分支邏輯上 屬於策略模式,在生產目的上屬於工廠模式(關注的是產出,策略關注的分支)

個人理解:調用對象不需要關心對象是如何產生的,只需要調用工廠生產方法,並且傳入(或者工廠內部自行判斷條件) ,產出對應的對象產品
弊端: 判斷的分支UML邏輯和生成對象的創建操作都在工廠類中進行,工廠類複雜.

2.裝飾者模式

public interface Drink {

    String make();
}


public class Coke implements Drink {
    @Override
    public String make() {
        return "這是一杯可樂";
    }
}

blic class Ice implements Drink {

    private Drink originalDrink;
    public Ice(Drink originalDrink) {
        this.originalDrink = originalDrink;
    }

    @Override
    public String make() {
        return originalDrink.make() + ", 加一塊冰";
    }


public class XiaoGuang {

    public static void main(String[] args) {

        Drink coke = new Coke();
        System.out.println(coke.make());

        Drink iceCoke = new Ice(new Coke());
        System.out.println(iceCoke.make());
    }
}

public abstract class Stuff implements Drink {

    private Drink originalDrink;
    public Stuff(Drink originalDrink) {
        this.originalDrink = originalDrink;
    }

    @Override
    public String make() {
        return originalDrink.make() + ", 加一份" + stuffName();
    }

    abstract String stuffName();
}


public class Ice extends Stuff {

    public Ice(Drink originalDrink) {
        super(originalDrink);
    }

    @Override
    String stuffName() {
        return "冰";
    }
}


Drink iceSugarXDrink = new Ice(new Sugar(new XDrink()));
System.out.println(iceSugarXDrink.make());

這是一杯X牌飲料, 加一份糖, 加一份冰

裝飾者模式就是用來動態的給對象加上額外的職責.
Drink是被裝飾的對象, Stuff作爲裝飾類, 可以動態地給被裝飾對象添加特徵, 職責.

注意:
Builder模式是一種創建型的設計模式. 旨在解決對象的差異化構建的問題.
裝飾者模式是一種結構型的設計模式. 旨在處理對象和類的組合關係.
構建者模式的情況通常是可以預見的,但是裝飾者可以通過增加類 而不是修改原本的構建類這種方式,所以構建者模式通常用於一些參數不可預見的情況

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章