美文网首页
<<设计模式之禅(第二版)>>——第二十

<<设计模式之禅(第二版)>>——第二十

作者: leiiiooo | 来源:发表于2016-10-21 09:51 被阅读39次
    定义:
    • 定义对象之间一种一对多的依赖关系,使得每当一个对象状态改变状态,则所有依赖于它的对象都会得到通知并被自动更新。
    通用类图:
    观察者模式通用类图
    public abstract class Subject {
      // 定义一个观察者数组
      private Vector<Observer> observers = new Vector<>();
    
      void addObserver(Observer observer) {
        this.observers.add(observer);
      }
    
      void delObserver(Observer observer) {
        this.observers.remove(observer);
    
      }
    
      void nitifyObservers() {
        for (Observer observer : observers) {
            observer.update();
        }
      }
    }
    
    public class ConcreteSubject extends Subject {// 使用java中已经定义过的Observable
      // 处理自己相关的业务信息
      public void doSomething() {
        super.nitifyObservers();
    
      }
    }
    public interface Observer {
      abstract void update();
    }
    
    public class ConcreteObserver implements Observer {
    
      @Override
      public void update() {
        // TODO Auto-generated method stub
        System.out.println("receive");
      }
    
    }
    public class Client {
      public static void main(String[] args) {
        Observer observer = new ConcreteObserver();
        Subject subject = new ConcreteSubject();
        subject.addObserver(observer);
    
        subject.nitifyObservers();
      }
    }
    
    优点:
    • 观察者和被观察者之间是抽象耦合,而且在java中都已经实现了抽象层级的定义,在系统拓展方面更是得心应手。
    • 建立一套触发机制。
    缺点:
    • 开发过程中需要考虑一下开发效率和运行效率问题,而且在java中消息的通知默认是顺序执行的,一个观察者卡壳,会影响整体的运行效率(这种情况下通常采用的是异步的方式)。
    注意事项的问题:
    • 广播链的问题:根据经验在一个观察者模式中,最多出现一个对象既是观察者也是被观察者,也就是说消息最多被转发一次(传递两次),ps:和责任链模式的最大区别就是,观察者广播链在传播的过程中,消息是随时改变的,它是由相邻的两个节点协商的消息结构,而责任链模式在消息的传递过程中基本上保持消息不可变,如果要改变也只是在原有的消息上进行修正。

    • 异步问题:线程安全和队列的问题

    观察者模式的拓展:

    java.util.Observable
    java.util.Observer

    public class Subject extends Observable {
      public void doSomethingOne() {
        setChanged();
    
        // 只有在setChange()被调用后,notifyObservers()才会去调用update(),否则什么都不干。
        notifyObservers();
      }
    
      public void doSomethingTwo() {
        setChanged();
    
        // 只有在setChange()被调用后,notifyObservers()才会去调用update(),否则什么都不干。
        notifyObservers();
      }
    
    }
    public class DemoObserver implements Observer {
    
      @Override
      public void update(Observable o, Object arg) {
        // TODO Auto-generated method stub
        System.out.println("receive -->");
      }
    
    }
    public class Client {
      public static void main(String[] args) {
        Subject subject = new Subject();
        Observer observer = new DemoObserver();
        subject.addObserver(observer);
        
        subject.doSomethingOne();
        subject.doSomethingTwo();
      }
    }

    相关文章

      网友评论

          本文标题:<<设计模式之禅(第二版)>>——第二十

          本文链接:https://www.haomeiwen.com/subject/emcquttx.html