Design Pattern 之 观察者模式
来源:互联网 发布:php中str_replace函数 编辑:程序博客网 时间:2024/04/29 06:10
定义
观察者模式定义了一种一对多的依赖关系,让多个观察者同时监听某一个主题,这个主题在状态发生变化时,会通知所有观察者,使它们能够自动更新自己
主题:被观察者
你不必知道怎么调用我,我会调用你
类图
比如说新闻服务器更新了,其他的新闻客户端(电视,平板,手机等等)也会同步更新,在这种场景下,观察者模式就会大显身手,我们将新闻服务器看成被观察者
各种新闻客户端看成观察者,一旦被观察者有更新了,就会通知所有已注册的观察者更新信息,观察者设计模式将被观察者和观察者解耦,也将观察者之间的耦合度
减少到最少,这样在这个设计模式下,每个类都符合最少知识原则和单一职责原则,也能做到对修改关闭,对扩展开放,如果想在加入一个新的观察者,只需要继承
观察者接口,然后把它注册到被观察者中去就好了
示例:
ObserverInterface:
package com.org.observer;public interface ObserverInterface{ public void DoNotify(String notifyMsg);}
TVClient:
package com.org.observer;public class TVClient implements ObserverInterface{ @Override public void DoNotify(String notifyMsg) { System.out.println("TV Say:" + notifyMsg); }}
PhoneClient:
package com.org.observer;public class PhoneClient implements ObserverInterface{ @Override public void DoNotify(String notifyMsg) { System.out.println("Phone Say:"+notifyMsg); }}
PadClient:
package com.org.observer;public class PadClient implements ObserverInterface{ @Override public void DoNotify(String notifyMsg) { System.out.println("Pad Say:"+notifyMsg); }}
Subject:
package com.org.observer;import java.util.Vector;public abstract class Subject{ public abstract void notifyObserver(); Vector<ObserverInterface> vtrObservers; public Subject() { vtrObservers = new Vector<ObserverInterface>(); } public boolean addObserver(ObserverInterface observer) { return vtrObservers.add(observer); } public boolean removeObserver(ObserverInterface observer) { return vtrObservers.remove(observer); }}
NewsServer:
package com.org.observer;public class NewsServer extends Subject{ private String msg = ""; public NewsServer() { msg = "init Client!!!!"; } public void notifyObserver() { if (!vtrObservers.isEmpty()) { for (ObserverInterface inter : vtrObservers) { inter.DoNotify(getMsg()); } } } public void updateNews(String newMsg) { setMsg(newMsg); notifyObserver(); } public String getMsg() { return msg; } public void setMsg(String msg) { this.msg = msg; }}
Main:
public static void main(String[] args) { System.out.println("////start Observer test//////////////"); NewsServer server = new NewsServer(); TVClient tv = new TVClient(); PhoneClient phone = new PhoneClient(); PadClient pad = new PadClient(); server.addObserver(tv); server.addObserver(phone); server.addObserver(pad); server.updateNews("first notify clients"); System.out.println(".........second..........."); server.removeObserver(tv); server.updateNews("second notify clients"); System.out.println("////end Observer test//////////////"); }
如果想新增一个客户端,比如PCClient,只需呀让它继承ObserverInterface , 将PCClient通过Subject的addObserver方法注册到被观察者中去就好了,同样要是想移除它,就调用removeObserver方法,增加和删除观察者不需要修改其他的类,对修改关闭,对扩展开放。
0 0
- Design Pattern 之 观察者模式
- Design Pattern 之 观察者模式
- Design Pattern:观察者模式
- Design pattern--观察者模式
- 设计模式之 观察者模式 the observer design pattern
- 设计模式之-观察者模式(Observer Design Pattern)
- 设计模式之观察者模式 (Observer Design Pattern)
- HeadFirst design pattern笔记-观察者模式
- Java Design Pattern Observer 观察者模式
- Design Pattern - Observer 观察者设计模式
- Java设计模式 Design Pattern:观察者模式 Observer Pattern
- Design Pattern—— Observer Pattern 观察者模式
- 【design pattern】行为型模式之—观察者模式(observer)
- Design Pattern 之 策略模式
- Design Pattern 之 命令模式
- Design Pattern 之 迭代器模式
- Design Pattern(设计模式- 行为模式)-------Observer(观察者)
- 设计模式学习—观察者模式(Observer Design Pattern)
- IPicture、BITMAP、HBITMAP和CBitmap的关系
- PyQt 如果异常未处理,抛入到事件循环,则无错误提示崩溃的解决方法
- codeforces #302 Destroying Roads (最短路径+暴力)
- MAVEN初学者遇到的问题
- ASCII码表
- Design Pattern 之 观察者模式
- ListView+CheckBox,实现批量删除与解决listview滚动checkBox选择状态絮乱
- Item-Based Recommendations with Hadoop
- SQL中条件语句decode与case...when...else...end的用法
- 黑马程序员——OC基础02—封装、继承、多态
- 解析中国国家气象局天气预报信息接口 xml文件,包含省市县三层结构
- Eclipse V4.5.1 Mars使用Eclipse Color Them更换主题
- Android自定义View的实现方法,深入了解View(四)
- C++编程值得参考的博客资料