java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > Java观察者模式

Java设计模式之观察者模式

作者:啊几

这篇文章主要介绍了Java设计模式之观察者模式,观察者模式,是一种行为性模型,又叫发布-订阅模式,他定义对象之间一种一对多的依赖关系,使得当一个对象改变状态,则所有依赖于它的对象都会得到通知并自动更新,需要的朋友可以参考下

什么是观察者模式

观察者模式职责

观察者模式主要用于1对N的通知。当一个对象的状态变化时,他需要及时告知一系列对象,令他们做出相应。 实现有两种方式:

应用实例

现实中有一个金额变化以后,会有短信提示和支付宝提示的例子,短信和支付宝就是金额变化的观察者。

传统模式

金额数据类

public class MoneyData {
    private BigDecimal amount;
    private SMS sms;

    MoneyData(BigDecimal value){
        amount = value;
        sms = new SMS();
    }

    public void increase(BigDecimal value){
        amount = amount.add(value);
        sms.sendMsg("通知:余额+"+value+",现余额为:"+amount);
    }

    public void decrease(BigDecimal value){
        amount = amount.subtract(value);
        sms.sendMsg("通知:余额-"+value+",现余额为:"+amount);
    }
}

短信类

public class SMS {
    public void sendMsg(String str){
        System.out.println("短信"+str);
    }
}

客户端类

public class Client {
    public static void main(String[] args) {

        MoneyData moneyData = new MoneyData(new BigDecimal("5.20"));
        moneyData.increase(new BigDecimal("13.14"));
        moneyData.decrease(new BigDecimal("13.14"));
    }
}

/**
 * 短信通知:余额+13.14,现余额为:18.34
 * 短信通知:余额-13.14,现余额为:5.20
 */

传统模式扩展性十分差,如果新增一个支付宝观察者,需要修改金额数据类,增加一个成员变量。

违反了ocp原则(开闭原则)。可以通过观察者模式修改,让观察者放入一个List列表中

观察者模式

Subject抽象类

public abstract class Subject {

    protected List<Observer> observers = new LinkedList<>();

    public void registerObserver(Observer o) {
        observers.add(o);
    }

    public void removeObserver(Observer o) {
        if(observers.contains(o)){
            observers.remove(o);
        }
    }

    public abstract void notifyObservers(String changeValue);

}

Subject 的具体实现类

public class MoneyData extends Subject{

    private BigDecimal amount;


    MoneyData(BigDecimal value){
        this.amount = value;
    }
    public void increase(BigDecimal value){
        amount = amount.add(value);
        notifyObservers("+"+value);
    }

    public void decrease(BigDecimal value){
        amount = amount.subtract(value);
        notifyObservers("-"+value);
    }
    @Override
    public void notifyObservers(String changeValue) {
        for (Observer observer : observers) {
            observer.sendMsg("通知:余额"+changeValue+",现余额为"+amount);
        }
    }
}

Observer(观察者)接口

public class SMS implements Observer{
    @Override
    public void sendMsg(String msg) {
        System.out.println("短信"+msg);
    }
}

Observer(观察者)的两个具体实现类

public class SMS implements Observer{
    @Override
    public void sendMsg(String msg) {
        System.out.println("短信"+msg);
    }
}
public class Alipay implements Observer{
    @Override
    public void sendMsg(String msg) {
        System.out.println("支付宝"+msg);
    }
}

客户端类

public class Client {
    public static void main(String[] args) {

        MoneyData moneyData = new MoneyData(new BigDecimal("13.14"));
        moneyData.registerObserver(new SMS());
        moneyData.increase(new BigDecimal("52.00"));
        moneyData.decrease(new BigDecimal("52.00"));
        moneyData.registerObserver(new Alipay());
        moneyData.increase(new BigDecimal("5.20"));
        moneyData.decrease(new BigDecimal("5.20"));
    }
}
/**
 * 短信通知:余额+52.00,现余额为65.14
 * 短信通知:余额-52.00,现余额为13.14
 * 短信通知:余额+5.20,现余额为18.34
 * 支付宝通知:余额+5.20,现余额为18.34
 * 短信通知:余额-5.20,现余额为13.14
 * 支付宝通知:余额-5.20,现余额为13.14
 */

应用场景

到此这篇关于Java设计模式之观察者模式的文章就介绍到这了,更多相关Java观察者模式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文