您的位置:首页 > 其它

设计模式[策略模式和观察者模式]

2016-05-29 10:16 267 查看

设计模式[策略模式和观察者模式]

使用模式最好的方式是:

把模式装在脑子里,然后在你的设计和已有的应用中,寻找何处可以使用它们。

策略模式

定义了算法族,分别封装起来,让它们之间可以互相替换,此模式算法让算法的变化独立于使用算法的客户。

实例

实现一个模拟鸭子的应用。每个鸭子有不同的飞和叫的行为。

Java Code 实例,FilenameFilter and File



Duck 类是一个抽象类

performQuack()

public void performQuack(){
quackBehavior.quack();
}


performFly()

public void performFly(){
flyBehavior.fly();
}


display() 是一个抽象方法

FlyBehavior, QuackBehavior 是接口,由具体的类实现

由Duck类的子类指定FlyBehavior和QuackBehavior 具体实现

观察者模式

在对象之间定义一对多的依赖,这样一来,当一个对象改变状态是,依赖它的对象都会接到通知,并自动更新。



实例



Subject接口

public interface Subject{
public void registerObserver(Observer o);
public void removeObserver(Observer o);
public void notifyObservers();
}


ConcreteSubject类,实现Subject接口

public class ConcreteSubject implements Subject{
private List observers;
//主题状态,根据不同的需求进行改变
private String state;

public ConcreteSubject(){
observers = new ArrayList();
}
public void registerObserver(Observer o){
observers.add(o);
}
public void removeObserver(Observer o){
int i = observers.indexOf(o);
if(i >= 0){
observers.remove(i);
}
}
public void notifyObservers(){
for(Observer o : observers){
o.update();
}
}
public void setState(String state){
this.state = state;
notifyObserv
4000
ers();
}
public void getState(){
return state;
}

}


Observer接口

public interface Observer{
public void update();
}


ConcreteObserver

public class ConcreteObserver implements Observer(){
private String state;
private Subject subject;
public ConcreteObserver (Subject subject){
this.subject = subject;
subject.registerObserver(this);
}
public void update(){
this.state = subject.getState();
//业务逻辑
}
}


使用Java内置的观察者模式

如何把对象变成观察者

实现观察者接口(java.util.Observer),然后调用任何Observable对象的addObserver()方法。或者调用deleteObserver()方法删除观察者。

可观察者如何送出通知

首先利用扩展java.util.Observable接口产生“可观察者类”,然后,

调用setChanged()方法,标记状态已经改变的事实。

然后调用两种notifyObservers()方法中的一个

notifyObservers() 或 notifyObservers(Object arg)

观察者如何接收通知

观察者实现更新方法

update(Observable o, Object arg)



Observable代码片段

public class Observable(){
setChanged(){
changed = true;
}
notifyObservers(){
if(changed){
//call update on each observer
}
changed = false;
}
}


ConcreteObservable

public class ConcreteObservable extends Observable{
private String State;
....
public void setState(){
setChanged();
notifyObservers();
}
...
}


java.util.Observable的黑暗面

Observable是一个类,当需要继承两个类时,就会陷入两难。

Observable将关键的方法setChanged()保护起来。除了继承外,无法创建Observable类并组合到自己的代码中来。

通知的顺序不一定是注册的顺序,不要依赖于观察者被通知的顺序。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  设计模式