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); } } }
输出为:
曾贤儿心里暗暗高兴“嘿嘿!!!机会来了,我的胡一菲说她 ‘好想看电影啊!!!’”
张伟心里暗暗高兴“嘿嘿!!!机会来了,我的女神说她 ‘好想看电影啊!!!’”
吕小布心里暗暗高兴“嘿嘿!!!机会来了,我的陈美嘉说她 ‘好想去旅游啊!!!’”
时间: 2024-10-16 04:45:19