首页 > 代码库 > 观察者模式总结
观察者模式总结
观察者模式由两部分组成:观察者、主题。
观察者模式的核心思想:当主题发生变化是,告知所有有观察者。
观察者模式的实现方法:观察者模式实现方式分两种 推送模式【push】和索取模式【pull】,共同点主题持有观察者,当有变化时通知观察者.区别在于消息的传递:
观察者模式的用途:消息广播的一种解决方案。推送模式: 由主题将消息传递给观察者,消息包含主题中所有有用值;
索取模式: 由主题将自身的引用值传递给观察者,由观察者决定需要获取哪些值是必要的。
观察者模式的缺点:1.当观察者数量比较多时,遍历观察者会降低性能;2.尽量避免闭环,在遍历是会造成系统假死。
简单示例
模拟新闻推送,包含主体:服务器,客户端。当服务器接收到信息时,将消息推送给各种客户端
推送模式
package observerpattern.server; import observerpattern.client.Observer; /** * 主题接口 */ public interface Observable { /** * 向主题中添加观察者 * * @param ob * @return */ String add(Observer ob); /** * 从主题中移出观察者 * * @param ob * @return */ String remove(Observer ob); /** * 发送消息 * * @param msg * @return */ String sendMessage(Message msg); }
package observerpattern.server; import java.util.ArrayList; import java.util.List; import observerpattern.client.Observer; public class Server implements Observable{ private List<Observer> ls = new ArrayList<Observer>(); @Override public String add(Observer ob) { if(ob != null && !ls.contains(ob)) ls.add(ob); return Constants.SUCCESS; } @Override public String remove(Observer ob) { if(ob!=null && ls.contains(ob)) ls.remove(ob); return Constants.SUCCESS; } @Override public String sendMessage(Message msg) { for (Observer ob : ls) { ob.showMessage(msg); } return Constants.SUCCESS; } }
package observerpattern.server; public class Message { private String title; private String contents; private String time; public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getContents() { return contents; } public void setContents(String contents) { this.contents = contents; } public String getTime() { return time; } public void setTime(String time) { this.time = time; } }
package observerpattern.server; public class Constants { private Constants(){} public static final String SUCCESS = "success"; //成功 }
package observerpattern.client; import observerpattern.server.Message; /** * 观察者接口 */ public interface Observer { /** * 显示消息 * * @param msg * @return */ void showMessage(Message msg); }
package observerpattern.client; import observerpattern.server.Message; public class Client implements Observer{ private String name; public Client(String name) { this.name = name; } @Override public void showMessage(Message msg) { System.out.println(name+":Title->"+msg.getTitle()+" Time->"+msg.getTime()+" Contents->"+msg.getContents()); } }
索取模式
根据推送模式,进行简单修改
package observerpattern.server; import observerpattern.client.Observer; /** * 主题接口 */ public interface Observable { /** * 向主题中添加观察者 * * @param ob * @return */ String add(Observer ob); /** * 从主题中移出观察者 * * @param ob * @return */ String remove(Observer ob); /** * 发送消息 * * @param msg * @return */ String sendMessage(Message msg); /** * 将信息传递给观察者 * * @param msg */ void notifyObservers(); }
package observerpattern.server; import java.util.ArrayList; import java.util.List; import observerpattern.client.Observer; public class Server implements Observable{ private List<Observer> ls = new ArrayList<Observer>(); @Override public String add(Observer ob) { if(ob != null && !ls.contains(ob)) ls.add(ob); return Constants.SUCCESS; } @Override public String remove(Observer ob) { if(ob!=null && ls.contains(ob)) ls.remove(ob); return Constants.SUCCESS; } @Override public String sendMessage(Message msg) { this.msg = msg; notifyObservers(); return Constants.SUCCESS; } private Message msg = null; @Override public void notifyObservers() { for (Observer ob : ls) { ob.saveMessage(msg); } } }
package observerpattern.server; public class Message { private String title; private String contents; private String time; public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getContents() { return contents; } public void setContents(String contents) { this.contents = contents; } public String getTime() { return time; } public void setTime(String time) { this.time = time; } }
package observerpattern.server; public class Constants { private Constants(){} public static final String SUCCESS = "success"; //成功 }
package observerpattern.client; import observerpattern.server.Message; /** * 观察者接口 */ public interface Observer { /** * 显示消息 * * @param msg * @return */ void showMessage(); void saveMessage(Message msg); }
package observerpattern.client; import observerpattern.server.Message; public class Client implements Observer{ private String name; private Message msg = null; public Client(String name) { this.name = name; } @Override public void showMessage() { System.out.println(name+":Title->"+msg.getTitle()+" Time->"+msg.getTime()+" Contents->"+msg.getContents()); } @Override public void saveMessage(Message msg) { this.msg = msg; } }
package observerpattern.test; import observerpattern.client.Client; import observerpattern.client.Observer; import observerpattern.server.Message; import observerpattern.server.Observable; import observerpattern.server.Server; public class Test { public static void main(String[] args) { Observable server = new Server(); Observer ob1 = new Client("phone"); Observer ob2 = new Client("pad"); Observer ob3 = new Client("computer"); server.add(ob1); server.add(ob2); server.add(ob3); Message msg = new Message(); msg.setTitle("新闻标题"); msg.setTime("2014/10/31"); msg.setContents("都是呵呵啊"); server.sendMessage(msg); ob1.showMessage(); } }
运行结果
phone:Title->新闻标题 Time->2014/10/31 Contents->都是呵呵啊
观察者模式总结
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。