zoukankan      html  css  js  c++  java
  • 数据双向同步之观察者模式

    数据双向同步之观察者模式

    当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知它的依赖对象。观察者模式属于行为型模式。

    这系列博客主要是为了总结项目中所用到了一些设计模式,为方便说明对其进行了简化。

    在此,我将一个虚拟对象VDevice当做是Subject,具体虚拟空调对象VAircon实现该接口;

    具体的底层设备对象UDevice当做是Observer,具体的底层空调对象Gree和Panosonic继承Observer

    /**
     * Author:cafe3165
     * Date:2020-05-03
     */
    public interface VDevice {
        void notifyAllUDevice();
        void attach(UDevice uDevice);
        void setAttribute(Double attribute);
        Double getAttribute();
        void IncreaseAttribute();
    }
    
    import java.util.ArrayList;
    import java.util.List;
    
    /**
     * Author:cafe3165
     * Date:2020-05-03
     */
    public class VAircon implements VDevice{
        private List<UDevice> uDevices = new ArrayList<>();
        //虚拟对象属性
        Double Attribute;
    
        //getter setter...
        @Override
        public void setAttribute(Double attribute) {
            this.Attribute = attribute;
        }
        @Override
        public Double getAttribute() {
            return Attribute;
        }
    
        //关键方法,升高虚拟设备某属性值并通相关设备
        @Override
        public void IncreaseAttribute() {
            Attribute += 1.0;
            notifyAllUDevice();
        }
    
        //添加相关设备
        @Override
        public void attach(UDevice uDevice) {
            uDevices.add(uDevice);
        }
    
        //通知
        @Override
        public void notifyAllUDevice() {
            for (UDevice uDevice : uDevices) {
                uDevice.update(Attribute);
            }
        }
    }
    
    /**
     * Author:cafe3165
     * Date:2020-05-03
     */
    public abstract class UDevice {
        protected VDecice vDecice;
        public abstract void update(Double attribute);
    
    
    }
    
    
    /**
     * Author:cafe3165
     * Date:2020-05-03
     */
    public class Gree extends UDevice {
        Double temperature;
    
        public Gree(VDevice vAircon, Double temperature) {
            this.temperature = temperature;
            this.vAircon = vAircon;
            this.vAircon.attach(this);
        }
    
        @Override
        public void update(Double attribute) {
            warm(attribute);
        }
        //设备自己的升温api
        private void warm(Double attribute) {
            this.temperature = attribute;
            System.out.println(this.temperature);
        }
    
    }
    
    /**
     * Author:cafe3165
     * Date:2020-05-03
     */
    public class Panasonic extends UDevice {
        Double temperature;
    
        public Panasonic(VDevice vAircon, Double temperature) {
            this.temperature = temperature;
            this.vAircon = vAircon;
            this.vAircon.attach(this);
        }
    
        @Override
        public void update(Double attribute) {
            up(attribute);
        }
        //设备自己的升温api
        private void up(Double attribute) {
            this.temperature = attribute;
            System.out.println(this.temperature);
        }
    
    
    }
    
    
    
    /**
     * Author:cafe3165
     * Date:2020-05-03
     */
    public class DeviceDemo {
        public static void main(String[] args) {
            VDevice vAircon = new VAircon();
            vAircon.setAttribute(20.0);
            UDevice gree = new Gree(vAircon, 10.0);
            UDevice panasonic = new Panasonic(vAircon, 25.0);
            vAircon.IncreaseAttribute();
    
        }
    }
    
    
  • 相关阅读:
    k8s 权限控制初探
    golang gRPC 入门
    gpushare-scheduler-extender 升级依赖引发关于 golang dep 工具的思考
    admission webhook 初探(编译篇)
    以 gpushare-device-plugin 为例,探究 Resource yaml 配置
    编译 gpushare-device-plugin
    浅谈 docker 挂载 GPU 原理
    CCF计算机职业资格认证考试题解
    优达学城机器学习工程师纳米学位项目介绍
    IEEEXtreme 极限编程大赛题解
  • 原文地址:https://www.cnblogs.com/cafe3165/p/12820983.html
Copyright © 2011-2022 走看看