设计模式——观察者模式(Observer Pattern)

观察者模式:

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

观察者的工作原理:

1、被观察者持有一个能动态添加/删除观察者的数据结构,如List等

2、将对被观察者状态感兴趣的观察者对象,调用register方法将观察者注册为被观察者的一个观察者,即添加到List中。

3、每当被观察者的状态发生变化时,都会调用自身的notifyObserver方法来通知已经注册的观察者对象。

4、当观察者接到通知后,每个观察者都将查询被观察者的状态,以便保持状态同步。更新操作视具体的观察者而定。


观察者模式的构成:


观察者模式UML类图

1、Obervable:被观察者接口,定义了三个必须的方法。register注册观察者,unregister注销观察者,notifyObserver通知已注册的观察者。

2、Observer:观察者接口,说明观察者的必要方法。

3、ConcreteObservable:具体的被观察者类,持有存储的Observer子类的数据结构ArrayList。

4、ConcreteObserver:具体的观察者类。


观察者模式的代码演示:

/**
 * 被观察者接口 定义一些基本方法
 * @author 矢的丶飞跃
 *
 */
public interface Observable {
	public void register(Observer o);//注册观察者
	public void unRegister(Observer o);//注销观察者
	public void notifyObserver(String newState);//通知观察者状态变化
}

/**
 * 观察者接口 
 * @author 矢的丶飞跃
 *
 */
public interface Observer {
	public void updateState(String newState);//供被观察者调用
}

import java.util.ArrayList;

/**
 * 具体的被观察者
 * @param state    更新的状态
 * @param observerList    保存观察者对象
 * @author 矢的丶飞跃
 *
 */
public class ConcreteObservable implements Observable {
	public String state;
	public ArrayList<Observer> observerList = new ArrayList<Observer>(0);
	
	public void register(Observer o) {
		observerList.add(o);
		System.out.println("添加成功");
	}
	
	public void unRegister(Observer o) {
		observerList.remove(o);
	}
	
	public void changeState(String state) {
		this.state = state;
		System.out.println("change ConcreteObservable State:" + state);
		notifyObserver(state);
	}
	
	public void notifyObserver(String newState) {
		for(Observer o:observerList){
			o.updateState(newState);
		}
	}
	
}

/**
 * 具体的观察者
 * @author 矢的丶飞跃
 *
 */
public class ConcreteObserver implements Observer {
	
	public String observerState;
	
	public void updateState(String newState) {
		this.observerState = newState;
		System.out.println("change ConcreteObserver State:" + oberverState);
	}
}

/**
 * 测试类
 * @author 矢的丶飞跃
 *
 */
public class Client {

	public static void main(String[] args) {
		//创建被观察者
		ConcreteObservable observable = new ConcreteObservable();
		//创建观察者
		ConcreteObserver observer = new ConcreteObserver();
		//添加观察者对象
		obervable.register(observer);
		//将obervable的状态改为State1
		System.out.println("\n将obervable的状态改为State1");
		obervable.changeState("State1");
		//将obervable的状态改为State2
		System.out.println("\n将obervable的状态改为State2");
		obervable.changeState("State2");
	}

}

运行结果:


推模型和拉模型

  在观察者模式中,又分为推模型和拉模型两种方式。

                 推模型:主题对象向观察者推送主题的详细信息,不管观察者是否需要,推送的信息通常是主题对象的全部或部分数据。(如上例)

                 拉模型: 主题对象在通知观察者的时候,只传递少量信息。如果观察者需要更具体的信息,由观察者主动到主题对象中获取,相当于是观察者从主题对象中拉数据。一般这种模型的实现中,会把主题对象自身通过update()方法传递给观察者,这样在观察者需要获取数据的时候,就可以通过这个引用来获取了。






  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值