設計模式系列:行爲型設計模式

行爲型模式(11種):

策略模式、模板方法模式、觀察者模式、迭代子模式、責任鏈模式、命令模式、

備忘錄模式、狀態模式、訪問者模式、中介者模式、解釋器模式。

 

什麼是行爲模式:

行爲模式就是封裝一段操作,例如策略模式,只用在方法中傳入參數1和2,可以得出3,也可以得出2,這之中操作就是行爲

 

策略模式

對某一行爲進行抽象化
public interface Handle {
    int doSomething(int a,int b);
}
具體化的內容是策略的具象
public class Say1 implements Handle{
    @Override
    public int doSomething(int a,int b) {
        return (a*b);
    }
}
public class Say2 implements Handle{
    @Override
    public int doSomething(int a,int b) {
        return (a+b);
    }
}
對行爲進行封裝
這段代碼和簡單代理模式很像,講解下其中的困惑點

簡單代理模式中,代理類知道被代理類的行爲,
因爲代理類與被代理類 *實現同一個接口*,因此代理類與被代理類的結構是相同的;
 
而策略模式中,策略容器並不知道內部策略的詳細信息,
因爲容器並沒有實現與內部策略相同的接口,即容器與內部策略只是簡單的組合關係,
容器只是將內部策略的行爲抽取出來,進行了統一的實現
public class HandleStrategy {
    private Handle h;
    private HandleStrategy() {}
    public HandleStrategy(Handle h) {
        this.h = h;
    }
    public int doSomething(int a,int b) {
        h.doSomething(a+b);
    }
}
調用
public class DoMain {
    public static void main(String[] args) {
        HandleStrategy hs1 = new HandleStrategy(new Say1());
        hs1.doSomething(1,1);
		
        HandleStrategy hs2 = new HandleStrategy(new Say2());
        hs2.doSomething(1,1);
    }
}

 

模板方法模式

建立一個模板
public abstract class Game {
    public abstract  void doSomething1();
    public abstract  void doSomething2();
    public abstract  void doSomething3();
    這裏定義了模板,final修飾是關鍵
    public final void doSomethings() {
        doSomething1();
        doSomething2();
        doSomething3();
    };
}
模板實現
public class SayGame extends Game{
    public void doSomething1() {
        System.out.println("1");
    }
    public void doSomething2() {
        System.out.println("2");
    }
    public void doSomething3() {
        System.out.println("3");
    }
}
調用
public class DoMain {
    public static void main(String[] args) {
        Game g = new SayGame();
        g.doSomethings();
    }
}

 

備忘錄模式

*** 意圖:在不破壞封裝性的前提下,捕獲一個對象的內部狀態,並在該對象之外保存這個狀態 ***


備忘錄模式分爲三個部分 : 狀態,操作,狀態倉庫

狀態,就是模擬封裝中的狀態
狀態
public class Status {
    private String status;
    private Status() {}
    public Status(String status) {
        this.status = status;
    }
    public String getStatus() {
        return status;
    }
}

猜測:之所以把操作和倉庫解耦分開爲兩個對象,可能是這塊可能有不同形式的重寫
    例如這裏的status是String類型,其他狀態可能是自定義類型,
    如果不解耦每次重寫都會重寫倉庫部分
操作
public class Handle {
    private String status;
    public Handle() {}
    public void setStatus(String status) {
        this.status = status;
    }
    public String getStatus() {
        return status;
    }
    public Status createStatusObj() {
        return new Status(status);
    }
    public String getStatusAttr(Status status) {
        return status.getStatus();
    }
}

狀態倉庫
public class StatusWarehouse {
    private List<Status> list = null;
    public StatusWarehouse() {
        list = new ArrayList<Status>();
    }
    public void add(Status status) {
        this.list.add(status);
    }
    public String getStatusContentForIndex(Integer i) {
        return this.list.get(i).getStatus();
    }
}

測試
public class DoMain {
    public static void main(String[] args) {
        StatusWarehouse sw = new StatusWarehouse();
        Handle h = new Handle();
        h.setStatus("1");
        sw.add(h.createStatusObj());
        h.setStatus("2");
        sw.add(h.createStatusObj());
        System.out.println(sw.getStatusContentForIndex(0));
        System.out.println(sw.getStatusContentForIndex(1));
    }
}

 

狀態模式

*** 意圖:允許對象在內部狀態發生改變時改變它的行爲,對象看起來好像修改了它的類。 ***


定義狀態
public interface Status {
    void setStatus(StatusMap status);
}

具體化狀態
public class DoSomethingStatus implements Status{
    public DoSomethingStatus() {}
    @Override
    public void setStatus(StatusMap sMap) {
        this.doSomething();
        sMap.setStatus(this);
    }
    private void doSomething() {
        System.out.println("do something");
    }
    public String toString(){
        return "1";
    }
}

狀態容器
public class StatusMap {
    private Status status;
    public StatusMap() {}
    public void setStatus(Status status) {
        this.status = status;
    }
    public Status getStatus() {
        return status;
    }
}

調用
public class DoMain {
    public static void main(String[] args) {
        StatusMap sm = new StatusMap();
        DoSomethingStatus dss = new DoSomethingStatus();
        dss.setStatus(sm);
        System.out.println(sm.getStatus());
    }
}

待補充

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