zoukankan      html  css  js  c++  java
  • 大话设计模式笔记 观察者模式

    观察者模式又称发布-订阅 (Publish/Subscribe)模式。

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

    感觉书上写的有点累赘,我重写了一下结构。

    package observer;
    
    import java.util.ArrayList;
    
    /**
     * 被观察者接口,或称通知者。
     *
     */
    public class Subject {
    
        // 用ArrayList 维护一对多的映射关系
        private ArrayList<Observer> observerList = new ArrayList<Observer>();
    
        // 被观察者状态
        private String subjectState;
        
        public String getSubjectState() {
            return subjectState;
        }
    
        public void setSubjectState(String subjectState) {
            this.subjectState = subjectState;
            System.out.println("ConcreteSubject setSubjectState:" + subjectState);
            inform();
        }
    
        public void add(Observer observer) {
            observerList.add(observer);
        }
    
        public void remove(Observer observer) {
            observerList.remove(observer);
        }
    
        // 通知
        public void inform() {
            for (Observer observer : observerList) {
                observer.update(this);
            }
        }
        
    }
    package observer;
    
    /**
     * 抽象观察者类,在的到通知时更新自己。
     */
    public abstract class Observer {
    
        public abstract void update(Subject Subject);
        
    }
    package observer;
    
    /**
     * 通知者具体实现类
     *
     */
    public class ConcreteSubject extends Subject {
    
    
    
    }
    package observer;
    
    public class ConcreteObserver extends Observer {
    
        private String name;
        private String observerState;
    
        public ConcreteObserver(String name) {
            super();
            this.name = name;
        }
    
        @Override
        public void update(Subject Subject) {
            // 意思应该是省略了,根据通知者状态做出的观察者状态
            observerState = Subject.getSubjectState();
            System.out.println("Observer:" + name + " observerState:"
                    + observerState);
        }
    
        public static void main(String[] args) {
            ConcreteSubject concreteSubject=new ConcreteSubject();
    
            concreteSubject.add(new ConcreteObserver("A"));
            concreteSubject.add(new ConcreteObserver("B"));
            concreteSubject.setSubjectState("ABC");
        }
    }

    不足之处,Subject 还是依赖Observer,而Observer没有相应的update接口,或者相应的update名字不相同的时候,inform的功能完成不了。

    实现能动态的根据updata方法来实现inform。这里用到了事件委托。

    委托就是一种引用方法的类型。一旦为委托分配了方法,委托将与该方法具有完全相同的行为。委托方法的使用可以像其他任何方法一样具有参数和返回值。委托可以看作是对函数的抽象,是函数的‘类’,委托的实例将代表一个具体的函数。

    委托对象所搭载的所有方法必须具有相同的原形和形式,也就是拥有相同的参数列表和返回值类型。

    用Java动态代理实现委托模式

    http://www.iteye.com/topic/29541 

  • 相关阅读:
    ubuntu16.04 下anaconda3安装教程
    conda基本知识
    caffe学习三:使用Faster RCNN训练自己的数据
    labelImg
    caffe学习二:py-faster-rcnn配置运行faster_rcnn_end2end-VGG_CNN_M_1024 (Ubuntu16.04)
    python开发中的高级技巧
    Splash 渲染引擎简介
    Splash 渲染引擎简介
    scrapy框架使用splash渲染引擎爬取动态页面
    scrapy框架使用splash渲染引擎爬取动态页面
  • 原文地址:https://www.cnblogs.com/linkarl/p/4840433.html
Copyright © 2011-2022 走看看