大话设计模式笔记 观察者模式

观察者模式又称发布-订阅 (Publish/Subscribe)模式。

 

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

 

 

感觉书上写的有点累赘,我重写了一下结构。

package observer;

import java.util.ArrayList;

/**
 * 被观察者接口,或称通知者。
 *
 */
public class Subject {

    // 用ArrayList 维护一对多的映射关系
    private ArrayList<Observer> observerList = new ArrayList<Observer>();

    // 被观察者状态
    private String subjectState;
    
    public String getSubjectState() {
        return subjectState;
    }

    public void setSubjectState(String subjectState) {
        this.subjectState = subjectState;
        System.out.println("ConcreteSubject setSubjectState:" + subjectState);
        inform();
    }

    public void add(Observer observer) {
        observerList.add(observer);
    }

    public void remove(Observer observer) {
        observerList.remove(observer);
    }

    // 通知
    public void inform() {
        for (Observer observer : observerList) {
            observer.update(this);
        }
    }
    
}

 

package observer;

/**
 * 抽象观察者类,在的到通知时更新自己。
 */
public abstract class Observer {

    public abstract void update(Subject Subject);
    
}

 

package observer;

/**
 * 通知者具体实现类
 *
 */
public class ConcreteSubject extends Subject {



}

 

package observer;

public class ConcreteObserver extends Observer {

    private String name;
    private String observerState;

    public ConcreteObserver(String name) {
        super();
        this.name = name;
    }

    @Override
    public void update(Subject Subject) {
        // 意思应该是省略了,根据通知者状态做出的观察者状态
        observerState = Subject.getSubjectState();
        System.out.println("Observer:" + name + " observerState:"
                + observerState);
    }

    public static void main(String[] args) {
        ConcreteSubject concreteSubject=new ConcreteSubject();

        concreteSubject.add(new ConcreteObserver("A"));
        concreteSubject.add(new ConcreteObserver("B"));
        concreteSubject.setSubjectState("ABC");
    }
}

 

不足之处,Subject 还是依赖Observer,而Observer没有相应的update接口,或者相应的update名字不相同的时候,inform的功能完成不了。

 

实现能动态的根据updata方法来实现inform。这里用到了事件委托。

委托就是一种引用方法的类型。一旦为委托分配了方法,委托将与该方法具有完全相同的行为。委托方法的使用可以像其他任何方法一样具有参数和返回值。委托可以看作是对函数的抽象,是函数的‘类’,委托的实例将代表一个具体的函数。

 

委托对象所搭载的所有方法必须具有相同的原形和形式,也就是拥有相同的参数列表和返回值类型。

 

用Java动态代理实现委托模式

http://www.iteye.com/topic/29541 

posted @ 2015-09-26 10:58  郁闷紫番薯  阅读(300)  评论(0编辑  收藏  举报