1. 程式人生 > >觀察者設計模式:索拉卡的R技能

觀察者設計模式:索拉卡的R技能

觀察者模式在物件之間定義一對多的依賴,這樣以來,當一個物件改變狀態,依賴它的物件都會收到通知,並自動更新。

設計原則:

  • 為互動物件之間的鬆耦合設計而努力

舉例說明

場景: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.執行結果