Observer模式是行为模式之一,它的作用是当一个对象的状态发生变化时,能够自动通知其他关联对象,自动刷新对象状态。Observer模式提供给关联对象一种同步通信的手段,使某个对象与依赖它的其他对象之间保持状态同步
1) 抽象目标角色(Subject):目标角色知道它的观察者,可以有任意多个观察者观察同一个目标。并且提供注册和删除观察者对象的接口。目标角色往往由抽象类或者接口来实现。
2) 抽象观察者角色(Observer):为那些在目标发生改变时需要获得通知的对象定义一个更新接口。抽象观察者角色主要由抽象类或者接口来实现。
3)具体目标角色(Concrete Subject):将有关状态存入各个Concrete Observer对象。当它的状态发生改变时, 向它的各个观察者发出通知。
4) 具体观察者角色(Concrete Observer):存储有关状态,这些状态应与目标的状态保持一致。实现Observer的更新接口以使自身状态与目标的状态保持一致。在本角色内也可以维护一个指向Concrete Subject对象的引用。
Observer(Observer)
NumberGenerator--(Subject)
RandomNumberGenerator--(Concrete Subject)
NumberObserver(Concrete Observer)
SymbolObserver(Concrete Observer)
public interface Observer {
public void upadate(NumberGenerator generator);
}
public abstract class NumberGenerator {
private List<Observer> observers = new ArrayList<Observer>();
/** 添加观察者*/
public void addObserver(Observer observer) {
observers.add(observer);
}
/** 删除观察者*/
public void removeObserver(Observer observer) {
observers.remove(observer);
}
/** 通知所有观察者*/
public void notifyObservers() {
for(Observer obs : observers) {
obs.upadate(this);
}
}
public abstract int getNumber();
public abstract void generate();//产生数字
}
public class RandomNumberGenerator extends NumberGenerator {
private Random random = new Random();
private int number;
public void generate() {
for(int i = 0; i < 5; i++) {
number = random.nextInt(10);//产生10以内的随机数
notifyObservers();
}
}
public int getNumber() {
return number;
}
public void setNumber(int number) {
this.number = number;
}
}
public class NumberObserver implements Observer {
public void upadate(NumberGenerator generator) {
System.out.println("NumberObserver:"+ generator.getNumber());
try {
Thread.sleep(1000 * 3);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public class SymbolObserver implements Observer {
public void upadate(NumberGenerator generator) {
System.out.print("SymbolObserver:");
int count = generator.getNumber();
for(int i=0; i<count; i++) {
System.out.print("*^_^* ");
}
System.out.println("");
try {
Thread.sleep(1000*3);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public class Client {
public static void main(String[] args) {
//实例化数字产生对象
NumberGenerator generator = new RandomNumberGenerator();
//实例化观察者
Observer observer1 = new NumberObserver();
Observer observer2 = new SymbolObserver();
//注册观察者
generator.addObserver(observer1);
generator.addObserver(observer2);
generator.generate(); //产生数字
}
}
输出结果:
NumberObserver:8
SymbolObserver:*^_^* *^_^* *^_^* *^_^* *^_^* *^_^* *^_^* *^_^*
NumberObserver:4
SymbolObserver:*^_^* *^_^* *^_^* *^_^*
NumberObserver:8
SymbolObserver:*^_^* *^_^* *^_^* *^_^* *^_^* *^_^* *^_^* *^_^*
NumberObserver:7
SymbolObserver:*^_^* *^_^* *^_^* *^_^* *^_^* *^_^* *^_^*
NumberObserver:1
SymbolObserver:*^_^*
参考:http://blog.csdn.net/csh624366188/article/details/7477116
- 大小: 31 KB
分享到:
相关推荐
"易学设计模式源码光盘" 提供了一种直观的学习方式,帮助初学者更轻松地理解和应用这些模式。这里我们将深入探讨设计模式的核心理念、主要分类以及一些常见设计模式的实现细节。 首先,设计模式的出现源于对软件...
### 易学设计模式知识点详解 #### 一、设计模式概览 设计模式是一种软件设计中的通用解决方案,它描述了一种在特定情境下用来解决问题的重复出现的设计结构。设计模式可以帮助开发者更好地理解如何构建可扩展、可...
第17章 风吹草动:观察者模式 (Observer) 第18章 变化多端:状态模式 (State) 第19章 明修栈道,暗度陈仓:策略模式 (Strategy) 第20章 循序渐进:职责链模式 (ChainofResponsibility) 第21章 独具匠心:命令模式 ...
观察者模式(Observer)定义了一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并被自动更新;职责链模式(Chain of Responsibility)避免将处理请求的发送者和接收者耦合在一起...
包括责任链模式(Chain of Responsibility)、命令模式(Command)、解释器模式(Interpreter)、迭代器模式(Iterator)、中介者模式(Mediator)、备忘录模式(Memento)、观察者模式(Observer)、状态模式...
在“易学设计模式代码”这个压缩包中,你将找到这些模式的Java实现示例。通过阅读和分析这些代码,你可以更好地理解每种模式的核心思想,以及如何在实际项目中应用它们。同时,虽然这里的示例是基于Java,但设计模式...
9. **设计模式**:在编写大型游戏时,良好的设计模式如观察者模式(Observer)可用于实现事件驱动,工厂模式(Factory)用于对象的创建,单例模式(Singleton)用于全局资源的管理。 通过这个实训项目,学生不仅能...
这背后的技术称为“观察者”(Observer)和“订阅者”(Subscriber)模式,以及“派发器”(Dispatcher)机制,确保了高效的数据更新。 Vue的路由管理器Vue Router是官方推荐的解决方案,用于处理应用程序的页面...
9. **JavaScript设计模式**:单例模式、工厂模式、观察者模式等,理解并运用设计模式可以写出更高质量的代码。 10. **Web API和Web Components**:利用Web API如WebSocket进行实时通信,Web Components则提供了...
此外,为了保持代码整洁,可能还采用了设计模式,如工厂模式、观察者模式,以及函数式编程概念。 在测试方面,WeatherWear可能会使用Jest或Mocha这样的JavaScript测试框架,配合Chai或Expect作为断言库,进行单元...
7. **设计模式**:为了提高代码的可读性和可维护性,"dotmenu"可能采用了常见的设计模式,如单例模式(Singleton)用于管理全局资源,工厂模式(Factory)用于生成菜单实例,或者观察者模式(Observer)来处理事件。...
**Vue.js**:一种轻量级、易学的框架,适用于构建交互式的Web界面。 **Angular**:Google支持的完整的MVC框架,适用于大型企业级应用。 ### HTTP请求的过程 1. **发起请求**:客户端发送HTTP请求至服务器。 2. **...