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();
    
        }
    }
    
    
  • 相关阅读:
    不容易发现的错误
    Element-UI 笔记
    工作中常用的操作/经验
    记录一些前端强大的插件
    HttpContext.Current.ApplicationInstance.Application vs HttpContext.Current.Application
    What Is a Replay Attack?
    ASP.NET's Data Storage Objects
    JSON Web Token (JWT) RFC7519
    Session-State Modes
    After change SessionID data in Session variables is lost
  • 原文地址:https://www.cnblogs.com/cafe3165/p/12820983.html
Copyright © 2011-2022 走看看