觀察者設計模式:索拉卡的R技能
阿新 • • 發佈:2018-12-22
觀察者模式:在物件之間定義一對多的依賴,這樣以來,當一個物件改變狀態,依賴它的物件都會收到通知,並自動更新。
設計原則:
- 為互動物件之間的鬆耦合設計而努力
舉例說明
場景:LOL中有一個英雄名字叫索拉卡,當這個英雄釋放R技能時,會使其隊友回血。
需求:實現當索拉卡執行R技能時,給隊友回血。
1.定義一個被觀察的介面Observable(也叫主題:Subject),並讓索拉卡實現此介面
- 新建subject介面
-
/** * 主題介面 * * @author jsk * @Date 2018/11/17 13:41 */ public interface Subject { /** * 註冊觀察者 * * @param o */ void registerObserver(Observer o); /** * 移除觀察者 * * @param o */ void removeObserver(Observer o); /** * 通知觀察者 */ void notifyObservers(); }
- 新建索拉卡實體類
-
/** * 眾星之子 索拉卡 * * @author jsk * @Date 2018/11/17 13:49 */ public class Soraka implements Subject { private List<Observer> observerList = new ArrayList<>(); @Override public void registerObserver(Observer o) { observerList.add(o); } @Override public void removeObserver(Observer o) { observerList.remove(o); } @Override public void notifyObservers() { for (Observer observer : observerList) { observer.update(); } } public void executeR() { System.out.println("索拉卡執行R技能,給隊友加血!"); this.notifyObservers(); } }
2.定義一個觀察者介面Observer,並讓英雄實體類Hero實現這個介面。
- 新建觀察者介面Observer
-
public interface Observer { void update(); }
- 新建英雄類Hero
-
/** * 英雄實體類 * * @author jsk * @Date 2018/11/17 13:55 */ public class Hero implements Observer { private String name; public Hero(String name) { this.name = name; } @Override public void update() { System.out.println(name + "開始回血..."); } }
3.執行程式
-
public static void main(String[] args) { // 1.建立三個英雄和索拉卡 Hero Garen = new Hero("蓋倫"); Hero Ashe = new Hero("艾希"); Hero Brand= new Hero("布蘭德"); Soraka soraka = new Soraka(); // 2.把這三個英雄註冊到索拉卡 soraka.registerObserver(Garen); soraka.registerObserver(Ashe); soraka.registerObserver(Brand); // 3.索拉卡執行R技能 soraka.executeR(); }
4.執行結果