观察者模式

[size=x-large][b]观察者模式[/b][/size]
当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象修改时,则会自动通知它的依赖对象。观察者模式属于行为型模式。
_____________________________________________________________________________________
[size=small][b]介绍[/b][/size]
[b]意图:[/b]定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
[b]主要解决:[/b]一个对象状态改变给其他对象通知的问题,而且要考虑到易用和低耦,保证高度的协作。
[b]何时使用:[/b]一个对象(目标对象)的状态发生改变,所有依赖对象(观察者对象)都将得到通知,进行广播通知。
[b]如何解决:[/b]使用面向对象技术,可以将这种依赖关系弱化。
[b]关键代码:[/b]在抽象类里有一个ArrayList存放观察者们。
[b]应用实例:[/b]拍卖的时候,拍卖师观察最高标价,然后通知给其他竞价者竞价。
[b]优点:[/b]1、观察者和被观察者是抽象耦合的。2、建立一套触发机制。
[b]缺点:[/b]1、如果一个被观察者对象有很多的直接和间接的观察者的话,将所有的观察者都通知到会花费很多时间。2、如果大观察者和观察目标之间有循环依赖的话,观察目标会触发它们之间进行循环调用,可能导致系统崩溃。3、观察者模式没有相应的机制让观察者知道所观察的目标对象是怎么发生变化的,而仅仅知道观察目标发生了变化。
[b]使用场景:[/b]1、有多个子类共有的方法,且逻辑相同。2、重要的、复杂的方法,可以考虑作为模板方法。
[b]注意事项:[/b]1、JAVA中已经有了对观察者模式的支持类。2、避免循环引用。3、如果顺序执行,某一观察者错误会导致系统卡壳,一般采用异步方式。
__________________________________________________________________________________
[size=small][b]实现[/b][/size]
观察者模式使用三个类Subject、Observer和Client。Subject对象带有绑定观察者到Client对象和从Client对象解绑观察者的方法。我们创建Subject类、Observer抽象类和扩展了抽象类Observer的实例类。
ObserverPatternDemo,我们的演示类使用Subject实体类对象来演示观察者模式。

[img]http://dl2.iteye.com/upload/attachment/0128/8063/e51e9043-eb7e-3198-946f-5b1cd2f4013c.jpg[/img]
__________________________________________________________________________________
[size=small][b]步骤1[/b][/size]
创建Subject类。
Subject.java

public class Subject {
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();
}
}


}

Java自带实现

public class Subject extends Observable {
private int state;

public int getState() {
return state;
}

public void setState(int state) {
if(this.state != state){
this.state = state;
setChanged();
}
notifyObservers(state);
}
}

[size=small][b]步骤2[/b][/size]
创建Observer.java

public abstract class Observer {
protected Subject subject;
public abstract void update();
}

[size=small][b]步骤3[/b][/size]
创建实体观察者类
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()));

}

}

Java自带实现

public class BinaryObserver implements Observer {
public BinaryObserver(Subject subject){
super();
subject.addObserver(this);
}
@Override
public void update(Observable o, Object arg) {
System.out.println("Binary String:"+
Integer.toBinaryString((int)arg));

}

}

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("Hexa String:"+
Integer.toHexString(subject.getState()));

}

}

[size=small][b]步骤4[/b][/size]
使用Subject和实体观察者对象。
ObserverPatternDemo.java

public class ObserverPatternDemo {

public static void main(String[] args) {
Subject subject = new Subject();

new BinaryObserver(subject);
new OctalObserver(subject);
new HexaObserver(subject);

System.out.println("First state change 15: ");
subject.setState(15);
System.out.println("Second state change 22:");
subject.setState(10);
}

}

[size=small][b]步骤5[/b][/size]
验证输出。

First state change 15:
Binary String:1111
Octal String:17
Hexa String:f
Second state change 22:
Binary String:1010
Octal String:12
Hexa String:a
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值