设计模式-观察者

定义:定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。

UML图示:

代码示例:就拿之前做过的项目举例,博主要实现餐厅打印订单的功能,如下图示。

通过上图很明显我们发现订单中心与打印机存在一对多的关系,根据上面对于观察者定义,采用观察者模式,可以让订单中心的状态改变的同时,让所有打印机都接收到状态的改变。下面我们再来看一张UML图。

定义Subject接口

public interface Subject {

?

????public void registerObserver(Observer obs);

????

????public void removeObserver(Observer obs);

????

????public void notifyObervers();

}

定义订单中心,实现Subject接口

public class OrderCenter implements Subject{

?

????private ArrayList<Observer> mObservers = null;

????

????private String order = null;

????

????public OrderCenter() {

????????// TODO Auto-generated constructor stub

????????mObservers = new ArrayList<Observer>();

????}

????

[email protected]

????public void registerObserver(Observer obs) {

????????// TODO Auto-generated method stub

????????if(obs != null){

????????????mObservers.add(obs);

????????}

????}

?

[email protected]

????public void removeObserver(Observer obs) {

????????// TODO Auto-generated method stub

????????if(obs != null){

????????????mObservers.remove(obs);

????????}

????????

????}

?

[email protected]

????public void notifyObervers() {

????????// TODO Auto-generated method stub

????????if(mObservers != null && mObservers.size() > 0){

????????????for(Observer obs : mObservers)

????????????????obs.update();

????????}

????}

????

????public void setOrder(String order){

????????this.order = order;

????????notifyObervers();

????}

????

????public String getOrder(){

????????return order;

????}

?

}

?

?

定义打印接口

public interface Print {

?

????public void print();

}

定义观察者接口

public interface Observer {

?

????public void update();

????

}

前台打印机,实现打印,观察者接口

public class ReceptionPrint implements Print,Observer{

?

????private OrderCenter mOrderCenter = null;

????

????public ReceptionPrint(OrderCenter oc) {

????????// TODO Auto-generated constructor stub

????????mOrderCenter = oc;

????}

?

[email protected]

????public void update() {

????????// TODO Auto-generated method stub

????????print();

????}

?

[email protected]

????public void print() {

????????// TODO Auto-generated method stub

????????System.out.println("reception print order : " + mOrderCenter.getOrder());

????}

????
?

????

}

大堂打印机,实现打印,观察者接口

public class HallPrint implements Observer,Print{

?

????private OrderCenter mOrderCenter = null;

????

????public HallPrint(OrderCenter oc) {

????????// TODO Auto-generated constructor stub

????????mOrderCenter = oc;

????}

[email protected]

????public void print() {

????????// TODO Auto-generated method stub

????????System.out.println("hall print order : " + mOrderCenter.getOrder());

????}

?

[email protected]

????public void update() {

????????// TODO Auto-generated method stub

????????print();

????}

?

}

测试代码

public class Main {

?

????public static void main(String[] args) {

????????OrderCenter oc = new OrderCenter();

????????Observer hallObser = new HallPrint(oc);

????????Observer receptionObser = new ReceptionPrint(oc);

????????oc.registerObserver(hallObser);

????????oc.registerObserver(receptionObser);

????????oc.setOrder("take out order!");

????????oc.removeObserver(receptionObser);

????????oc.setOrder("hall order");

????}

}

?

测试结果

hall print order : take out order!

reception print order : take out order!

hall print order : hall order

上面我们自己定义了观察者和主题的接口,其实在JDK类包java.util包含最基础的Observer接口和Observable类,和我们定义的接口几乎一样,你甚至可以通过notifyObservers()或notifyObservers(Object arg)方法,选择pull或者push的方式让观察者获取数据。注意调研notifyObservers前先调用setChanged()方法。

?

时间: 2024-11-01 02:57:40

设计模式-观察者的相关文章

PHP设计模式-观察者

PHP设计模式-观察者 一个对象状态发生改变后,会影响到其他几个对象的改变,这时候可以用观察者模式.一个对象通过添加一个attach方法允许观察者注册自己,使本身变得可观察.当被观察的对象更改时,它会将消息发送到已注册的观察者.观察者使用该信息执行的操作与被观察的对象无关.观察者模式是一种事件系统,意味着这一模式允许某些类通过观察被观察类的状态变化,做出相应的动作. 观察者模式UML图 php5中提供了观察者observer与被观察者subject接口 interface SplSubject

