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
分享到:
相关推荐
设计模式C++学习之观察者模式(Observer)
观察者模式(Observer) 用意:定义了一种一对多的依赖关系,让多个观察者对象同时监听某一主题对象。
观察者模式通常的叫法叫做订阅-发布模式,类似于报刊杂志的订阅,观察者和被观察者就是读者和邮局的关系,读者先要在邮局订阅想要的报刊,当报刊发行时,邮局会将报刊邮寄到读者家里。观察者(Observer)和被观察者...
结合微信公众号讲解观察者模式,生动形象,关键是上手快啊
定义对象间的一种一对多的依赖关系,以便当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动刷新。
可以有任意多个观察者观察同一个目标。 提供注册和删除观察者对象的接口。 2.Observer(观察者) 为那些在目标发生改变时需获得通知的对象定义一个更新接口。 3.ConcreteSubject(具体目标) 将有关状态存入...
Observer (观察者模式) 又叫做发布/订阅(Publish/Subscribe)模式。 当一个对象的改变同时会影响其他对象的行为的时候,可以使用此设计模式。 l 主题对象 :一个需要被关注的主题对象,这个主题对象改变会影响...
C#面向对象设计模式纵横谈(19):(行为型模式) Observer 观察者模式 (Level 300)
用c++和lua实现的观察者模式小栗子,其中c++版本参考了别人的实现
observer观察者模式
NULL 博文链接:https://jacky-dai.iteye.com/blog/1132063
C#面向对象设计模式 (行为型模式) Observer 观察者模式 视频讲座下载
Observer设计模式是一种经典的设计模式,在GOF 23种设计模式种 比较常用于实际。主要是有类指针传递并引用方法和消息传递响应的方法来实现。
观察者模式示例 观察者模式示例 观察者模式示例 观察者模式示例 观察者模式示例 观察者模式示例
我们说学习Java应该从Swing开始,那么学习Swing最重要的思想就是对于观察者模式的理解(Observer Pattern)。因为,该设计模式在Java Swing框架中贯穿了始终。对于C#的委托、代理概念所使用的Callback(回调模式--...
NULL 博文链接:https://lgh3292.iteye.com/blog/600905
观察者模式Observer: 以手机号码为例,老师的手机号码存在学生的手机里,若老师的手机号改变,她会发一条短信通知每个学生自己手机号变了
观察者模式(Observer Pattern)是一种对象行为型设计模式,它定义了对象之间的一对多依赖关系。 当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式通常用于实现分布式事件处理系统...
主要介绍了PHP设计模式之观察者模式(Observer)详细介绍和代码实例,需要的朋友可以参考下