首页 > 代码库 > java设计模式之:观察者模式

java设计模式之:观察者模式

package Observer;

public class Test {

	/**
	 * 客户端测试类
	 * 观察者模式一般由四部分组成:
	 * 1抽象的被观察者(一般教材上都叫做“Subject(抽象的主题类)”),
	 * 里面一般定义了抽象的add(),remove(),notifyAll()等方法,
	 * 分别用于增加观察者,删除观察者,通知观察者自己的变化。
	 * 2具体的观察者类(一般教材上都叫做“ConcreteSubject(具体的主题类)”),
	 * 是抽象的被观察者(Subject)的具体的实现类,里面实现了add(),remove(),notifyAll()等方法;
	 * 3抽象的观察者类(一般教材上叫做“Observer”),里面一般定义了一个抽象的update()方法;
	 * 4具体的观察者类(一般教材上叫做“ConcreteObserver”),他是抽象的观察者类(Observer)的具体实现,它实现了update()方法,
	 * 用于接受被观察者的具体变化;
	 * 
	 * 这里有个例子:有两个被观察者陈美嘉和胡一菲,他们分别有不同的观察者,陈美嘉的观察者有吕小布,
	 * 胡一菲的观察者有曾贤儿和张伟两个,当陈美嘉和胡一菲有什么变化时,马上就会分别被他们的观察者说知道;
	 * @author wl
	 */
	public static void main(String[] args) {
		Watched HuYiFei=new ConcerteWatched();
		Watched ChenMeiJia=new ConcerteWatched();
		
		Watcher LvXiaoBu=new ConcreteWatcher("吕小布","陈美嘉");
		Watcher ZengXianEr=new ConcreteWatcher("曾贤儿","胡一菲");
		Watcher ZhangWei=new ConcreteWatcher("张伟","女神");
		
		ChenMeiJia.addWatcher(LvXiaoBu);
		HuYiFei.addWatcher(ZengXianEr);
		HuYiFei.addWatcher(ZhangWei);
		
		HuYiFei.notifyWatchers("好想看电影啊!!!");
		
		ChenMeiJia.notifyWatchers("好想去旅游啊!!!");
		
	}

}
package Observer;
/**
 * 抽象的观察者接口类
 * @author wl
 *
 */
public interface Watcher {
	void updata(String str);
}
package Observer;
/**
 * 抽象的被观察者接口
 * @author wl
 *
 */
public interface Watched {
	void addWatcher(Watcher watcher);
	void removeWatcher(Watcher watcher);
	void notifyWatchers(String str);
}
package Observer;
/**
 * 具体的观察者类,比如例子中的吕小布,曾贤儿,张伟就是观察者的实例
 * @author wl
 *
 */
public class ConcreteWatcher implements Watcher {
	String watcheredName;
	String name;
	
	public ConcreteWatcher(String name,String watcheredName){
		this.name=name;
		this.watcheredName=watcheredName;
	}
	@Override
	public void updata(String str) {
		System.out.println(name+"心里暗暗高兴“嘿嘿!!!机会来了,我的"+watcheredName+"说她 ‘"+str+"’”");
	}

}
package Observer;

import java.util.ArrayList;
import java.util.List;
/**
 * 具体的被观察者类,比如例子中的胡一菲,陈美嘉就是具体的被观察者的实例
 * @author wl
 *
 */
public class ConcerteWatched implements Watched {
	List<Watcher> list=new ArrayList<Watcher>();
	
	@Override
	public void addWatcher(Watcher watcher) {
		list.add(watcher);
	}

	@Override
	public void removeWatcher(Watcher watcher) {
		list.remove(watcher);
	}

	@Override
	public void notifyWatchers(String str) {
		for(Watcher watcher:list){
			watcher.updata(str);
		}
	}

}

输出为:

曾贤儿心里暗暗高兴“嘿嘿!!!机会来了,我的胡一菲说她 ‘好想看电影啊!!!’”
张伟心里暗暗高兴“嘿嘿!!!机会来了,我的女神说她 ‘好想看电影啊!!!’”
吕小布心里暗暗高兴“嘿嘿!!!机会来了,我的陈美嘉说她 ‘好想去旅游啊!!!’”

java设计模式之:观察者模式