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

    概论

    什么是观察者模式呢?观察者模式也叫发布订阅模式。定义对象间一种一对多的依赖关系,是的每当一个对象改变了状态,则所有依赖于它的对象都会得到通知并且自动更新。

    观察者模式示例

    首先我们定义一个抽象的观察者:

    1 public interface Observer {
    2 
    3     public void update();
    4 }

    一般定义为接口,第3行,提供一个接口用于接收被观察者的动态。我们再增加一个具体的观察者:

    1 public class ConcreateObserver implements Observer {
    2 
    3     @Override
    4     public void update() {
    5         System.out.println("接受到被观察者的通知,并且处理");
    6     }
    7 }

    我们定义一个抽象的被观察者。被观察者的职责是能够动态的增加观察者和删除观察者,并且行为的改变能够通知所有的观察者。增加和删除这两个动作我们叫做管理。于是抽象的被观察者的责任就是管理观察者,同时及时把动态通知观察者。

     1 public abstract class AbstractSubject {
     2 
     3     private List<Observer> observers = new ArrayList<Observer>();
     4 
     5     public abstract void proccess();
     6 
     7     public void add(Observer observer) {
     8         if(observer == null) {
     9             return;
    10         }
    11 
    12         this.observers.add(observer);
    13     }
    14 
    15     public void remove(Observer observer) {
    16         this.observers.remove(observer);
    17     }
    18 
    19     public void notifyObservers() {
    20 
    21         observers.forEach(item -> {
    22             item.update();
    23         });
    24 
    25     }
    26 
    27 
    28 }

    第3行,定义一个集合用来存储订阅的观察者。

    第7行-14行,增加一个观察者。

    第15行-17行,删除一个观察者。

    第19行-25行,通知所有的观察者。

    再来看看具体的被观察者:

    1 public class ConcreateSubject extends AbstractSubject {
    2 
    3     @Override
    4     public void proccess () {
    5         System.out.println("执行业务逻辑....");
    6         super.notifyObservers();
    7     }
    8 }

    第5行,执行具体的业务逻辑。

    第6行,被观察者的业务发生了变化,需要通知所有的观察者。调用父类的方法。

    最后我们增加一个场景类Client:

     1 public class Client {
     2 
     3     public static void main(String[] args) {
     4         AbstractSubject subject = new ConcreateSubject();
     5         Observer observer = new ConcreateObserver();
     6 
     7         subject.add(observer);
     8         subject.add(observer);
     9 
    10         subject.proccess();
    11     }
    12 }

    我们先执行一下结果:

    执行业务逻辑....
    接受到被观察者的通知,并且处理
    接受到被观察者的通知,并且处理

    观察者模式的优缺点

    1.观察者和被观察者之间是抽象耦合。

    2.建立一套触发机制。

    观察者较多时,容易造成阻塞,因此可以采用异步的方式通知。

  • 相关阅读:
    设置debian6源
    debian7编译安装tengine添加lua和ldap模块
    elasticsearch5使用snapshot接口备份索引
    logstash5生成init脚本后台启动
    Xpack集成LDAP
    debian安装filebeat5.5收集nginx日志
    kibana5画图
    安装Xtrabackup,设置定时备份msyql数据库
    编译安装nrpe,配置监控mysql端口和主从状态
    编译安装keepalived,实现双主mysql高可用
  • 原文地址:https://www.cnblogs.com/sunshine798798/p/10084546.html
Copyright © 2011-2022 走看看