聊一聊設計模式(四)-- 行爲型設計模式

前言

講完告終構型設計模式,接下里就是行爲型設計模式了。java

思惟導圖

策略模式

定義一系列的算法,把每個算法封裝起來,而且使它們可相互替換。git

在初中寫關於多邊形的題目的時候,咱們可能經過已知方法硬生生解答出來,也有可能用輔助線來幫助咱們解題。這就是兩種解題策略。 下面用代碼體現一下。github

/** * 上下文 * 根據傳入策略給出解決方法 */
public class Context {
    private Strategy strategy;
    Context(Strategy strategy){
        this.strategy = strategy;
    }

    void solve(){
        strategy.solve();
    }
}

/** * 兩種策略方法 * 1. 輔助線法 * 2. 硬答 */
public class SoftStrategy implements Strategy {
    @Override
    public void solve() {
        System.out.println("輔助線解答");
    }
}

public class HardStrategy implements Strategy {
    @Override
    public void solve() {
        System.out.println("硬生生解答");
    }
}

/** * 抽象策略角色 */
public interface Strategy {
    void solve();
}
複製代碼

根據不一樣的策略往上下文角色裏傳入對象,就能獲得具體的實現方法。算法

模版方法模式

定義一個操做中的算法框架,而將一些步驟延遲到子類中,使得子類不改變一個算法的結構便可重定義算法的某些特定步驟。設計模式

模版方法模式中的角色:框架

  1. AbstractClass:抽象類,定義框架。
  2. ConcreteClass:具體實現類
/** * 模版抽象類 * 定義了一套邏輯方法,而子類只負責繼承和完善。 */
public abstract class AbstractPerson {
    public final void wakeup(){
        zhengyan();
        xianbeizi();
        qichuang();
        hook();
    }

    abstract void zhengyan();
    abstract void xianbeizi();
    abstract void qichuang();
    void hook(){}
}

/** * 具體實現類 */
public class Me extends AbstractPerson {
    @Override
    void zhengyan() {
        System.out.println("睜開眼睛");
    }

    @Override
    void xianbeizi() {
        System.out.println("掀被子");
    }

    @Override
    void qichuang() {
        System.out.println("起牀");
    }

    @Override
    void hook() {
        super.hook();
        System.out.println("又想睡了");
    }
}
複製代碼

hook()方法,稱爲鉤子方法,兩種實現方式。ide

  1. 在抽象類中是一個空函數,子類視狀況進行覆蓋操做。
  2. boolean做爲返回值的,對某個條件進行斷定。

觀察者模式

定義對象間一種一對多的依賴關係,每當一個對象改變狀態時,則全部依賴於它的對象都會獲得通知並被自動更新。函數

該模式中的角色:工具

  1. Subject:抽象主題
  2. ConcreteSubject:具體主題。
  3. Observer:抽象觀察者。
  4. ConcreteObserver:具體觀察者。
/** * 抽象觀察者類 */
public interface IObserver {
    void update(String message);
}

/** * 抽象主題類 */
public interface ISubject {
    void add(IObserver observer);
    void remove(IObserver observer);
    void notify(String message);
}

/** * 具體觀察者類 */
public class Observer implements IObserver {
    @Override
    public void update(String message) {
        System.out.println(message);
    }
}

/** * 具體主題類 */
public class Subject implements ISubject {
    List<IObserver> list = new ArrayList<>();

    @Override
    public void add(IObserver observer) {
        list.add(observer);
    }

    @Override
    public void remove(IObserver observer) {
        list.remove(observer);
    }

    @Override
    public void notify(String message) {
        for(IObserver observer: list){
            observer.update(message);
        }
    }
}
複製代碼

這個模式聽着優勢奇怪,可是代碼寫起來其實一點都不生疏。其實就是使用主題類保存各個觀察者,出現變化的話就循環遍歷,慢慢通知。post

這個模式在個人Android工具包的Network包中也有使用。

可是這個模式存在一個缺點,由於它是一個個進行通知的,那麼update()函數中是可能存在耗時操做的。這個時候,比較建議的就是開一個子線程去進行處理,這樣在Android中不會對UI線程產生過多的佔用。

以上就是個人學習成果,若是有什麼我沒有思考到的地方或是文章內存在錯誤,歡迎與我分享。


相關文章推薦:

聊一聊設計模式(一)-- 六大原則

聊一聊設計模式(二)-- 建立型設計模式

聊一聊設計模式(三)-- 結構型行爲型設計模式

相關文章
相關標籤/搜索