zoukankan      html  css  js  c++  java
  • 简易的设计模式——观察者模式

    观察者模式(Observer Pattern)也叫做发布订阅模式。

    定义

    定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则依赖于它的对象都会得到通知并被自动更新。

    几种角色

    在观察者模式中有这么几种角色:

    1. Subject被观察者:定义被观察者必须能动态地增加和删除观察者,一般为抽象类。
    2. Observer观察者:观察者接受到消息之后,能对接受到得消息进行处理。
    3. ConcreteSubject具体的被观察者:定义被观察者自己的业务逻辑,同时定义哪些事件需要进行通知。
    4. ConcreteObserver具体的观察者:在接收到消息之后,对消息进行不同的处理。

    代码实现

    观察者 Observer.java

    public interface Observer {
        public void update();
    }
    

    具体的观察者 ConcreteObserver.java

    public class ConcreteObserver implements Observer {
        @Override
        public void update() {
            System.out.println("接收到消息,并进行处理!");
        }
    }
    

    被观察者 Subject.java

    import java.util.Vector;
    
    public abstract class Subject {
    
        //也可以使用ArrayList,ArrayList是线程异步的,不安全。
        private Vector<Observer> obsVector = new Vector<Observer>();
    
        public void addObserver(Observer observer){
            this.obsVector.add(observer);
        }
    
        public void delObserver(Observer observer){
            this.obsVector.remove(observer);
        }
    
        public void notifyObservers(){
            for (Observer observer: this.obsVector ){
                observer.update();
            }
        }
    
    }
    
    

    具体的被观察者 ConcreteSubject.java

    public class ConcreteSubject extends Subject {
        public void doSomething(){
            //do something
            super.notifyObservers();
        }
    }
    

    场景类 Client.java

    public class Client {
        public static void main(String args[]){
    
            ConcreteSubject subject = new ConcreteSubject();
            ConcreteObserver observer = new ConcreteObserver();
    
            subject.addObserver(observer);
            subject.doSomething();
        }
    }
    

    观察者模式的优点

    • 观察者和被观察者之间是抽象耦合

      即使不断增加观察者还是被观察者非常容易扩展

    • 建立一套触发机制

      根据单一职责原则,每个类的职责是单一的,通过一个触发机制,形成触发链。观察者就可以实现这种链式结构。

    观察者模式的缺点

    • 观察者模式需要考虑一下开发效率和运行效率,当形成多级触发的时候,效率会令人担忧。消息的通知可以采用异步的方式进行。
  • 相关阅读:
    安装nginx后启动提示缺少libjemalloc.so.2
    页面刷新后保持滚动条的位置
    mysql的tinyint字段返回布true / false的问题
    MySql处理死锁的解决方案
    apidoc使用记录
    微信公众号开发图片上传案例
    [ Error 分析] Comparison method violates its general contract!
    [intellij]create gradle project
    [重构]读书笔记
    [设计模式]迭代子模式 Iterator
  • 原文地址:https://www.cnblogs.com/whthomas/p/4423011.html
Copyright © 2011-2022 走看看