观察者模式

观察者模式:
观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态上发生变化时,会通知所有观察者对象,使它们能够自动更新自己。
自己的理解:观察者模式相当于书刊==》订阅者这种类型,比如说:我订阅了一本《读者》,然后读者每发行一版就会给我发送一次新的周刊。
类图:(上一个策略模式的类图是自己随意画的,很不好,还是找的一个,看来以后的将UML也学习一番了。)

下面我们来看代码:
主题接口:
public interface Subject {
    void addObserver(Observer obs);
    void removeObserver(Observer obs);
    void notifyObserver();
}

主题接口设计三个方法:
一个为注册观察者方法addObserver(Observer obs),一个为 注销观察者方法:removeObserver(Observer obs);最后一个为提醒观察者:notifyObserver();
主题实现类:
public class ConcreteSubject implements Subject {

    private String state = "this is ConcreteSubject state";

    private List<Observer> observerList=new ArrayList<Observer>();



    public String getState() {
        return state;
    }

    public void setState(String state) {
        this.state = state;
    }

    @Override
    public void addObserver(Observer obs) {
        // TODO Auto-generated method stub
        this.observerList.add(obs);
    }

    @Override
    public void removeObserver(Observer obs) {
        // TODO Auto-generated method stub
        this.observerList.remove(obs);
    }

    @Override
    public void notifyObserver() {
        // TODO Auto-generated method stub
        for (Observer obs: observerList) {
            obs.action(state);
        }

    }

}

抽象观察者:
public interface Observer {

    void action(String state);
}

抽象观察者主要用于执行观察者的共同方法
实例观察者:
public class ConcreteObserver implements Observer {

    @Override
    public void action(String state) {
        // TODO Auto-generated method stub
        System.out.println(state);
    }

}

实例观察者用来实现相应的方法。
下面我们来看实现代码:
public class ObserverTest {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        ConcreteSubject sub = new ConcreteSubject();
        Observer observer = new ConcreteObserver();
        sub.addObserver(observer);
        sub.notifyObserver();
        sub.setState("this is the changed");
        sub.notifyObserver();
        sub.removeObserver(observer);
        sub.notifyObserver();
    }

}

开始的时候,我们提到书刊订阅,这种是书刊主动推送,如果读者想自己取是不是会更好呢?观察者模式中恰好就有这种类型。我们一般将上面的例子称为推模式,而接下来的这种称为拉模式。代码如下:
主题接口:
public interface Subject {
    void addObserver(Observer obs);
    void removeObserver(Observer obs);
    void notifyObserver();
}

主题接口设计三个方法:
一个为注册观察者方法addObserver(Observer obs),一个为 注销观察者方法:removeObserver(Observer obs);最后一个为提醒观察者:notifyObserver();
主题实现类:
public class ConcreteSubject implements Subject {

    private String state = "this is ConcreteSubject state";

    private List<Observer> observerList=new ArrayList<Observer>();



    public String getState() {
        return state;
    }

    public void setState(String state) {
        this.state = state;
    }

    @Override
    public void addObserver(Observer obs) {
        // TODO Auto-generated method stub
        this.observerList.add(obs);
    }

    @Override
    public void removeObserver(Observer obs) {
        // TODO Auto-generated method stub
        this.observerList.remove(obs);
    }

    @Override
    public void notifyObserver() {
        // TODO Auto-generated method stub
        for (Observer obs: observerList) {
            obs.action(this);
        }

    }


}

抽象观察者:
public interface Observer {

    void action(ConcreteSubject concreteSubject );
}

抽象观察者主要用于执行观察者的共同方法
实例观察者:
public class ConcreteObserver implements Observer {

    @Override
    public void action(ConcreteSubject concreteSubject) {
        // TODO Auto-generated method stub
        System.out.println(concreteSubject.getState());
    }

}


实例观察者用来实现相应的方法。
下面我们来看实现代码:
public class ObserverTest {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        ConcreteSubject sub = new ConcreteSubject();
        Observer observer = new ConcreteObserver();
        sub.addObserver(observer);
        sub.notifyObserver();
        sub.setState("this is the changed");
        sub.notifyObserver();
        sub.removeObserver(observer);
        sub.notifyObserver();
    }

}


ok,今天的分享就到这里了。
另外,java内部也有观察者模式的相关类,大家可以网上查相关资料,我这里就不赘述了。
欢迎大家来拍砖,有什么好的建议也可以留言,大家一起学习哈。。。 大笑





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值