必须做作业三:XXX项目中观察者模式解析

观察者模式定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新,也就是解决一个对象状态改变给其他对象通知的问题,而且要考虑到易用和低耦合,保证高度的协作。当一个对象的改变需要通知其他对象或者必将引起其他对象的改变时使用就可以考虑使用观察者模式,比如课堂上老师布置一个作业,要通知到选修了这门课的所有学生,每个学生也会根据老师布置的作业完成任务。

代码中的例子建立了不同的观察者,分别对给出的一个数转换成二进制、八进制和十六进制。

代码的uml类图如下:

目标对象是Subject类:成员变量定义了包含观察者对象的列表observers和状态state(一个十进制数),当目标对象的state状态发生改变时就会通知所有观察者对象。

三个观察者对象继承自一个抽象类Observer:三个观察者对象分别实现对目标对象的状态(一个十进制数)转换成二进制、八进制和十六进制数的输出,每当目标对象的state有所改变,他们就会收到通知进行相应的改变。

使用观察者模式的好处是:观察者模式在目标对象和观察者对象之间建立一个抽象的耦合。目标对象建立了一个观察者对象的集合,但是它不需要了解具体的观察者有哪些,它的改变会引起观察者的改变,但它不需要知道具体有哪些观察者发生了改变,发生了怎样的改变,它只需要改变和通知。此外,显而易见观察者模式支持广播通信,目标对象会向所有已注册的观察者对象发送通知,简化了一对多系统设计的难度。 

部分具体代码如下:

目标对象Subject.java

import java.util.ArrayList;
import java.util.List;
 
public class Subject {
   
   private List<Observer> observers 
      = new ArrayList<Observer>();
   private int state;
 
   public int getState() {
      return state;
   }
 
   public void setState(int state) {
      this.state = state;
      notifyAllObservers();
   }
 
   public void attach(Observer observer){
      observers.add(observer);      
   }
 
   public void notifyAllObservers(){
      for (Observer observer : observers) {
         observer.update();
      }
   }  
}

观察者对象Observer.java

public abstract class Observer {
   protected Subject subject;
   public abstract void update();
}

实体观察者BinaryObserver.java

public class BinaryObserver extends Observer{
 
   public BinaryObserver(Subject subject){
      this.subject = subject;
      this.subject.attach(this);
   }
 
   @Override
   public void update() {
      System.out.println( "Binary String: " 
      + Integer.toBinaryString( subject.getState() ) ); 
   }
}

代码源地址:https://github.com/WDK123/learngit

posted @ 2018-10-23 12:52  by135  阅读(212)  评论(0编辑  收藏  举报