上次学习了单例模式(点击进入:单例模式),今天趁空学习了一下观察者模式;

观察者模式定义了一种一对多的依赖关系, 让多个观察者对象同时监听某一个主题对象。这个主题对象在状态上发生变化时,会通知所有观察者对象,让他们能够自动更新自己。 

在观察者模式中,有抽象主题角色(Subject),具体主题角色(ConcreteSubject),抽象观察者角色(Observer),具体观察者角色(ConcreteObserver)

     ①:抽象主题角色(Subject)可以把所有观察者对象的应用保存在集合当中,一个主题可以有任意数量的观察者对象。抽象主题角色可以提供一个接口,里面有添加,删除角色的方法,还有一个通过观察者角色的方法;

     ②:具体主题角色(ConcreteSubject):当主题角色发生改变时候,会给所有已经注册过的观察者对象发送通知

     ③:抽象观察者角色(Observer):定义一个接口,在得到主题角色的通知的时候,可以自动的更新自己.

     ④:具体观察者角色(ConcreteObserver)这个角色去实现更新自己。

 看下观察者模式的类的UML图:

 设计模式学习笔记(二)之观察者模式(Observer)_android

        ①: 创建一个Subject接口,里面有三个方法分别是addObserver,removeObserver,notifyObserver,

            创建一个Observer接口,里面有个更新自己的方法update();

        ②: 创建ConcreteSubject实现Subject接口,相应实现里面的方法,把观察者对象注册进来;当时主题角色发生状态改变的时候,去调用notifyObserver()方法来给已经注册的观察者进行通知,然后观察者来自己更新自己.

        ③:创建ConcreterObserver实现Observer接口,当观察者接受到主题角色发的通知,自己调用update()更新自己.


        接下来我们自己来模拟一个观察者模式(Observer)[其中涉及到2个接口,2个实现类,还有1个测试类]

      1:Subject接口

package com.jiangqq.observer;  /**  * 抽象主题角色  * @author jiangqq  *  */ public interface Subject { 	/** 	 * 注册添加观察者 	 * @param observer 	 */       public void addObserver(Observer observer);       /**        * 刪除观察者        * @param observer        */       public void removeObserver(Observer observer);       /**        * 对已经注册的观察者对象发送通知        * @param observer        */       public void notifyObserver(String str); } 
      2:具体主题角色ConcreteSubject

package com.jiangqq.observer;  import java.util.ArrayList; import java.util.List;  /**  * 具体主题角色 :主要功能是添加,删除观察者,并且当主题角色内部状态发生改变的时候,来通知观察者  * @author jiangqq  *  */ public class ConcreteSubject implements Subject {     List<Observer> list=new ArrayList<Observer>();     	@Override 	public void addObserver(Observer observer) { 		list.add(observer);  	}  	@Override 	public void removeObserver(Observer observer) { 		list.remove(observer);  	}  	@Override 	public void notifyObserver(String str) { 	    for(Observer  observer:list) 	    { 	    	observer.update(str); 	    }  	}  } 
       3:抽象观察者角色(Observer)
  
package com.jiangqq.observer;  /**  * 抽象观察者角色  * @author jiangqq  *  */ public interface Observer { 	/** 	 * 当观察者接受到主题发来的通知,自动调用update()来更新自己 	 */    public void update(String str); } 
        4:具体观察者角色(ConcreteObserver)

package com.jiangqq.observer;  public class ConcreteObserver implements Observer {  	@Override 	public void update(String str) { 	   System.out.println("收到的信息是:"+str); 	} } 
          5:测试类

package com.jiangqq.test;  import com.jiangqq.observer.ConcreteObserver; import com.jiangqq.observer.ConcreteSubject; import com.jiangqq.observer.Observer; import com.jiangqq.observer.Subject;  public class TestCustomObserver {         public static void main(String[] args) { 			Subject sub=new ConcreteSubject(); 		 			Observer ob1=new ConcreteObserver(); 			Observer ob2=new ConcreteObserver(); 			Observer ob3=new ConcreteObserver(); 			//注册三个观察者,模拟当主题角色发送通知,三个观察者更新自己 			sub.addObserver(ob1); 			sub.addObserver(ob2); 			sub.addObserver(ob3); 			 			sub.notifyObserver("今天天氣很好..."); 			//移除一個观察者 			sub.removeObserver(ob1); 			sub.notifyObserver("今天天氣不好..."); 			 		} } 

    运行结果:

  设计模式学习笔记(二)之观察者模式(Observer)_android_02

 

 

         

 

    源代码下载链接:http://download.csdn.net/detail/jiangqq781931404/4091471