设计模式之观察者模式
2017-06-28 22:26
148 查看
时隔多日,终于想动手写了,内心一片狼藉、愧疚。废话就不多说了,直接上正题吧。
观察者模式
观察者模式(Observer)完美的将观察者(Observer)和被观察的对象(Observerable)分离开。有个例子很恰当,报社与订报人,只要订报人预定了报纸,一有新报纸,报社就会送达给订阅人。观察者模式思想也是如此,下面具体来说:
最基本的观察者模式包括两个接口(IObserverable和IObserver)及其对应的实现类(ObserverableImp和ObserverImp),IObserverable中定义了
下面开始翠花的爱情故事:
翠花是我们的被追求者(被观察者),张三、李四、王麻子是翠花的追求者(观察者),翠花知道他们三个暗恋者自己,所以一有什么事情,就通知他们三个,三个人的表现不尽相同,因此,翠花评判张三不够喜欢自己,于是就把张三移除了自己的追求者集合当中,当翠花再次考验他们的时候,当然就不会再通知张三了。
这样就实现了一个简单的观察者模式。具体代码如下:
IObserverable 接口:
IObserver 接口:
IObserverable的实现类(被观察者):
IObserver 的实现类(观察者):
测试类:
输出结果:
观察者模式
观察者模式(Observer)完美的将观察者(Observer)和被观察的对象(Observerable)分离开。有个例子很恰当,报社与订报人,只要订报人预定了报纸,一有新报纸,报社就会送达给订阅人。观察者模式思想也是如此,下面具体来说:
最基本的观察者模式包括两个接口(IObserverable和IObserver)及其对应的实现类(ObserverableImp和ObserverImp),IObserverable中定义了
void registObserver(IObserver o);,
void removeObserver(IObserver o);,
void notifyObservers();这三个方法;IObserver中定义了了
void update();这个方法,实现类只需实现相应的接口的方法即可。
下面开始翠花的爱情故事:
翠花是我们的被追求者(被观察者),张三、李四、王麻子是翠花的追求者(观察者),翠花知道他们三个暗恋者自己,所以一有什么事情,就通知他们三个,三个人的表现不尽相同,因此,翠花评判张三不够喜欢自己,于是就把张三移除了自己的追求者集合当中,当翠花再次考验他们的时候,当然就不会再通知张三了。
这样就实现了一个简单的观察者模式。具体代码如下:
IObserverable 接口:
public interface IObserverable { void registObserver(IObserver o); void removeObserver(IObserver o); void notifyObservers(); }
IObserver 接口:
public interface IObserver { void update(); }
IObserverable的实现类(被观察者):
public class ObserverableImp implements IObserverable{ //男朋友集合 private Set<IObserver> set; public ObserverableImp() { set = new HashSet<>(); } /** * 注册观察者 * 相当于翠花说,我知道了,o喜欢我 */ @Override public void registObserver(IObserver o) { set.add(o); } /** * 取消观察者 * 相当于翠花对o死心了 */ @Override public void removeObserver(IObserver o) { set.remove(o); } /** * 通知观察者 * 相当于翠花考验一波追求自己的人了 */ @Override public void notifyObservers() { for(IObserver o:set){ o.update(); } } }
IObserver 的实现类(观察者):
public class ObserverImp implements IObserver { private String message; public ObserverImp(String message) { this.message = message; } @Override public void update() { System.out.println(message); } public void setMessage(String message) { this.message = message; } }
测试类:
public class Test { public static void main(String[] args) { //翠花 ObserverableImp flower = new ObserverableImp(); //张三、李四、王麻子 ObserverImp zhangsan = new ObserverImp("我是张三,我好像有点喜欢翠花"); ObserverImp lisi = new ObserverImp("我是李四,我只喜欢翠花"); ObserverImp wangmazi = new ObserverImp("我是王麻子,翠花是我最心爱的人"); //张三、李四、王麻子分别向翠花说:我喜欢你 flower.registObserver(zhangsan); flower.registObserver(lisi); flower.registObserver(wangmazi); //翠花开始考验追求者了 flower.notifyObservers(); //翠花觉得李四说的话显得不够爱自己,干脆放弃张三了 flower.removeObserver(zhangsan); System.out.println("-------可爱的分割线---------"); //翠花再次考验追求者 flower.notifyObservers(); } }
输出结果:
我是王麻子,翠花是我最心爱的人 我是张三,我好像有点喜欢翠花 我是李四,我只喜欢翠花 -------可爱的分割线--------- 我是王麻子,翠花是我最心爱的人 我是李四,我只喜欢翠花
相关文章推荐
- 设计模式与泡mm的关系之Observer观察者模式及再思考
- 乐在其中设计模式(C#) - 观察者模式(Observer Pattern)
- 乐在其中设计模式(C#) - 观察者模式(Observer Pattern)
- 设计模式随笔系列:气象站的故事-观察者模式(Observer)[原]
- 利用观察者模式设计仿真器内核接口
- .NET中的设计模式五:观察者模式
- 设计模式之Observer观察者模式
- 认识观察者模式(设计模式)[转载]
- 设计模式学习笔记(二十一)——Observer观察者
- 用 spring 实现观察者设计模式
- .NET中的设计模式五:观察者模式 选择自 lane_cn 的 Blog
- 设计模式之观察者模式 (原创)
- 设计模式之观察者模式(Observer Pattern)(一)
- 设计模式之观察者模式
- IssueVision 学习笔记(三)-----设计模式之OBSERVER(观察者)模式
- 设计模式之观察者模式(Observer Pattern)(二)
- 探究观察者设计模式
- GEF框架中的设计模型(观察者模式)
- C#设计模式-观察者observer模式实现
- AspectJ实现设计模式(一)——观察者模式