- 浏览: 26621 次
- 性别:
- 来自: 上海
-
文章分类
定义对象间的一种一对多的依赖关系。当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
public class Subject {// 被观察者
private List<Observer> readers = new ArrayList<Observer>();
public void attach(Observer observer) {
readers.add(observer);
}
public void detach() {
readers.remove(reader);
}
protected void notiyObserver() {
for(Observer reader : readers) {
reader.update(this);
}
}
}
public class SubjectA extends Subject {
private String content;
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
notifyObserver();
}
}
public interface Observer {//观察者
public void update(Subject subject);
}
public class ObserverA implement Observer{
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void update(Subject subject) {
System.out.println((SubjectA)subject.getContent());
}
}
客户端代码
SubjectA subject = new SubjectA ();
ObserverA observer1 = new ObserverA ();
observer1.setName("observer1");
ObserverA observer2 = new ObserverA ();
observer2.setName("observer2");
subject.attach(observer1);
subject.attach(observer2);
subject.setContent("XXXX");
在观察者模式中,观察者和目标是单向依赖,只有观察者依赖于目标,而目标是不会依赖于观察者的。
在实现观察者模式的时候,一定要注意触发通知的时机。一般情况下,是在完成了状态维护后触发,因为通知会传递数据,不能够先通知后改数据,这很容易出问题,会导致观察者和目标对象的状态不一致。
相互观察:
一套观察者模式是实现A对象、B对象观察C对象
另一套观察者模式是实现B对象、C对象观察A对象。
A对象和C对象就是在相互观察。
观察者模式的实现中,又分为推模型和拉模型两种方式。
推模式:目标对象主动向观察者推送目标的详细信息,不管观察者是否需要,推送的信息通常是目标对象的全部或部分数据,相当于是在广播通信。
拉模式:目标对象在通知观察者的时候,只传递少量信息。
java中已有观察者模式的部分实现
1.具体的目标实现 extends java.util.Observable;
2.在setContent()方法中必须调用this.setChanged();
1.具体的观察者 implement java.util.Observer;
java实现观察者模式时默认是拉模型。
当修过目标对象的状态的时候,就会触发相应的通知,然后会循环调用所有注册的观察者对象的相应方法。
public class Subject {// 被观察者
private List<Observer> readers = new ArrayList<Observer>();
public void attach(Observer observer) {
readers.add(observer);
}
public void detach() {
readers.remove(reader);
}
protected void notiyObserver() {
for(Observer reader : readers) {
reader.update(this);
}
}
}
public class SubjectA extends Subject {
private String content;
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
notifyObserver();
}
}
public interface Observer {//观察者
public void update(Subject subject);
}
public class ObserverA implement Observer{
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void update(Subject subject) {
System.out.println((SubjectA)subject.getContent());
}
}
客户端代码
SubjectA subject = new SubjectA ();
ObserverA observer1 = new ObserverA ();
observer1.setName("observer1");
ObserverA observer2 = new ObserverA ();
observer2.setName("observer2");
subject.attach(observer1);
subject.attach(observer2);
subject.setContent("XXXX");
在观察者模式中,观察者和目标是单向依赖,只有观察者依赖于目标,而目标是不会依赖于观察者的。
在实现观察者模式的时候,一定要注意触发通知的时机。一般情况下,是在完成了状态维护后触发,因为通知会传递数据,不能够先通知后改数据,这很容易出问题,会导致观察者和目标对象的状态不一致。
相互观察:
一套观察者模式是实现A对象、B对象观察C对象
另一套观察者模式是实现B对象、C对象观察A对象。
A对象和C对象就是在相互观察。
观察者模式的实现中,又分为推模型和拉模型两种方式。
推模式:目标对象主动向观察者推送目标的详细信息,不管观察者是否需要,推送的信息通常是目标对象的全部或部分数据,相当于是在广播通信。
拉模式:目标对象在通知观察者的时候,只传递少量信息。
java中已有观察者模式的部分实现
1.具体的目标实现 extends java.util.Observable;
2.在setContent()方法中必须调用this.setChanged();
1.具体的观察者 implement java.util.Observer;
java实现观察者模式时默认是拉模型。
当修过目标对象的状态的时候,就会触发相应的通知,然后会循环调用所有注册的观察者对象的相应方法。
发表评论
-
访问者模式Visitor预留通路,回调实现
2014-03-13 16:55 418表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各 ... -
桥接模式Bridge分离抽象和实现
2014-03-13 16:55 521将抽象部分与它的实现部分分离,使它们都可以独立地变化。 桥接 ... -
职责链模式Chain of Responsibility分离职责,动态组合
2014-03-12 17:25 354使多个对象都有机会处 ... -
装饰模式Decorator动态组合
2014-03-12 17:00 288动态地给一个对象添加 ... -
解释器模式Interpreters分离实现,解释执行
2014-03-12 16:27 329给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解 ... -
享元模式Flyweight分离与共享
2014-03-12 13:20 312运用共享技术有效地支持大量细粒度的对象。 安全实体:就是被系 ... -
备忘录模式Memento保存和回复内部状态
2014-03-11 17:47 444在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外 ... -
状态模式State根据状态来分离和选择行为
2014-03-11 17:20 420允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改 ... -
策略模式Strategy分离算法,选择实现
2014-03-11 15:26 428迪米特法则:LoD,最少知识原则。 如果两个类不必彼此直接通信 ... -
模板方法模式Templete Method 固定算法骨架
2014-03-11 11:15 548定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法 ... -
组合模式Composite统一叶子对象和组合对象
2014-03-07 18:18 315将对象组合成树型结构以表示“部分-整体”的层次结构。组合模式使 ... -
迭代器模式Iterator 控制访问聚合对象中的元素
2014-03-07 17:57 423提供一种方法顺序访问一个聚合对象中的各个元素,而又不需要暴露该 ... -
命令模式Command 封装请求
2014-03-07 16:26 392将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数 ... -
代理模式Proxy 为别人做嫁衣(控制对象访问)
2014-03-06 00:39 352为其他对象提供一种代理以控罪对这个对象的访问。 代理大致被分为 ... -
中介者模式Mediator 封装交互
2014-03-06 00:19 378用一个中介对象来封装 ... -
原型模式Prototype 克隆生成对象
2014-03-06 00:19 582用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象 ... -
生成器模式Builder 分离整体构建算法和部件构造
2014-03-06 00:19 318将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建 ... -
抽象工厂模式 Abstract Factory 选择产品簇的实现
2014-03-06 00:20 430工厂方法模式或简单工 ... -
工厂方法模式Factory Method延迟到子类来选择实现
2014-03-05 18:12 958定义一个用于创建对象 ... -
单例模式Singleton某个类只需要一个类实例
2014-03-05 16:46 435保证一个类只有一个实例,并提供一个访问它的全局访问点。 懒汉 ...
相关推荐
4. **触发联动代码**:过多的观察者可能导致连锁反应,需要谨慎设计以避免不必要的代码执行。 在实际应用中,为克服这些缺点,可以考虑使用如下的优化策略: - 使用懒通知,只有真正需要的观察者才被通知。 - 分组...
在这个笔试题中,主要涉及了观察者模式(Observer Pattern)的应用。观察者模式是一种行为设计模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。 ...
在这个面试题中,我们看到的是一个典型的"观察者模式"(Observer Pattern)的应用。观察者模式是一种行为设计模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知...
观察者模式的本质:触发联动当目标的状态发生改变时,就是触发相应的通知给所有注册的观察者。2.优点:1) 实现了观察者和目标之间的抽象耦合如果不用观察者模式,目标的变化需要直接一一通知给所有的观察者对象。...
#DesignPattern 《研磨设计模式》书中的例子 --第二章:简单工厂 本质:选择实现 --第三章:外观模式(Facade) 本质:封装交互,简化调用 --第四章:适配器模式...--第十二章:观察者模式(Observer) 本质:触发联动
例如,可以使用`transform: rotateX()`和`rotateY()`属性来实现字母的翻转和滑动,同时利用`perspective`属性来调整观察者的视点,创造出立体空间感。 其次,首字母显示是为了方便用户快速定位。在大量城市列表中,...