观察者模式(Observer)

观察者模式定义了一对多的依赖,这样一来,当一个对象状态时,他的所有依赖着都会收到通知并自动更新。

观察者模式有点像你订阅博客,当你所关注的博客更新时,你会自动收到更新的列表。那个博客就是主题(Subject),你就是观察者(Observer)。

观察者模式的一般实现如下:

代码实现如下:

Subject

interface Subject{ void registerObserver(Observer o); void deleteObserver(Observer o); void notifyObserver(); }

Observer

interface Observer{ void update(); }

ConcreteSubject

class ConcreteSubject implements Subject{ ArrayList observerList; //观察者注册列表 public ConcreteSubject(){ observerList = new ArrayList(); } public void registerObserver(Observer o){ observerList.add(o); } public void deleteObserver(Observer o){ int i = observerList.indexof(o); if(i>=0){ observerList.remove(i); } } public void notifyObserver(){ for(Object x:observerList){ (Observer)x.update(); } } }

ConcreteObserver

class ConcreteObserver implements Observer{ Subject subject; public ConcreteObserver(Subject subject){ this.subject = subject; //把观察者注册到主题 this.subject.registerObserver(this); } public void update(){ //写入更新的信息 } }

当ConcreteSubject有新的信息要更新时,ConcreteSubject只需调用notifyObserver()就可以使所有的观察者都收到更新。

java中还在java.util中提供了观察者模式。

主题:继承java.util.Observerable

对象:实现java.util.Oberser

实现代码如下:

主题

package Observer; import java.util.Observable; public class ConcreteSubject extends Observable { public String getName() { return name; } public int getAge() { return age; } private String name; private int age; public ConcreteSubject() { } public void update() { this.setChanged(); this.notifyObservers(); } public void setUpdate(String name, int age) { this.name = name; this.age = age; this.update(); } }

观察者

package Observer; import java.util.Observable; import java.util.Observer; public class ConcreteObserver implements Observer { Observable observerable; private String name; private int age; public ConcreteObserver(Observable observerable){ this.observerable = observerable; this.observerable.addObserver(this); } @Override public void update(Observable o, Object arg) { if(o instanceof ConcreteSubject){ ConcreteSubject concreteSubject=(ConcreteSubject)o; this.name = concreteSubject.getName(); this.age = concreteSubject.getAge(); } display(); } private void display() { System.out.println("姓名:"+this.name+" 年龄:"+this.age); } }

观察者模式就使观察者实时收到主题的更新!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值