Java设计模式----观察者模式(Observer)

1.  观察者模式: 

     观察者模式,也叫发布/订阅模式,定义如下:

     定义对象之间的一种一对多的依赖关系,使得每当一个对象的状态改变时,多有依赖于它的对象都能及时得到通知并被自动更新

2.  观察者模式的相关角色介绍:

     a、 抽象被观察者角色 

     定义被观察者必须实现的职责,它必须能够动态地添加和取消观察者,一般由抽象类构成。仅完成被观察者的职责:管理观察者并通知观察者

     b、 具体被观察者角色

     定义被观察者自己的业务逻辑,同时定义对那些事件发出通知

     c、 抽象的观察者角色

     观察者接收到消息之后进行update操作,即对收到的信息进行处理

     d、 具体的观察者角色

     每个观察者接收到消息之后处理的反应不同,每个观察者都有自己的处理逻辑

3.   观察者模式通用示例代码:

抽象被观察者类:

/**
 * 抽象主题角色类,也称为抽象主题被观察者
 * @author zqkj001
 *
 */
public abstract class Subject {
    
	
	/**
	 * 用来保存注册的注册的观察者对象
	 */
	private List<Observer> list=new ArrayList<Observer>();
	
	
	/**
	 * 注册观察者对象到list
	 * @param ob
	 */
	public void attach(Observer ob){
		list.add(ob);
		System.out.println("attach an observer..");
	}
	
	/**
	 * 删除观察者对象
	 * @param ob
	 */
	public void detach(Observer ob){
		list.remove(ob);
	}
	
	/**
	 * 通知所有注册的观察者对象
	 * @param newState
	 */
	public void notifyObservers(String newState){
		
		for (Observer ob : list) {
			 ob.update(newState);
		}
	}
}
具体被观察者类:

/**
 * 具体主题角色类/具体主题被观察者类
 * @author zqkj001
 *
 */
public class ConcreteSubject extends Subject {
      
	private String state;

	public String getState() {
		return state;
	}
	
	public void change(String newState){
		this.state=newState;
		System.out.println("主题状态更改为:"+this.state);
		//状态发生改变,通知各个观察者
		super.notifyObservers(this.state);
	}
}
抽象观察者类

/**
 * 抽象观察者角色类
 * @author zqkj001
 *
 */
public interface Observer {
    
	/**
	 * 更新接口
	 * @param newState
	 */
	public void update(String newState);
}
具体观察者类

/**
 * 具体观察者角色类
 * @author zqkj001
 *
 */
public class ConcreteObserver implements Observer {
    
	private String observerState;
	
	@Override
	public void update(String newState) {
		//更新观察者状态,使其与目标状态一致
		this.observerState=newState;
        System.out.println("状态为:"+this.observerState);
	}

}
测试类:

public class Client {
    
	public static void main(String[] args) {
		
		//创建主题对象(被观察者)
		ConcreteSubject subject=new ConcreteSubject();
		
		//创建观察者对象
		Observer observer=new ConcreteObserver();
		
		//将观察者绑定到主题对象(被观察者)上
		subject.attach(observer);
		
		//改变主题对象(被观察者)的状态 
		subject.change("a new State");
	}
}

4. 示例代码对应的类图:


5. JDK对观察者模式的支持:

  JDK中提供了:java.util.Observable实现类和java.util.Observer接口,上面的代码中的一个抽象被观察者类和观察者接口可以分别用这2个替换。

  JDK调用示例:

public class ConcreteSubject1 extends Observable {
     
	public void operator(){
		super.setChanged();
		super.notifyObservers("改变了");
	}
}
public class ConcreteObserver1 implements Observer {

	@Override
	public void update(Observable ob, Object str) {
		
		System.out.println("观察者接收到状态:"+str);
         
	}

}
public class Test {
   
	public static void main(String[] args) {
		
		ConcreteSubject1 ob=new ConcreteSubject1();
		Observer observer=new ConcreteObserver1();
		
		ob.addObserver(observer);
		
		ob.operator();
		
	}
}








     


posted @ 2015-10-29 15:36  无羁之风  阅读(196)  评论(0编辑  收藏  举报