<十>读<<大话设计模式>>之观察者模式


        观察者模式也是比較简单的一种模式,可能从名字上理解无法明确,但真正理解其含义之后就非常easy了,说实话在自己来发的项目中自己也用到过。仅仅只是不知道它叫观察者罢了,仅仅要懂面向对象的对继承多态理解非常深的,玩观察者模式非常任意就能用到项目中去。

       这本书用一个非常形象的故事解释了观察者模式,故事情景:公司员工当老板不在时有的炒股有的看NBA,为了防止老板偷袭,让前台MM通知。即前台MM充当了观察者,而员工属于详细的实例对象了。我们要编写的代码就是MM作为通知类,员工作为被通知者,

观察者模式:定义了一种一对多的依赖关系。让多个观察者对象同事监听某一个主题对象。

这个主题对象在状态发生变化时。会通知全部观察者对象,使它们可以自己主动更新自己。

怎样实现呢?请看代码吧

1、观察者接口(定义全部观察者的属性,在此不一定就是前台MM通知)

/**

 * @author jzhf 

 * 2014-10-31

 * 通知类

 */

public interface Subject {

 

   public abstract void add(Observer observer);

   public abstract void notifyEveryOne();

   public final String message = "老板来了";

}

2、前台MM继承观察者接口(由于它要把风)

/**

 * @author jzhf 

 * 2014-10-31

 * 秘书通知大家老板来了

 */

public class Secretary implements Subject{

 

   private List<Observer> list = new ArrayList<Observer>();

  

   /* (non-Javadoc)

    * @seecom.test.model.observer.Subject#notifyEveryOne()

    * 通知每个人

    */

   public void notifyEveryOne(){

      // TODO Auto-generatedmethod stub

      for(Observer observer : list){

        observer.Update();

      }

   }

 

   /* (non-Javadoc)

    * @seecom.test.model.observer.Subject#add(com.test.model.observer.Observer)

    */

   public void add(Observer observer) {

      // TODO Auto-generatedmethod stub

      list.add(observer);

   }

}

3、另一个通知大家的就是老板了(老板来了直接对他们说别玩了工作吧),和前台类一样,在此略(仅仅是类名不同而已,本人定义的类名是Boss)

4、開始定义详细类了。有的员工在看股票。有的看NBA,所以要用抽象类定义共同的动作了。

/**

 * @author jzhf 

 * 2014-10-31

 * 对观察者即工作时间玩其它的人的抽象类

 */

public abstract class Observer {

 

   public String name;

   public Subject sub;

  

   public Observer(String name,Subject sub){

      this.name = name;

      this.sub = sub;

   }

  

   public abstract void Update();

}

5、看股票的

/**

 * @author jzhf 

 * 2014-10-31

 */

public class StockObserver extends Observer{

 

   public StockObserver(String name,Subject sub){

      super(name, sub);

   }

  

   /* (non-Javadoc)

    * @seecom.test.model.observer.Observer#Update()

    */

   @Override

   public void Update() {

      // TODO Auto-generatedmethod stub

      System.out.print(sub.message+this.name+"关闭股票行情,继续工作");

   }

}

6、看NBA的

/**

 * @author jzhf 

 * 2014-10-31

 */

public class NBAObserver extends Observer{

 

   public NBAObserver(String name,Subject sub){

      super(name, sub);

   }

  

   /* (non-Javadoc)

    * @seecom.test.model.observer.Observer#Update()

    */

   @Override

   public void Update() {

      // TODO Auto-generatedmethod stub

      System.out.println(sub.message+this.name+"关闭NBA。继续工作");

   }

}

7、client

/**

 * @author jzhf 

 * 2014-10-31

 */

public class ObserverClient {

 

   /**

    * @param args

    */

   public static void main(String[] args) {

      // TODO Auto-generatedmethod stub

     

      //秘书通知

      Subject sub = new Secretary();

      Observer observer = new StockObserver("老李", sub);

      sub.add(observer);

     

      Observer observer2 = new NBAObserver("老王", sub);

      sub.add(observer2);

     

      sub.notifyEveryOne();

     

      //老板通知

      Subject sub2 = new Boss();

      Observer observer3 = new StockObserver("老李", sub);

      sub2.add(observer3);

     

      Observer observer4 = new NBAObserver("老王", sub);

      sub2.add(observer4);

     

      sub2.notifyEveryOne();

   }

}

        假设你看完程序我相信你已经理解了观察者模式了。观察者模式所做的工作事实上就是解除耦合,让耦合的两方都依赖于抽象。而不是依赖于详细。

从而使得各自的变化都不会影响还有一边的变化。

附上观察者模式结构图


总结:当一个对象的改变须要同一时候改变其它对象的时候,并且它不知道详细有多少对象有待改变时,应该考虑使用观察者模式。当系统中一个对象依赖于还有一个对象,这时用观察者模式能够将这两个封装在独立的对象中使用它们各自独立地改变和复用。

原文地址:https://www.cnblogs.com/brucemengbm/p/7280000.html