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); } } }
输出为:
曾贤儿心里暗暗高兴“嘿嘿!!
!
机会来了,我的胡一菲说她 ‘好想看电影啊!
!!’”
张伟心里暗暗高兴“嘿嘿!
!!
机会来了,我的女神说她 ‘好想看电影啊!!。’”
吕小布心里暗暗高兴“嘿嘿!
!
。一个偶然的机会,我的陈女士说,她 ‘好想去旅游啊!!!’”
版权声明:本文博客原创文章,博客,未经同意,不得转载。