设计模式学习笔记——观察者模式

本文介绍了观察者模式的基本概念,包括其定义、角色划分以及应用场景。通过具体的代码示例,展示了如何实现观察者模式,帮助读者理解该模式在软件设计中的作用。

1.基本简介

        观察者模式(又被称作发布-订阅模式)是一种软件设计模式,在此模式中,一个目标可以管理所有依赖于它的观察者,当目标本身的状态改变时主动向所有观察者发出通知。

        观察者模式将观察者和被观察的对象分开。面向对象设计的一个原则是单一职责原则,也就是说一个类只负责一种职责。观察者模式在模块之间划定了清晰的界限,提高了应用程序的可维护性和可重用性。

2.模式中的角色

        2.1 抽象主题:它把所有观察者对象的引用保存到一个聚集里,每个主题都可以有任何数量的观察者。抽象主题提供一个接口,可以增加或者删除观察者对象。

      2.2 具体主题:将有关状态存入具体观察者对象,在具体主题内部状态改变事,给所有注册过的观察者发出通知。

      2.3 抽象观察者:为所有的具体观察者定义的一个接口,在得到具体主题通知时更新自己。

      2.4 具体观察者:实现抽象观察者角色所定义的更新接口,已便更改本身的状态

3.观察者模式的代码

    //抽象主题角色
    public interface IDataObservable {

    // 增加观察者
    public void registerDataObserver(IDataObserver dataObserver);
     
    // 移除观察者
    public void unRegisterDataObserver(IDataObserver dataObserver);
    
    // 向观察者(们)发出通知
    public void notifyAllObserver();

    // 观察者(们)收到通知后获取信息
    public Object getObserverData();
    
    }

  

    // 抽象观察者类,为所有具体观察者定义一个接口,在得到通知时更新自己
    public interface IDataObserver {
    
    public void update(IDataObservable dataObservable);
    
    }


    // 具体观察者或具体通知者,将有关状态存入具体观察者对象;在具体主题的内部状态改变时,给所有登记过的观察者发出通知。具体主题角色通常用一个具体子类实现。
   public class ConcreteSubject implements IDataObservable
   {
        private List<IDataObserver> mObserver=new ArrayList<IDataObserver>();
        private Object mObject;
    
        @Override
        public void registerDataObserver(IDataObserver dataObserver) {
            mObserverList.add(dataObserver);
        }
    
        @Override
        public void unRegisterDataObserver(IDataObserver dataObserver) {
           mObserver.remove(mObserver);
        }

        @Override
        public void notifyAllObserver() {
         for (IDataObserver observer : (ArrayList<IDataObserver>) mObserverList.clone()) {
                observer.update(this);
         }
        }

        @Override
        public Object getObserverData() {
            return mObject;
        }

    }
    // 具体观察者,实现抽象观察者角色所要求的更新接口,已是本身状态与主题状态相协调
    public class ConcreteObserver implements IDataObserver
    {

      public ConcreteObserver()
      {
       
      }
      // 实现抽象观察者中的更新操作
       @Override
      public void update(IDataObservable dataObservable) {

      }
    }
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值