观察者模式(小程序实现)

1.观察者模式

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

2.模式中的角色

  2.1 抽象主题(Subject):它把所有观察者对象的引用保存到一个聚集里,每个主题都可以有任何数量的观察者。抽象主题提供一个接口,可以增加和删除观察者对象。(一般包括声明addobserver;  removeoberver; notifyobserver;方法)

  2.2 具体主题(ConcreteSubject):将有关状态存入具体观察者对象;在具体主题内部状态改变时,给所有登记过的观察者发出通知。(实现抽象主题的方法)

  2.3 抽象观察者(Observer):为所有的具体观察者定义一个接口,在得到主题通知时更新自己。(一般包括声明update方法)

  2.4 具体观察者(ConcreteObserver):实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题状态协调。

例:

(1)public interface Watched {
//抽象主题
	public void addWatcher(Watcher watcher);
	public void removeWatch(Watcher watcher);
	public void notifyWatcher(String str);
}


(2)//具体主题
import java.util.ArrayList;
import java.util.List;

public class ConcreteWatched implements Watched {

	private List<Watcher>list = new ArrayList<Watcher>();
	public void addWatcher(Watcher watcher) {
		// TODO Auto-generated method stub

		list.add(watcher);
	}

	public void removeWatch(Watcher watcher) {
		// TODO Auto-generated method stub

		list.remove(watcher);
	}

	public void notifyWatcher(String str) {
		// TODO Auto-generated method stub

		for(Watcher watcher : list){
			watcher.update(str);
		}
	}

}



(3)//抽象观察者

public interface Watcher {

	public void update(String str);
}
(4)//具体观察者

public class ConcreteWatcher implements Watcher {

	public void update(String str) {
		// TODO Auto-generated method stub

		System.out.println(str);
	}

}
(5)//测试

public class Test {

	public static void main(String[] args) {
		Watched girl = new ConcreteWatched();
		
		Watcher watcher1 = new ConcreteWatcher();
		Watcher watcher2 = new ConcreteWatcher();
		Watcher watcher3 = new ConcreteWatcher();
		
		girl.addWatcher(watcher1);
		girl.addWatcher(watcher2);
		girl.addWatcher(watcher3);
		
		girl.notifyWatcher("开心");
		
		girl.removeWatch(watcher1);
		girl.notifyWatcher("不开心");
		
	}
}



3.观察者模式实现小程序

使用java自带库实现:被观察者对象继承Observable以及观察者实现Observer接口

例:有一个 int 类型的变量,初始值为 10,编写一个 for 循环,将该数字每次递减 1,一直到 0 为止,每次变化时,都将该数字传递给它的观察者,观察者会打印出该数字;第二个观察者在该数字变为 5 之后开始打印该数字。

import java.util.Observable;
import java.util.Observer;

public class TwoObserver {
//测试类
	public static void main(String[] args) {
		watched wd = new watched();
		
		watcher1 w1 = new watcher1();
		watcher2 w2 = new watcher2();
		
		wd.addObserver(w1);
		wd.addObserver(w2);
		//通过改变被观察对象,进而通知观察者自动更新
		wd.count(10);
	}
}
//被观察对象
class watched extends Observable{
	public void count(int num){
		for(;num >= 0 ;num--){
			this.setChanged();
			this.notifyObservers(num);
		}
	}
}
//第一个观察者
class watcher1 implements Observer{

public void update(Observable o, Object arg) {
// TODO Auto-generated method stub
System.out.println("watcher1 num is:"+arg);
}
}
//第二个观察者
class watcher2 implements Observer{
public void update(Observable o, Object arg) {
// TODO Auto-generated method stub 
if(((Integer)arg).intValue() <= 5){
System.out.println("watcher2 num is:"+arg);
   }
 }
}



结果:

watcher1 num is:10

参考:

张龙老师javaSE视频









评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值