观察者模式也是比較简单的一种模式,可能从名字上理解无法明确,但真正理解其含义之后就非常easy了,说实话在自己来发的项目中自己也用到过。仅仅只是不知道它叫观察者罢了,仅仅要懂面向对象的对继承多态理解非常深的,玩观察者模式非常任意就能用到项目中去。

这本书用一个非常形象的故事解释了观察者模式,故事情景:公司员工当老板不在时有的炒股有的看NBA,为了防止老板偷袭,让前台MM通知。即前台MM充当了观察者,而员工属于详细的实例对象了。我们要编写的代码就是MM作为通知类,员工作为被通知者,

观察者模式:定义了一种一对多的依赖关系。让多个观察者对象同事监听某一个主题对象。

这个主题对象在状态发生变化时。会通知全部观察者对象,使它们可以自己主动更新自己。

怎样实现呢?请看代码吧

1、观察者接口(定义全部观察者的属性,在此不一定就是前台MM通知)

/**

* @author jzhf

* 通知类

*/

public
interface
Subject {

public
abstract void
add(Observer observer);

public
abstract void
notifyEveryOne();

public
final
String message =
"老板来了";

}

2、前台MM继承观察者接口(由于它要把风)

/**

* @author jzhf

* 秘书通知大家老板来了

*/

public
class
Secretary implements Subject{

private List<Observer>
list = new ArrayList<Observer>();

/* (non-Javadoc)

* @seecom.test.model.observer.Subject#notifyEveryOne()

* 通知每个人

*/

public
void
notifyEveryOne(){

// TODO Auto-generatedmethod stub

for(Observer observer :
list){

observer.Update();

}

}

/* (non-Javadoc)

* @seecom.test.model.observer.Subject#add(com.test.model.observer.Observer)

*/

public
void
add(Observer observer) {

// TODO Auto-generatedmethod stub

list.add(observer);

}

}

3、另一个通知大家的就是老板了(老板来了直接对他们说别玩了工作吧),和前台类一样,在此略(仅仅是类名不同而已,本人定义的类名是Boss)

4、開始定义详细类了。有的员工在看股票。有的看NBA,所以要用抽象类定义共同的动作了。

/**

* @author jzhf

* 对观察者即工作时间玩其它的人的抽象类

*/

public
abstract class
Observer {

public String
name;

public
Subject
sub;

public Observer(String name,Subject sub){

this.name = name;

this.sub = sub;

}

public
abstract void
Update();

}

5、看股票的

/**

* @author jzhf

*/

public
class
StockObserver extends Observer{

public StockObserver(String name,Subject sub){

super(name, sub);

}

/* (non-Javadoc)

* @seecom.test.model.observer.Observer#Update()

*/

@Override

public
void
Update() {

// TODO Auto-generatedmethod stub

System.out.print(sub.message+this.name+"关闭股票行情,继续工作");

}

}

6、看NBA的

/**

* @author jzhf

*/

public
class
NBAObserver extends Observer{

public NBAObserver(String name,Subject sub){

super(name, sub);

}

/* (non-Javadoc)

* @seecom.test.model.observer.Observer#Update()

*/

@Override

public
void
Update() {

// TODO Auto-generatedmethod stub

System.out.println(sub.message+this.name+"关闭NBA。继续工作");

}

}

7、client

/**

* @author jzhf

*/

public
class
ObserverClient {

/**

* @param args

*/

public
static void
main(String[] args) {

// TODO Auto-generatedmethod stub

//秘书通知

Subject sub = new Secretary();

Observer observer = new StockObserver("老李", sub);

sub.add(observer);

Observer observer2 = new NBAObserver("老王", sub);

sub.add(observer2);

sub.notifyEveryOne();

//老板通知

Subject sub2 = new Boss();

Observer observer3 = new StockObserver("老李", sub);

sub2.add(observer3);

Observer observer4 = new NBAObserver("老王", sub);

sub2.add(observer4);

sub2.notifyEveryOne();

}

}

假设你看完程序我相信你已经理解了观察者模式了。观察者模式所做的工作事实上就是解除耦合,让耦合的两方都依赖于抽象。而不是依赖于详细。

从而使得各自的变化都不会影响还有一边的变化。

附上观察者模式结构图

总结:当一个对象的改变须要同一时候改变其它对象的时候,并且它不知道详细有多少对象有待改变时,应该考虑使用观察者模式。当系统中一个对象依赖于还有一个对象,这时用观察者模式能够将这两个封装在独立的对象中使用它们各自独立地改变和复用。

