java设计模式:观察者模式

package Observer;

public class Test {

	/**
	 * client测试类别
	 * 观察者模式一般由四部分组成:
	 * 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);
		}
	}

}

输出为:

曾贤儿心里暗暗高兴“嘿嘿!!

机会来了,我的胡一菲说她 ‘好想看电影啊!

!!’”
张伟心里暗暗高兴“嘿嘿!

!!

机会来了,我的女神说她 ‘好想看电影啊!!。’”
吕小布心里暗暗高兴“嘿嘿!

。一个偶然的机会,我的陈女士说,她 ‘好想去旅游啊!!!’”

版权声明:本文博客原创文章,博客,未经同意,不得转载。

原文地址:https://www.cnblogs.com/blfshiye/p/4682754.html