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

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

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

策略模式

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

实例

实现一个模拟鸭子的应用。每个鸭子有不同的飞和叫的行为。
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;
        notifyObservers();
    }
    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接口产生“可观察者类”,然后,

    1. 调用setChanged()方法,标记状态已经改变的事实。
    2. 然后调用两种notifyObservers()方法中的一个
      notifyObservers() 或 notifyObservers(Object arg)
  • 观察者如何接收通知
    观察者实现更新方法

update(Observable o, Object arg)
观察者模式java实现类图

  • 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的黑暗面
    1. Observable是一个类,当需要继承两个类时,就会陷入两难。
    2. Observable将关键的方法setChanged()保护起来。除了继承外,无法创建Observable类并组合到自己的代码中来。
    3. 通知的顺序不一定是注册的顺序,不要依赖于观察者被通知的顺序。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值