Java设计模式——观察者模式(Observer)

观察者模式的意图是在多个对象之间定义一对多的关系,当一个对象的状态发生改变时,会通知依赖于它的对象,并根据新状态做出反应。
解决的问题:
将一个系统分割成一个一些类相互协作的类有一个不好的副作用,那就是需要维护相关对象间的一致性。我们不希望为了维持一致性而使各类紧密耦合,这样会给维护、扩展和重用都带来不便。观察者就是解决这类的耦合关系的。
这里写图片描述
源码如下:
抽象主图或通知者

public abstract class Subject {

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

    /**
     * 增加观察者
     * @author 付玉伟
     * @time 2015-2-10 下午09:49:20
     * @param observer
     */
    public void attach(Observer observer){
        observers.add(observer);
    }

    /**
     * 移除观察者
     * @author 付玉伟
     * @time 2015-2-10 下午09:50:18
     * @param observer
     */
    public void dettach(Observer observer){
        observers.remove(observer);
    }

    /**
     * 向观察者们发出通知
     * @author 付玉伟
     * @time 2015-2-10 下午09:52:04
     */
    public void Notify(){
        for(Observer o:observers){
            o.update();
        }
    }

抽象观察者

public abstract class Observer {

    /**
     * 抽象观察者类,为所有的具体观察者定义一个接口,在得到通知时更新自己
     * @author 付玉伟
     * @time 2015-2-10 下午09:52:49
     */
    public abstract void update();
}

具体观察者

public class ConcreteObserver extends Observer {

    private String observerState;
    private String name;
    private ConcreteSubject subject;


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

    /**
     * 实现抽象观察者中更新方法
     */
    @Override
    public void update() {
        observerState = subject.getSubjectState();
    }

    public ConcreteSubject getSubject() {
        return subject;
    }

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


}

具体主题或者通知者

public class ConcreteSubject extends Subject {

    // 具体观察者的状态
    private String subjectState;

    public String getSubjectState() {
        return subjectState;
    }

    public void setSubjectState(String subjectState) {
        this.subjectState = subjectState;
    }


}

客户端调用类

“`
public class Client {

/**
 * @author 付玉伟
 * @time 2015-2-11 下午06:46:48
 * @param args
 */
public static void main(String[] args) {
    ConcreteSubject subject = new ConcreteSubject();
    subject.attach(new ConcreteObserver("observer1",subject));
    subject.attach(new ConcreteObserver("observer2",subject));
    subject.attach(new ConcreteObserver("observer3",subject));

    subject.setSubjectState("stateReady");
    subject.Notify();
}

}
下面我从网上搜到一个实际运用的例子,方便我们理解和运用
客户支付了订单款项,这时财务需要开具发票,出纳需要记账,配送员需要配货

这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值