<十>读<<大话设计模式>>之观察者模式
观察者模式也是比較简单的一种模式,可能从名字上理解无法明确,但真正理解其含义之后就非常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();
}
}
假设你看完程序我相信你已经理解了观察者模式了。观察者模式所做的工作事实上就是解除耦合,让耦合的两方都依赖于抽象。而不是依赖于详细。
从而使得各自的变化都不会影响还有一边的变化。
附上观察者模式结构图
总结:当一个对象的改变须要同一时候改变其它对象的时候,并且它不知道详细有多少对象有待改变时,应该考虑使用观察者模式。当系统中一个对象依赖于还有一个对象,这时用观察者模式能够将这两个封装在独立的对象中使用它们各自独立地改变和复用。
<十>读<<大话设计模式>>之观察者模式的更多相关文章
- <十二>读<<大话设计模式>>之状态模式
对于状态模式,<<大话设计模式>>是以人从上班到下班到加班的状态来展开讲述的.状态模式事实上就是某一个对象在某个过程或者时间的一个状态记录,可是这个状态的顺序不能发生变化.在程 ...
- <二>读<<大话设计模式>>之策略模式
又和大家见面了.可以坚持写出第二篇文章真不错,好好加油. <<大话设计模式>>解说策略模式是以商场收银软件程序开头的,那么问题来了.哪家商场收银软件强,开玩笑了. 读过上篇文章 ...
- <十一>读<<大话设计模式>>之抽象工厂模式
学习设计模式有一段时间了,对设计模式有一个体会,就是没那么难.就是设计程序遵循一些原则,让代码可复用,在改动的时候不用涉及太多的类,扩展方便.抽象工厂模式名字听起来抽象.但理解起来一点也不抽象,用语言 ...
- <四>读<<大话设计模式>>之代理模式
代理模式我想大家即便不熟悉也都听过吧,从字面意思上看就是替别人干活的,比方代理商.在项目的实际应用中也有非常多地方用到.比方spring通过代理模式生成对象等. 代理模式的书面定义:为其它对象提供一种 ...
- <一>读<<大话设计模式>>之简单工厂模式
工厂模式尽管简单.可是写下这篇文章却不简单. 第一:本人经过内心的挣扎后才决定開始写博文的.为什么呢,由于好长时间没有写了,对自己的文学功底也是好不自信.可是技术这东西你不写出来你真不知道自己掌握多少 ...
- <五>读《《大话设计模式》》之工厂模式
怎么又是工厂模式呢?上次不是讲过简单工厂模式吗?不错.此工厂模式非彼工厂模式. 工厂模式:定义一个用于创建对象的接口.让子类决定实例化那一个类,工厂方法是一个类的实例化延迟到其子类. 还是以代码来进行 ...
- 大话设计模式之PHP篇 - 观察者模式
定义观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,这个主题对象在状态发生改变时,会通知所有观察者对象,使他们能够自动更新自己. <?php /*主题类或称为通知类 ...
- 设计模式原则总结--读《大话设计模式》有感 <转>
读了<大话设计模式>,摘录该书中讲到的设计模式几大原则,供日后使用. 一.单一职责原则 就一个类而言,应该仅有一个引起它变化的原因.如果一个类承担的职责过多,就等于把这些职责耦合在一起,一 ...
- 大话设计模式(C#)
还是那几句话: 学无止境,精益求精 十年河东,十年河西,莫欺少年穷 学历代表你的过去,能力代表你的现在,学习代表你的将来 问个问题: 如何写出高质量的代码?灵活,可扩展,易读,易维护,可重构,可复用. ...
随机推荐
- node.js的全局变量的注意
在node.js中,如果一个变量没有用var来声明,就会变为全局变量: 看如下代码: 1)6.js function myadd(a) { return a+abc; } function conta ...
- eclispe启动进入子项目的解决
问题描述: In Package Explorer I right-clicked on project and selected "Open in New Window". Ne ...
- Tarjan+topsort(DP)【P3387】 [模板]缩点
Description 给定一个n个点m条边有向图,每个点有一个权值,求一条路径,使路径经过的点权值之和最大.你只需要求出这个权值和. 允许多次经过一条边或者一个点,但是,重复经过的点,权值只计算一次 ...
- ( 转 ) mysql复合索引、普通索引总结
对于复合索引:Mysql从左到右的使用索引中的字段,一个查询可以只使用索引中的一部份,但只能是最左侧部分.例如索引是key index (a,b,c). 可以支持a | a,b| a,b,c 3种组合 ...
- [BZOJ2111][ZJOI2010]Perm排列计数(组合数学)
题意就是求一个n个点的堆的合法形态数. 显然,给定堆中所有数的集合,则这个堆的根是确定的,而由于堆是完全二叉树,所以每个点左右子树的大小也是确定的. 设以i为根的堆的形态数为F(i),所以F(i)+= ...
- 【最大流】【费用流】bzoj1834 [ZJOI2010]network 网络扩容
引用题解: 最大流+费用流. 第一问最大流即可. 第二问为“最小费用最大流”. 由题意,这一问的可转化为在上一问的“残量网络”上,扩大一些边的容量,使能从新的图中的最大流为k. 那么易得:对于还有剩余 ...
- Problem N: 猴子吃桃
#include<stdio.h> int main() { int n,s,i; while(scanf("%d",&n)!=EOF){ s=; ;i> ...
- 记一次深刻的教训-----将mat数据转化为SequenceFile
深刻的体会就是,“java.lang.NullPointer.Exception”就是空指针异常可能是由于数组部分元素未被初始化引起的. 1)使用jmatio将mat数据转化为SequenceFile ...
- cocoods 出现下面的问题:ERROR: While executing gem ... (Errno::EPERM)
今天安装cocoods 出现下面的问题:ERROR: While executing gem ... (Errno::EPERM) Operation not permitted - /us ...
- 苹果iOS系统下检查第三方APP是否安装及跳转启动
在iOS系统,使用Url Scheme框架在APP间互相跳转和传递数据,本文只介绍如果检测和跳转. Url Scheme框架 如果你想知道ios设备中是否安装QQ这个软件,我们可以通过一个简单方法判断 ...