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

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

当对象间存在一对多关系时,则使用观察者模式(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();

    }
}

原文地址:https://www.cnblogs.com/cafe3165/p/12820983.html