&lt;十&gt;读&lt;&lt;大话设计模式&gt;&gt;之观察者模式的更多相关文章

  1. &lt;十二&gt;读&lt;&lt;大话设计模式&gt;&gt;之状态模式

    对于状态模式,<<大话设计模式>>是以人从上班到下班到加班的状态来展开讲述的.状态模式事实上就是某一个对象在某个过程或者时间的一个状态记录,可是这个状态的顺序不能发生变化.在程 ...

  2. &lt;二&gt;读&lt;&lt;大话设计模式&gt;&gt;之策略模式

    又和大家见面了.可以坚持写出第二篇文章真不错,好好加油. <<大话设计模式>>解说策略模式是以商场收银软件程序开头的,那么问题来了.哪家商场收银软件强,开玩笑了. 读过上篇文章 ...

  3. &lt;十一&gt;读&lt;&lt;大话设计模式&gt;&gt;之抽象工厂模式

    学习设计模式有一段时间了,对设计模式有一个体会,就是没那么难.就是设计程序遵循一些原则,让代码可复用,在改动的时候不用涉及太多的类,扩展方便.抽象工厂模式名字听起来抽象.但理解起来一点也不抽象,用语言 ...

  4. &lt;四&gt;读&lt;&lt;大话设计模式&gt;&gt;之代理模式

    代理模式我想大家即便不熟悉也都听过吧,从字面意思上看就是替别人干活的,比方代理商.在项目的实际应用中也有非常多地方用到.比方spring通过代理模式生成对象等. 代理模式的书面定义:为其它对象提供一种 ...

  5. &lt;一&gt;读&lt;&lt;大话设计模式&gt;&gt;之简单工厂模式

    工厂模式尽管简单.可是写下这篇文章却不简单. 第一:本人经过内心的挣扎后才决定開始写博文的.为什么呢,由于好长时间没有写了,对自己的文学功底也是好不自信.可是技术这东西你不写出来你真不知道自己掌握多少 ...

  6. &lt;五&gt;读《《大话设计模式》》之工厂模式

    怎么又是工厂模式呢?上次不是讲过简单工厂模式吗?不错.此工厂模式非彼工厂模式. 工厂模式:定义一个用于创建对象的接口.让子类决定实例化那一个类,工厂方法是一个类的实例化延迟到其子类. 还是以代码来进行 ...

  7. 大话设计模式之PHP篇 - 观察者模式

    定义观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,这个主题对象在状态发生改变时,会通知所有观察者对象,使他们能够自动更新自己. <?php /*主题类或称为通知类 ...

  8. 设计模式原则总结--读《大话设计模式》有感 <转>

    读了<大话设计模式>,摘录该书中讲到的设计模式几大原则,供日后使用. 一.单一职责原则 就一个类而言,应该仅有一个引起它变化的原因.如果一个类承担的职责过多,就等于把这些职责耦合在一起,一 ...

  9. 大话设计模式(C#)

    还是那几句话: 学无止境,精益求精 十年河东,十年河西,莫欺少年穷 学历代表你的过去,能力代表你的现在,学习代表你的将来 问个问题: 如何写出高质量的代码?灵活,可扩展,易读,易维护,可重构,可复用. ...

随机推荐

  1. Appium +Python 连接真机测试

    1.数据线连接电脑和手机: 2.用adb获取手机的UUID:cmd-> adb devices 前面的就是你手机的UUID 3.打开appium,选择手机的安卓版本(关于手机中查看),填写手机的 ...

  2. centos6.5 中文输入法图标和提示都不见了【解决】

    原因python升级引起的 两步解决: # vi /usr/bin/ibus-setup # vi /usr/libexec/ibus-ui-gtk 把这两个文件中的exec python 修改为 e ...

  3. Opencv利用Mat访问像素值

    如果是采用Mat形式存储,想要访问灰度图像的灰度值,可以采用如下方法: 如果是彩色图像,采用如下方法: 说明: 其中gray_value中存放灰度值,image是读入的图像,i表示行,j表示列: co ...

  4. 6、Flask实战第6天:视图函数Response返回值

    视图函数的返回值会被自动转换为一个响应对象,Flask的转换逻辑如下: 如果返回的是一个合法的响应对象,则直接返回 可以使用make_response函数来创建Response对象,这个方法可以设置额 ...

  5. [CTSC2017]最长上升自序列(伪题解)(Dilworth's theorem+网络流)

    部分分做法很多,但每想出来一个也就多5-10分.正解还不会,下面是各种部分分做法: Subtask 1:k=1 LCS长度最长为1,也就是说不存在j>i和a[j]>a[i]同时成立.显然就 ...

  6. 收藏起来,史上最全的 MySQL 高性能优化实战总结!

    转自:https://mp.weixin.qq.com/s/sRsJzFO9dPtKhovJNWN3Dg 一.前言 MySQL 对于很多 Linux 从业者而言,是一个非常棘手的问题,多数情况都是因为 ...

  7. LVS+Keepalived实现高可用

    http://blog.chinaunix.net/uid-16723279-id-3651396.html

  8. Java下List使用subList实现分页获取

    java.util.List中有一个subList方法,用来返回一个List的一部分的视图. List<E> subList(int fromIndex, int toIndex); 它返 ...

  9. NHibernate官方文档中文版--只读实体类型(Read-only entities)

    重点 NHIbernate处理只读对象的方式可能和你在别处看到的不同.不正确的使用方式可能造成不可预料的结果. 当一个实体是只读的时候: NHIbernate不会对实体的简单属性和单向关联数据检查数据 ...

  10. 通过Roslyn动态生成程序集

    之前写过篇文章如何通过Roslyn构建自己的C#脚本,今天本来打算测试一下这部分API在新的版本中的变化,结果发现它的脚本引擎找不到了,翻了一下官方文档,貌似说暂时性的移除了.便看了一下它动态生成程序 ...