Java中的观察者模式(Observer Pattern)学习
来源:互联网 发布:pc访问mac共享文件夹 编辑:程序博客网 时间:2024/05/18 00:20
是什么?(观察者模式的定义)
是对象间的一种一个(Observable)对多个(Observer)的依赖关系,当一个对象的状态发送改变时,所依赖于它的对象都得到通知并被自动更新。
理解:
- 他强调的是一种依赖关系中的,被观察者变化后通知其他观察者的自发性,对于被观察者(Observable)与观察者(Observer)的数量并没有严格的限制,也特定的需求下也可以实现一对一(例如对button监听)、多对一等多种形式组合。
- 类似于多态的一种实现。
- 基本组成
Subject:目标对象,或者说被观察对象。
Observer:观察者的接口
ConcreteSubject:实际的被观察对象。
ConcreteObserver:实际的观察者对象。 - 直观结构图
- 举个例子
我们要对同一个数字进行二进制、八进制和十六进制的转换,需要分别写三个类,去实现对输入数字的转换。当然对于最初的数据来源(我们传入的数据)类就是被观察者了,可以随意输入任何数字
4.1这个例子的整体直观图:
4.2具体实现:
步骤 1 创建 Subject 类。
Subject.java
import java.util.ArrayList;import java.util.List;public class Subject { private List<Observer> observers = new ArrayList<Observer>(); private int state; public int getState() { return state; } public void setState(int state) { this.state = state; notifyAllObservers(); } public void attach(Observer observer){ observers.add(observer); } public void notifyAllObservers(){ for (Observer observer : observers) { observer.update(); } } }
步骤 2 创建 Observer 类。
Observer.java
public abstract class Observer { protected Subject subject; public abstract void update();}
步骤 3 创建实体观察者类。
BinaryObserver.java
public class BinaryObserver extends Observer{ public BinaryObserver(Subject subject){ this.subject = subject; this.subject.attach(this); } @Override public void update() { System.out.println( "Binary String: " + Integer.toBinaryString( subject.getState() ) ); }}
OctalObserver.java
public class OctalObserver extends Observer{ public OctalObserver(Subject subject){ this.subject = subject; this.subject.attach(this); } @Override public void update() { System.out.println( "Octal String: " + Integer.toOctalString( subject.getState() ) ); }}
HexaObserver.java
public class HexaObserver extends Observer{ public HexaObserver(Subject subject){ this.subject = subject; this.subject.attach(this); } @Override public void update() { System.out.println( "Hex String: " + Integer.toHexString( subject.getState() ).toUpperCase() ); }}
步骤 4 使用 Subject 和实体观察者对象。
ObserverPatternDemo.java
public class ObserverPatternDemo { public static void main(String[] args) { Subject subject = new Subject(); new HexaObserver(subject); new OctalObserver(subject); new BinaryObserver(subject); System.out.println("First state change: 15"); subject.setState(15); System.out.println("Second state change: 10"); subject.setState(10); }}
步骤 5 验证输出。
First state change: 15Hex String: FOctal String: 17Binary String: 1111Second state change: 10Hex String: AOctal String: 12Binary String: 1010
例子的来源
5.观察者模式的优缺点
- 优点:
a.观察者和被观察者之间是抽象耦合关系,方便对特定功能的维护
b.支持广播通信
c.为实现类似多态的情况提供了可能 - 缺点:
a.当依赖关系比较复杂时,一定要避免发生循环依赖,一旦发生循环依赖,就可能导致系统崩溃
b.当“改变”发生时,要特别注意将这个“改变信号”发送给哪个观察者,并且核对发送给观察者的数量是否正确,避免 “改变信号” 发生多发或者错发的问题
参考:
http://www.runoob.com/design-pattern/observer-pattern.html
http://www.jianshu.com/p/bd833ba613fb
http://www.cnblogs.com/shijiacheng/p/5059067.html
http://www.cnblogs.com/mythou/p/3370340.html
http://blog.csdn.net/cauchyweierstrass/article/details/44593807
0 0
- Java中的观察者模式(Observer Pattern)学习
- Java之观察者模式(Observer Pattern)
- Java 观察者模式( Observer Pattern)
- Java Observer Pattern(观察者模式)
- 观察者模式(Observer Pattern)
- 观察者模式(Observer Pattern)
- 观察者模式(Observer Pattern)
- 观察者模式(Observer Pattern)
- 观察者模式(Observer Pattern)
- 观察者模式(Observer Pattern)
- 观察者模式(Observer Pattern)
- 观察者模式(Observer Pattern)
- 观察者模式(Observer Pattern)
- 观察者模式(Observer Pattern)
- 观察者模式(Observer Pattern)
- 观察者模式(Observer Pattern)
- 观察者模式(Observer Pattern)
- 观察者模式(Observer Pattern)
- 拷贝构造函数/重载赋值运算符
- Linux中find常见用法示例
- hdu4764 Stone 巴什博弈
- Integer to Roman
- 新手报到。
- Java中的观察者模式(Observer Pattern)学习
- eclipse构建maven project 的web项目,不勾选Create a simple project 。 < =2= >
- String.format()用法
- linux中一切皆文件, 一切文件皆二进制
- ajax无法跨域调用接口
- 解决了中文乱码的http的get和post请求demo
- linux 设置日志编码
- 我终于有了自己的博客了
- Fatal Error[Pe1696]: cannot open source file "core_cmInstr.h"