设计模式-观察者
来源:互联网 发布:python的sys.argv 编辑:程序博客网 时间:2024/05/02 13:50
1.核心:
-观察者模式主要用于1:N的通知。当一个对象(目标对象Subject或者Objservable)的状态变化时,需要告知一系列对象(观察者对象,Observer),让他们做出响应
-通知观察者的方式:
推:每次都把通知以广播的方式发送给所有观察者,所有观察者只能被动接收
拉:观察者知道有消息,至于什么时候获取出内容,获取什么内容都可以自主决定
2.角色:
<1>抽象主题角色(Subject):把所有对观察者对象的引用保存在一个集合中,每个抽象主题角色都可以有任意数量的观察者。抽象主题提供一个接口,可以增加和删除观察者角色。一般用一个抽象类或接口实现
<2>具体主体角色:在具体主题部状态改变时,给所有登记过的观察者发出通知
<3>抽象观察者角色:为所有具体的观察者定义一个接口,在得到主题通知时更新自己
<4>具体观察者角色:该角色实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题的状态相协调。通常用一个子类实现。如果需要,具体观察者角色可以保存一个指向具体主题角色的引用。
3.示例代码:
<1>抽象主题
//抽象主题角色public interface Subject { void registerObserver(MyObserver obs); void removeObserver(MyObserver obs); void notify(String state);}
<2>具体主题
//具体主题角色(持用包含所有观察者的容器)public class ConcreteSubject implements Subject { private List<MyObserver> list=new ArrayList<MyObserver>(); //在主题容器中注册观察者 @Override public void registerObserver(MyObserver obs) { list.add(obs); } //从主题容器中移除观察者 @Override public void removeObserver(MyObserver obs) { list.remove(obs); } @Override public void notify(String state) { //通知所有注册的观察者状态变化 if(null!=list){ for(MyObserver obs:list){ obs.update(state); } } }}
<3>抽象观察者
//抽象观察者角色public interface MyObserver { void update(String state);}
<4>具体观察者
//具体的观察者,在主题状态发生变化时,更新自身状态public class ConcreteObserver implements MyObserver { @Override public void update(String state) { System.out.println("观察者状态改变:"+state); }}//具体的观察者,在主题状态发生变化时,更新自身状态public class ConcreteObserver1 implements MyObserver { @Override public void update(String state) { System.out.println("观察者1状态改变:"+state); }}//具体的观察者,在主题状态发生变化时,更新自身状态public class ConcreteObserver2 implements MyObserver { @Override public void update(String state) { System.out.println("观察者2状态改变:"+state); }}
<5>客户端
public class Client { public static void main(String[] args) { Subject subject=new ConcreteSubject(); MyObserver obs1=new ConcreteObserver(); MyObserver obs2=new ConcreteObserver1(); MyObserver obs3=new ConcreteObserver2(); subject.registerObserver(obs1); subject.registerObserver(obs2); subject.registerObserver(obs3); subject.notify("开始变化"); subject.notify("结束变化"); }}
执行结果:
观察者状态改变:开始变化观察者1状态改变:开始变化观察者2状态改变:开始变化观察者状态改变:结束变化观察者1状态改变:结束变化观察者2状态改变:结束变化
示例用类图
0 0
- 模式设计:观察者模式
- 设计模式-----观察者模式
- 设计模式-观察者模式
- 设计模式--观察者模式
- 设计模式:观察者模式
- 设计模式-----观察者模式
- 设计模式:观察者模式
- 设计模式-观察者模式
- 设计模式 观察者模式
- 设计模式-观察者模式
- 设计模式-【观察者模式】
- 设计模式-观察者模式
- 设计模式 -- 观察者模式
- 设计模式-观察者模式
- 【设计模式】观察者模式
- 设计模式- 观察者模式
- 设计模式- 观察者模式
- 设计模式--观察者模式
- noj 1052 水王争霸
- Unity 相关经典博客资源总结(持续更新)
- 三大网络营销联盟
- ArrayList只允许依次添加元素的原因
- HDU ACM 1050 Moving Tables(贪心 + 区间覆盖问题)
- 设计模式-观察者
- 自定义控件实现带进度条的ImageView
- [BZOJ 1027]合金
- leetcode 36: Valid Sudoku
- 关于 Module build failed: ReferenceError: Promise is not defined 错误
- JMeter中对于Json数据的处理方法
- Android真机调试出现的相关问题
- Learn Python the Hard Way Ex41记录
- Eclipse查看到某个类的完整继承关系