设计模式(19)--观察者模式

观察者模式原理很好理解,就是定义一个观察者,一个目标,当目标状态发生改变时,通知观察者,观察者做出相应动作。目标与观察者是一对多的依赖关系。

举个例子:

我们开车,遇到红绿灯,这时候司机就是观察者,目标就是红绿灯,可以有多个司机瞅着一个红绿灯(多对一),比如当前红灯,司机们盯着红绿灯,红绿灯由红灯变绿灯,司机们眼睛瞅到红绿灯变化(得到通知),启动汽车,通过该路口。


观察者模式UML类图:


示例代码:

抽象目标类:

/*****
 * 抽象目标类
 * @author wjw
 *
 */
public abstract class Subject {

	protected List<Observer> observes = new ArrayList<Observer>();
	//添加观察者方法
	public abstract void addObserver(Observer observer);
	//删除观察者方法
	public abstract void deleteObserver(Observer observer);
	//目标状态发生改变
	public abstract void changeState();
	//通知方法(当目标状态发生改变,该方法被调用)
	public abstract void notifyObserver();
}



具体目标类(红绿灯类):


/*****
 * 红绿灯目标类
 * @author wjw
 *
 */
public class LampSubject extends Subject{

	@Override
	public void addObserver(Observer observer) {
		// TODO Auto-generated method stub
		observes.add(observer);
	}

	@Override
	public void deleteObserver(Observer observer) {
		// TODO Auto-generated method stub
		observes.remove(observer);
	}

	@Override
	public void notifyObserver() {
		// TODO Auto-generated method stub
		
		Iterator<Observer> iterator = observes.iterator();
		while(iterator.hasNext()){
			Observer observer = iterator.next();
			observer.change();
			
			
		}
	}

	@Override
	public void changeState() {
		// TODO Auto-generated method stub
		System.out.println("红灯变绿灯!");
		System.out.println("--通知老司机--");
		this.notifyObserver();
	}

}

观察者接口:


/****
 * 观察者接口,定义了目标对象发生改变后观察者的改变方法
 * @author wjw
 *
 */
public interface Observer {

	void change();//观察者接到通知后的动作
}

具体观察者1,2(老司机):

/****
 * 具体观察者(老司机1)
 * @author wjw
 *
 */
public class Driver1Observer implements Observer{

	@Override
	public void change() {
		// TODO Auto-generated method stub
		System.out.println("老司机1看到了红灯变绿灯,一言不合就开车!");
	}

}

/****
 * 具体观察者(老司机2)
 * @author wjw
 *
 */
public class Driver2Observer implements Observer{

	@Override
	public void change() {
		// TODO Auto-generated method stub
		System.out.println("老司机2看到了红灯变绿灯,二话不说就开车!");
	}

}

Main类:


public class Main {

	
	public static void main(String[] args) {
		//new一个目标对象(红绿灯)
		Subject subject = new LampSubject();
		//new两个观察者对象
		Observer observer1 = new Driver1Observer();//老司机1
		Observer observer2 = new Driver2Observer();//老司机2
		//观察者观察目标(将观察者对象添加到目标对象中观察者集合中,表示该对象正在观察)
		subject.addObserver(observer1);
		subject.addObserver(observer2);
		//目标状态变化(红灯变绿灯)
		subject.changeState();
	}
}

运行结果:

红灯变绿灯!
--通知老司机--
老司机1看到了红灯变绿灯,一言不合就开车!
老司机2看到了红灯变绿灯,二话不说就开车!

通过上面例子应该足够把观察者模式原理说清了


如有错误,欢迎指正

end

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值