zoukankan      html  css  js  c++  java
  • 设计模式-观察者模式

    在现实生活中,一个对象的改变会引起其他许多对象的改变,比如商品降价了,很多人都会开心,明天要下雨,很多人会烦躁等等。在java里就是一对多的依赖关系,当某个对象发生改变时,需要通知所有依赖于他的对象更新。这种模式有的时候也被叫做订阅-发布模式。

    观察者模式有四种角色:抽象主题,具体主题,抽象观察者,具体观察者。

    抽象主题包括一个对观察者增加,删除和通知所有观察者的抽象方法,本身有一个集合用来存放所有的观察者,具体主题实现了通知所有观察者的具体方法。抽象观察者包含了一个更新自己的抽象方法,当接到主题通知时调用,具体观察者实现了这个方法

    抽象主题:

    abstract class Type {
        protected ArrayList<Observer> observers=new ArrayList<>();
        public void add(Observer observer){
            observers.add(observer);
        }
        public void remove(Observer observer){
            observers.remove(observer);
        }
        //通知所有观察者
        public abstract void excute();
    }

    具体主题

    public class ConcreteType extends Type {
        @Override
        public void excute() {
            System.out.println("目标发生改变");
            for (Observer observer : observers) {
               observer.reponse();
            }
        }
    }

    抽象观察者

    public interface Observer {
        void reponse();
    }

    具体观察者1

    public class ConcreteObserver1 implements Observer {
        public void reponse(){
            System.out.println("观察者1收到");
        }
    }

    具体观察者2

    public class ConcreteObserver2 implements Observer {
    
        @Override
        public void reponse() {
            System.out.println("观察者2收到");
        }
    }

    测试类

    public class Client {
        public static void main(String[] args) {
            ConcreteType concreteType = new ConcreteType();
            concreteType.add(new ConcreteObserver1());
            concreteType.add(new ConcreteObserver2());
            concreteType.excute();
        }
    }

    总结:每个主题负责管理对应的的观察者,当主题自身发生改变时,可以通知对应的所有观察者让他们做出响应/更新。

    应用场景:当一个对象发生改变会影响其他许多对象时可以使用观察者模式,其他与这个对象有关的对象放到一个List里,此对象发生改变时调用自身方法通知所有和自身有关的其他对象。

    不和别人一样,不复制只真正理解
  • 相关阅读:
    Vijos训练计划 1304回文数
    18.03.03 位运算作业三则
    18.03.01 codevs1014 装箱问题
    Wikioi 1020 孪生蜘蛛 Label:Floyd最短路
    TYVJ P1004 滑雪 Label:记忆化搜索
    洛谷 P1118 数字三角形游戏 Label:dfs
    TYVJ P1015 公路乘车 &&洛谷 P1192 台阶问题 Label:dp
    洛谷 P1147 连续自然数和 Label:等差数列
    洛谷 P1019 单词接龙 Label:dfs
    洛谷 P1025 数的划分 Label:dp
  • 原文地址:https://www.cnblogs.com/Vinlen/p/12794607.html
Copyright © 2011-2022 走看看