本文共 6144 字,大约阅读时间需要 20 分钟。
java-设计模式-创建模式-观察者模式observer
Subject接口
public interface Subject { public void registerObserver(Observer o); public void removeObserver(Observer o); public void notifyAllObservers();}
Observer接口
public interface Observer { public void update(Subject s);}
Hunter类实现了Subject接口
import java.util.ArrayList; public class HeadHunter implements Subject{ //define a list of users, such as Mike, Bill, etc. private ArrayList userList; private ArrayList jobs; public HeadHunter(){ userList = new ArrayList (); jobs = new ArrayList (); } @Override public void registerObserver(Observer o) { userList.add(o); } @Override public void removeObserver(Observer o) {} @Override public void notifyAllObservers() { for(Observer o: userList){ o.update(this); } } public void addJob(String job) { this.jobs.add(job); notifyAllObservers(); } public ArrayList getJobs() { return jobs; } public String toString(){ return jobs.toString(); }}
JobSeeker是一个观察者:
public class JobSeeker implements Observer { private String name; public JobSeeker(String name){ this.name = name; } @Override public void update(Subject s) { System.out.println(this.name + " got notified!"); //print job list System.out.println(s); }}
开始使用:
public class Main { public static void main(String[] args) { HeadHunter hh = new HeadHunter(); hh.registerObserver(new JobSeeker("Mike")); hh.registerObserver(new JobSeeker("Chris")); hh.registerObserver(new JobSeeker("Jeff")); //每次添加一个个job,所有找工作人都可以得到通知。 hh.addJob("Google Job"); hh.addJob("Yahoo Job"); }}
首先定义抽象的观察者:
//抽象观察者角色public interface Watcher{ public void update(String str);}
//抽象主题角色,watched:被观察public interface Watched{ public void addWatcher(Watcher watcher); public void removeWatcher(Watcher watcher); public void notifyWatchers(String str);}
public class ConcreteWatcher implements Watcher{ @Override public void update(String str) { System.out.println(str); }}
import java.util.ArrayList;import java.util.List;public class ConcreteWatched implements Watched{ // 存放观察者private List list = new ArrayList (); @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.update(str); } }}
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.notifyWatchers("开心"); }}
import java.util.Observable;import java.util.Observer;public class Client { /** * Test Observer Pattern * -- * */ public static void main(String[] args) { NewsPublisher publisher = new NewsPublisher(); //添加观察者对象 publisher.addObserver(new SubscriberObserver()); publisher.addObserver(new ManagerObserver()); //发布新闻,触发通知事件 publisher.publishNews("Hello news", "news body"); }}/*** Subject ROLE* NewsPublisher: news publisher**/class NewsPublisher extends Observable { public void publishNews(String newsTitle, String newsBody) { News news = new News(newsTitle, newsBody); setChanged(); //通过setChanged()方法标明对象的状态已发生变化 System.out.println("News published:" + newsTitle); this.notifyObservers(news); //通知各Observer,并发送一个名为news对象的消息 //other process ... such as save news to database }}/*** Observer ROLE* */class SubscriberObserver implements Observer { public void update(Observable observee, Object param) { if (param instanceof News) { mail2Subscriber((News)param); } } private void mail2Subscriber(News news) { System.out.println("Mail to subscriber. A news published with title:" + news.getTitle()); }}/*** Observer ROLE* */class ManagerObserver implements Observer { public void update(Observable observee, Object param) { if (param instanceof News) { mail2Manager((News)param); } } private void mail2Manager(News news) { System.out.println("Mail to Manager. A news published with title:" + news.getTitle()); }}//data entityclass News { private String title; private String body; public News(String title, String body) { this.title = title; this.body = body; } public String getBody() { return body; } public void setBody(String body) { this.body = body; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; }}
首先定义抽象的观察者:
转载地址:http://gqqbi.baihongyu.com/