设计模式之观察者模式

观察者模式

定义:定义了对象间的一种一对多的依赖关系,以便一个对象的状态发生变化时,所有依赖于它的对象都得到通知并自动刷新。

这里写图片描述

通常观察者模式包括四个角色:

  • Subject,抽象主题类,定义公共管理观察者的接口。
  • ConcreteSubject,具体主题类,实现抽象主题接口,内部存储被订阅的观察者列表。
  • Observer,抽象观察者,定义公共接口。
  • ConcreteObserver,具体观察者,实现抽象观察者接口。具体主题类会通知到每个具体观察者。

观察者模式就比如订阅报纸,ConcreteSubject相当报社,如果哪个人(也就是ConcreteObserver)要订阅报纸,就要向报社申请(subscribe),报社一有最新的报纸就会通知(notify)每一个观察者(update),如果我想不想看了,可以找报社取消订阅(unsubscribe)。在实际开发当中,观察者模式Subject大多数情况是不需要的,直接具体主题类管理通知观察者。

代码示例

抽象观察者

    public interface Observer {
        void update();
    }

各个具体观察者

    public class Programmer implements Observer{

        public void update() {
            System.out.println("程序员收到了一份报纸");
        }

    }
    public class Police implements Observer{

        public void update() {
            System.out.println("警察收到了一份报纸");
        }

    }

具体主题类

    public class Newspaper {
        private List<Observer> observers = new ArrayList<Observer>();

        public void subject(Observer observer) {//订阅报纸
            observers.add(observer);
        }

        public void unsubject(Observer observer) {//取消订阅
            observers.remove(observer);
        }

        public void notifyObserver(){//通知所有观察者
            for(Observer o : observers){
                o.update();
            }
        }
    }

客户端

    Newspaper newspaper = new Newspaper();
    newspaper.subject(new Police());
    newspaper.subject(new Programmer());
    newspaper.notifyObserver();

输出为

    警察收到了一份报纸
    程序员收到了一份报纸

很显然,观察者模式减少了客户端对观察者们的依赖,甚至可以在客户端与各观察者进行通信。Java也有自带的观察者类,在java.util包下有一个Observable类和Observer接口。Observable内部原理跟上面的ConcreteSubject几乎一样,只不过加了同步块还有些方法。

总的来说,观察者模式用处有很多,JavaSwing大多都采用观察者模式,鼠标点击控件,系统就会通知该控件的点击事件响应。使用观察者模式大大分离了依赖,降低耦合,实际开发必须了解观察者模式。不足之处望指教。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值