案例分析:设计模式与代码的结构特性

观察者模式

  观察者模式(又被称为发布-订阅(Publish/Subscribe)模式,属于行为型模式的一种,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态变化时,会通知所有的观察者对象,使他们能够自动更新自己。

案例分析:设计模式与代码的结构特性

   引用关键代码(引用代码是为解释说明服务的,不要贴对解释问题无关的代码)解释该设计模式在该应用场景中的适用性;

创建 Subject 类

 1 import java.util.ArrayList;
 2 import java.util.List;
 3  
 4 public class Subject {
 5    
 6    private List<Observer> observers 
 7       = new ArrayList<Observer>();
 8    private int state;
 9  
10    public int getState() {
11       return state;
12    }
13  
14    public void setState(int state) {
15       this.state = state;
16       notifyAllObservers();
17    }
18  
19    public void attach(Observer observer){
20       observers.add(observer);      
21    }
22  
23    public void notifyAllObservers(){
24       for (Observer observer : observers) {
25          observer.update();
26       }
27    }  
28 }

创建 Observer 类。

1 public abstract class Observer {
2    protected Subject subject;
3    public abstract void update();
4 }

创建实体观察者类。

 1 public class Observer_1 extends Observer{
 2  
 3    public Observer_1(Subject subject){
 4       this.subject = subject;
 5       this.subject.attach(this);
 6    }
 7  
 8    @Override
 9    public void update() {
10       System.out.println( "Observer_1: " 
11       + subject.getState()); 
12    }
13 }
public class Observer_2 extends Observer{
 
   public Observer_2(Subject subject){
      this.subject = subject;
      this.subject.attach(this);
   }
 
   @Override
   public void update() {
     System.out.println( "Observer_2: " 
     + subject.getState() ); 
   }
}
public class Observer_3 extends Observer{
 
   public Observer_3(Subject subject){
      this.subject = subject;
      this.subject.attach(this);
   }
 
   @Override
   public void update() {
      System.out.println( "Observer_3: " 
      + subject.getState() ); 
   }
}

使用 Subject 和实体观察者对象。

 

public class ObserverPatternDemo {
   public static void main(String[] args) {
      Subject subject = new Subject();
 
      new Observer_1(subject);
      new Observer_2(subject);
      new Observer_3(subject);
 
      System.out.println("First state change: 15");   
      subject.setState(15);
      System.out.println("Second state change: 10");  
      subject.setState(10);
   }
}

执行程序,输出结果:

1 First state change: 15
2 Observer_1: 15
3 Observer_2: 15
4 Observer_3: 15
5 Second state change: 10
6 Observer_1: 10
7 Observer_2: 10
8 Observer_3: 10

  

  引入该设计模式后对系统架构和代码结构带来了哪些好处;

  观察者模式的主要优点在于可以实现表示层和数据逻辑层的分离,可以实现动态的增加和删除观察者;并在观察目标和观察者之间建立一个抽象的耦合,支持广播通信。其主要缺点在于如果一个观察目标对象有很多直接和间接的观察者的话,将所有的观察者都通知到会花费很多时间,而且如果在观察者和观察目标之间有循环依赖的话,观察目标会触发它们之间进行循环调用,可能导致系统崩溃。

 

  解释其中用到的多态机制

  每一个实体观察者类中都独立实现了update()这个函数,使得每一个对象可以在得到广播消息后根据自己的情况进行更新操作。

 

  使用场景

  1、当一个抽象模型有两个方面,其中一个方面依赖于另一方面。将这二者封装在独立的对象中以使它们可以各自独立地改变和复用。

  2、当对一个对象的改变需要同时改变其他对象,而不知道具体有多少对象需要被改变。
  3、当一个对象必须通知其他对象,而它又不能假定其他对象是谁。换言之,不希望这些对象是紧密耦合的。

  主要解决:一个对象状态改变给其他对象通知的问题,而且要考虑到易用和低耦合,保证高度的协作。
  何时使用:一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知,进行广播通知。
  如何解决:使用面向对象技术,可以将这种依赖关系弱化。
  关键代码:在抽象类里有一个 ArrayList 存放观察者们。
  应用实例: 1、拍卖的时候,拍卖师观察最高标价,然后通知给其他竞价者竞价。 2、西游记里面悟空请求菩萨降服红孩儿,菩萨洒了一地水招来一个老乌龟,这个乌龟就是观察者,他观察菩萨洒水这个动作。

  https://github.com/jingjinduo/-/blob/master/observer.java

上一篇:观察者模式


下一篇:观察者模式