zoukankan      html  css  js  c++  java
  • [Design Pattern] Observer Pattern 简单案例

    Observer Pattern,即观察者模式,当存在一对多关系,例如一个对象一有变动,就要自动通知被依赖的全部对象得场景,属于行为类的设计模式。

    下面是一个观察者模式的简单案例。

    Observer 定义观察者的接口,定义需要观察的对象,已经被通知的接口。BinaryObserver, OctalObserver, HexaObserver 各自实现了 Observer 接口。

    Subject 是被观察的对象,记录了观察该对象的观察者列表,自身有变动,即可通知观察者列表中的各个观察者。

    代码实现

    Observer 接口,定义了被通知的方法,定义了观察的对象。

    public abstract class Observer {
    
        protected Subject subject;
        
        public abstract void update(int value);
    }

    BinaryObserver, OctalObserver, HexaObserver 实现了 Observer 接口,实现了具体的被通知方法。

    public class BinaryObserver extends Observer {
    
        public BinaryObserver(Subject subject){
            this.subject = subject;
            subject.attach(this);
        }
    
        @Override
        public void update(int value) {
            System.out.println("BinaryObserver " + Integer.toString(value, 2));
        }    
    }
    public class OctalObserver extends Observer {
    
        public OctalObserver(Subject subject){
            this.subject = subject;
            subject.attach(this);
        }
        
        @Override
        public void update(int value) {
            System.out.println("octal Observer update " + Integer.toString(value, 8));
        }
    }
    public class HexaObserver extends Observer {
    
        public HexaObserver(Subject subject){
            this.subject = subject;
            subject.attach(this);
        }
        
        @Override
        public void update(int value) {
            System.out.println("hexa Observer update " + Integer.toString(value, 16));
        }
    }

    Subject 是被观察的对象,内含一个观察本对象的观察者名单

    public class Subject {
        
        private List<Observer> observers = new LinkedList<>();
        
        private int state;
    
        public int getState() {
            return state;
        }
    
        public void setState(int state) {
            this.state = state;
            this.notifyAllObservers();
        }
        
        public void attach(Observer observer){
            observers.add(observer);
        }
        
        public void notifyAllObservers(){
            for (Observer observer : observers){
                observer.update(state);
            }
        }
    }

    演示代码,每次更新 Subject 对象的属性,Subject 都会通知到观察它的观察者

    public class ObserverPatternDemo {
    
        public static void main(){
            
            Subject subject = new Subject();
            
            new BinaryObserver(subject);
            new OctalObserver(subject);
            new HexaObserver(subject);
    
            subject.setState(17);
            subject.setState(9);    
        }
    }

    参考资料

    Design Patterns - Observer Pattern, TutorlsPoint

  • 相关阅读:
    收藏的 30 个CSS 代码段
    Power designer 15生成sql server 2005/2008列注释
    华为网盘
    敏捷宣言(一)
    敏捷宣言(三) Scrum是一种敏捷实践
    敏捷宣言(二) 何为敏捷
    我也曾哭过[转]
    你以为我穷,不好看,就没有感情吗?[转]
    关于异性朋友
    Gone With the Wind[转]
  • 原文地址:https://www.cnblogs.com/TonyYPZhang/p/5515938.html
Copyright © 2011-2022 走看看