23种设计模式之观察者模式

观察者模式 (Observer)

观察者属于行为型模式,其目的就是定义对象间的一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。

画图简单分析一下观察者模式一步一步的演化过程:

1、图一,最简单的两个观察者A、B监听一个主题Subject;
图一

2、由于主题直接耦合观察者,因此产生了图二模式;

3、由于图二中主题不具有复用性,因此产生了图三模式;

4、形成最终版,其中:

Subject:被观察的对象接口,一个Subject可以有多个IObserver;

NewsPublisher:具体被观察对象,状态发生改变时会发送通知给所有注册的观察者;

IObserver:观察者接口,在被观察对象发生改变时被调用;

Customer、TV:具体观察者。

具体代码

//观察者接口
public interface IObserver {
    void update(Subject subject,Object args);
}
public class Customer implements IObserver {
    @Override
    public void update(Subject subject, Object args) {
        System.out.println("Customer 获得了新消息 ["+ args +"]");
    }
}
public class TV implements IObserver {
    @Override
    public void update(Subject subject, Object args) {
        System.out.println("TV 获得了新消息 ["+ args +"]");
    }
}
public abstract class Subject {
    private Vector<IObserver> observers;
    public Subject(){
        observers = new Vector<>();
    }
    //增加监听器
    public synchronized void addObserver(IObserver observer){
        observers.add(observer);
    }
    //删除监听器
    public synchronized void removeObserver(IObserver observer){
        observers.remove(observer);
    }
    //删除所有监听器
    public synchronized void removeObservers(IObserver observer){
        observers.clear();
    }
    //通知方法
    public synchronized void notifyObservers(Object args){
        for(IObserver observer : observers){
            observer.update(this,args);
        }
    }
}
public class NewsPublisher extends Subject{
    private String news;

    public void setNews(String news) {
        this.news = news;
        //通知监听器
        this.notifyObservers(news);
    }
}
public class Client {
    public static void main(String[] args) {
        NewsPublisher newsPublisher = new NewsPublisher();

        //增加监听器
        newsPublisher.addObserver(new TV());
        newsPublisher.addObserver(new Customer());

        //改变主题内容
        newsPublisher.setNews("北京今天下雪了");
    }
}

测试结果

总结

观察者模式适用于一对多的依赖关系,其中一个对象状态的改变将影响所有其他对象。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值