iOS常用设计模式——观察者设计模式

观察者设计模式详解 观察者设计模式详解 基本概念 NSNotificationCenter的使用 添加监听 接收消息 删除监视 KVO的使用 基本概念 注册观察者 观察者对象发生变化时的回调方法 remove观察者身份 代码实现 基本概念 观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象.这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己.而在IOS开发中我们可能会接触到的经典观察者模式的实现方式,有这么几种:NSNotificationCen

JAVA设计模式——观察者设计模式和Reactor反应堆设计模式

被观察者(主题)接口 定义主题对象接口 /**抽象主题角色: 这个主题对象在状态上发生变化时,会通知所有观察者对象 也叫事件对象 */ public interface Subject { //增加一个观察者 public void addWatcher(Watcher watcher); //删除一个观察者 public void removeWatcher(Watcher watcher); //通知所有的观察者 public void notifyWatchers(String str);

设计模式——观察者

观察者模式定义了对象之间的一对多依赖,当一个对象改变状态时,他的所有的依赖者都会收到通知并自动更新: 定义主题,主题的功能是持有观察者的引用,提供注册.取消注册和通知,并且有状态:观察者实现接口中的update方法,必须注册具体主题: JDK自带了对观察者的支持功能 被观察者Observable对象,提供add/delete/notifyObserver()和setChanged()设置状态方法 观察者Observer接口,提供update()方法进行相关的更新操作. 观察者类图: 以下程序模拟

Android与设计模式——观察者(Observer)模式

在阎宏博士的<JAVA与模式>一书中开头是这样描述观察者(Observer)模式的: 观察者模式是对象的行为模式,又叫发布-订阅(Publish/Subscribe)模式.模型-视图(Model/View)模式.源-监听器(Source/Listener)模式或从属者(Dependents)模式. 观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象.这个主题对象在状态上发生变化时,会通知所有观察者对象,使它们能够自动更新自己. 观察者模式的结构 一个软件系统里面包含了

设计模式--观察者(Observer)

GOF给出的定义: Define a one-to-many dependency between objects so that when one object changes state, all its dependents are notified and updated automatically. 定义了对象之间的一种一对多的依赖关系,这样,当一个对象的状态发生变化时,所有的依赖对象都被通知并自动更新. 包含观察者与被观察者(也称为主题) 使用场景: 1.有两个抽象类型相互依赖.将他

设计模式--观察者设计模式

定义了对象间的一种一对多依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新. Observer模式提供给关联对象一种同步通信的手段,使某个对象与依赖它的其他对象之间保持状态同步. java提供Obeservable类和Observer接口. 比如购房,购房者是观察者,而房价是被观察者,房价的变化是被观察者所关注的. /** * 被观察者 * @author soyoungboy * */ public class House extends Observable {

设计模式观察者

观测者模式 设计原则:遵循迪米特.开闭原则常用场景:需要将观察者与被观察者解耦或者是观察者的种类不确定使用概率:40%复杂度:中变化点:观察者的种类与个数选择关键点:观察者与被观察者是否是多对一的关系逆鳞:观察者之间有过多的细节依赖 主要思想:其实比较简单,是发布-订阅形式的,就是类之间的关系,观察者与被观察者被观察者的属性变化了,那观察者就要随着改变,不过不是观察者一直监视着,而是被观察者主动通知现有的使用比较多,常见的比如nsq消息框架,我变动了就发一个消息,需要知道我变动的定义我发的top

python设计模式-观察者

定义: 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖的对象都会得到通知并被自动更新. 观察者模式是对象的行为模式,又叫发布-订阅(pubish/subscribe)模式,模型-视图(Model/View模式),源-监听器(Source/Listener)模式或从属者(Dependents)模式. 角色: 抽象主题,具体主题(发布者), 抽象观察者,具体观察者(订阅者) 适用场景: 当一个抽象模型有两个方面,其中一个方面依赖于另一个方面.将两者封装在独立的对象中以使它们各