观察者模式

观察者模式(Observer):又叫 发布-订阅 (Publish/Subscribe)模式

观察者模式:定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使他们能够自动更新自己。

Subject类

package observer;

import java.util.ArrayList;
import java.util.List;
/**
 * 抽象主题或抽象通知者
 * @author 煞笔
 *
 */
public abstract class Subject {
    private List<Observer> observers = new ArrayList<Observer>();
    
    public void addAttach(Observer observer){
        observers.add(observer);
    }
    
    public void removeAttach(Observer observer){
        observers.remove(observer);
    }
    
    public void notice(){
        for(Observer observer:observers){
            observer.update();
        }
    }
}

ConcreteSubject类

package observer;
/**
 * 具体主题或具体通知者
 * @author 煞笔
 *
 */
public class ConcreteSubject extends Subject {
    public String status;

    public String getStatus() {
        return status;
    }

    public void setStatus(String status) {
        this.status = status;
    }

}

observer类

package observer;
/**
 * 抽象观察者
 * @author 煞笔
 *
 */
public interface Observer {
    public void update();
}

StockConcreteObserver类

package observer;
/**
 * 具体观察者,股票观察者
 * 具体观察者保存一个指向具体主题对象的引用
 * @author 煞笔
 *
 */
public class StockConcreteObserver implements Observer {
    private String name;
    private ConcreteSubject subject;
    private String status;
    
    public StockConcreteObserver(String name, ConcreteSubject subject) {
        super();
        this.name = name;
        this.subject = subject;
    }

    @Override
    public void update() {
        this.status = subject.status;
        System.out.println("股票观察者"+name+"的通知信息是"+status);
    }

    public ConcreteSubject getSubject() {
        return subject;
    }

    public void setSubject(ConcreteSubject subject) {
        this.subject = subject;
    }
    
}

YouKuConcreteObserver类

package observer;

public class YouKuConcreteObserver implements Observer {
    private String name;
    private ConcreteSubject subject;
    private String status;
    
    public YouKuConcreteObserver(String name, ConcreteSubject subject) {
        super();
        this.name = name;
        this.subject = subject;
    }

    @Override
    public void update() {
        this.status = subject.status;
        System.out.println("优酷观察者"+name+"的新状态是"+status);
    }

    public ConcreteSubject getSubject() {
        return subject;
    }

    public void setSubject(ConcreteSubject subject) {
        this.subject = subject;
    }
    
}

Business类

package observer;

public class Business {

    public static void main(String[] args) {
        ConcreteSubject subject = new ConcreteSubject();
        subject.addAttach(new StockConcreteObserver("张三", subject));
        subject.addAttach(new YouKuConcreteObserver("李四", subject));
        subject.status="老板回来了";
        subject.notice();
    }

}

 观察者模式特点:

观察者模式的关键对象是主题Subject和观察者Observer,一个Subject可以有任意数目依赖它的Observer,一旦Subject的状态发生改变,所有的观察者Observer都可以得到通知。
当一个对象的改变需要同时改变其他对象的时候,而且它不知道具体有多少个对象等待改变,应该考虑使用观察者模式。

观察者模式所做的工作就是在解耦合。让耦合的双方都依赖于抽象,而不是依赖于具体。从而使得各自的变化都不会影响另一边的变化。

观察者模式的不足:

每一个观察者Observer都要实现Observer接口,但是有些控件都早已被它们的制造商给封装了。所以就不可能实现接口的。

抽象通知者还是依赖了抽象观察者,万一没有抽象观察者,功能都完成不了。

所有观察者对象都要有更新的动作

这个时候可以考虑时间委托实现

 

posted @ 2017-06-25 21:38  永不止步!  阅读(195)  评论(0编辑  收藏  举报