• 1.17(设计模式)观察者模式


    观察者模式定义了对象间一对多的关系,当一个对象状态发生变化时,所有依赖于该对象的对象也将发生变化。

    例如需要显示一个数字(Subject)的十进制(Observer )和二进制(Observer ),当这个数发生变化时,对应显示的十进制和二进制数也要发生变化。

    这就可以使用观察者模式,显示十进制数和二进制数依赖于具体的数字,当具体数字发生变化时,依赖对象也发生变化。

    Subject

    import java.util.ArrayList;
    import java.util.List;
    
    public class Subject {
        private List<Observer> observers = new ArrayList<Observer>();
        
        private int state;//具体的数字
        
        public int getState() {
            return state;
        }
        
        
        public void setState(int state) {
            this.state = state;
            notifyAllObserver();//更新具体数字时同时通知Observer更新状态
        }
        
        public void attach(Observer observer) {//添加依赖对象(二、十进制显示)
            this.observers.add(observer);
        }
        
        public void notifyAllObserver() {//通知所有Observer更新
            for(Observer observer : observers) {
                observer.update();
            }
        }
    }

    Observer

    Observer是依赖于Subject的对象,当Subject发生变化时,依赖的Observer也发生变化。

    public abstract class Observer {
        protected Subject subject;//Observer依赖的对象
        public abstract void update();//Observer更新
    }

    二进制显示(Observer)

    public class BinaryObserver extends Observer{
        
        public BinaryObserver(Subject subject) {//绑定subject,当subject发生变化时,该对象也发生变化。
            this.subject = subject;
            this.subject.attach(this);//将当前对象(Observer)添加到subject中的observers 
     } 

    @Override
    public void update() { //subject发生变化,调用notifyAllObsever时更新显示数据
      System.out.println(
    "BinaryObserver:" + Integer.toBinaryString(subject.getState()));
      }
    }

    十进制显示(Observer)

    public class OctalObserver extends Observer{
        
        
        
        public OctalObserver(Subject subject) {//绑定subject,当subject发生变化时,该对象也发生变化。
            this.subject = subject;
            this.subject.attach(this);//将当前对象(Observer)添加到subject中的observers 
        }
    
        @Override
        public void update() {//subject发生变化,调用notifyAllObsever时更新显示数据
            System.out.println("OctalObserver:" + subject.getState());
        }
    
    }

    Main

    public class Main {
        public static void main(String[] args) {
            //创建subject,Observer依赖于subject,subject发生变化时,observer同时发生变化
            Subject subject = new Subject();
            //将object与subject绑定
            new BinaryObserver(subject);
            new OctalObserver(subject);
            //subject发生变化时,object同时发生变化
            subject.setState(10);
            subject.setState(20);
        }
    }
    运行结果:
    BinaryObserver:1010 OctalObserver:10 BinaryObserver:10100 OctalObserver:20

    参考资料:

    https://www.runoob.com/design-pattern/observer-pattern.html

  • 相关阅读:
    版本控制工具 svn 一
    测试用例 (一)
    Jmeter (四) 关联
    Jmeter (三) 集合点 、检查点 (断言)
    Jmeter (二) 参数化
    Jmeter (一) 安装
    自动化测试 selenium 测试软件安装
    postman 接口测试(一)
    PHP使用Redis的Pub/Sub(发布订阅)命令
    idea控制台乱码问题
  • 原文地址:https://www.cnblogs.com/huang-changfan/p/11045140.html
Copyright © 2020-2023  润新知