zoukankan      html  css  js  c++  java
  • 设计模式——观察者模式

      有时被称作发布/订阅模式,观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。

    模式中的角色
      抽象主题(Subject):它把所有观察者对象的引用保存到一个聚集里,每个主题都可以有任何数量的观察者。抽象主题提供一个接口,可以增加和删除观察者对象。
      具体主题(ConcreteSubject):将有关状态存入具体观察者对象;在具体主题内部状态改变时,给所有登记过的观察者发出通知。
      抽象观察者(Observer):为所有的具体观察者定义一个接口,在得到主题通知时更新自己。
      具体观察者(ConcreteObserver):实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题状态协调。

    优点

      观察者模式解除了主题和具体观察者的耦合,让耦合的双方都依赖于抽象,而不是依赖具体。从而使得各自的变化都不会影响另一边的变化。

    缺点

      依赖关系并未完全解除,抽象通知者依旧依赖抽象的观察者。

    适用场景

      1、当一个对象的改变需要给变其它对象时,而且它不知道具体有多少个对象有待改变时。
      2、一个抽象某型有两个方面,当其中一个方面依赖于另一个方面,这时用观察者模式可以将这两者封装在独立的对象中使它们各自独立地改变和复用。

    实现

      模拟一个领导(被观察角色)向员工发送命令,员工(观察者)执行的场景来进行实现。类图如下:

    ILeader定义:

    package com.lidaming.design15.observer;
    /**
     * 被监听者接口定义
     * @author admin
     *
     */
    public interface ILeader {
        public void notifyMember();
    }
    View Code

    IMember定义:

    package com.lidaming.design15.observer;
    /**
     * 观察者接口定义
     * @author admin
     *
     */
    public interface IMember {
        public void action(Leader leader);
    }
    View Code

    Leader的实现:

    package com.lidaming.design15.observer;
    
    import java.util.ArrayList;
    import java.util.List;
    
    public abstract class Leader implements ILeader {
        List<IMember> members=new ArrayList<IMember>();
        
        /**
         * 注册观察者
         * @param member
         */
        public void register(IMember member){
            members.add(member);
        }
        /**
         * 取消注册
         * @param member
         */
        public void unRegister(IMember member)
        {
            members.remove(member);
        }
        /**
         * 通知所有观察者
         */
        public void notifyMember() {
            for (IMember member : members) {
                
                member.action(this);
            }
        }
        
        public abstract String getState();
        
    }
    View Code

    ConcreteLeader的实现:

    package com.lidaming.design15.observer;
    
    public class ConcreteLeader extends Leader {
    
        @Override
        public String getState() {
            return "together";
        }
    
    }
    View Code

    ConcreteMember的实现:

    package com.lidaming.design15.observer;
    
    public class ConcreteMember implements IMember {
    
        private String name;
        
    
        
    
        public ConcreteMember(String name) {
            this.name = name;
        }
    
        public void action(Leader leader) {
            System.out.println("leader's cmd is:"+leader.getState());
            System.out.println(this.name + " begin action!");
        }
    
    }
    View Code

    场景类的实现:

    package com.lidaming.design15.observer;
    
    public class Client {
        public static void main(String[] args) {
            Leader leader = new ConcreteLeader();
            leader.register(new ConcreteMember("Andy"));
            leader.register(new ConcreteMember("Zero"));
            
            leader.notifyMember();
        }
    }
    View Code

    参考

    http://www.cnblogs.com/mengdd/archive/2013/02/07/2908929.html
    http://www.cnblogs.com/wangjq/archive/2012/07/12/2587966.html

  • 相关阅读:
    oracle 时间加减法 与C#
    BCB编写DLL
    面试题:产生一个长度为100的数组,为数组中的每一项随机填充1100之间的数并且保证不重复 (C#实现)
    公司内部员工运算测试题
    MVP 模式是否应该这样修改?
    MVP 模式是否应该这样修改2?
    面试题:一列数的规则如下: 1、1、2、3、5、8、13、21、34...... 求第30位数是多少, 用递归算法实现(C#)
    使用游标进行跨数据库循环更新
    Hive 安装配置流程
    Scala的基本语法:集合应用
  • 原文地址:https://www.cnblogs.com/hpuCode/p/5421710.html
Copyright © 2011-2022 走看看