常用的设计模式——观察者设计模式?和发布者-订阅者设计模式的区别

1. 观察者设计模式

观察者把自己“绑定”至目标,当目标发生变化时,目标“通知”观察者,然后观察者进行相应操作。你有没有觉得这种设计模式更像发布-订阅设计模式?其实这种设计模式和发布-订阅模式最大的区别就是观察者模式是目标发生变化,目标直接“通知”观察者;而发布-订阅模式中发布者和订阅者之间并没有直接联系,中间通过“消息中心”连接。

 

3. 代码实现

3.1 目标类和观察者接口代码如下。

3.2 观察者两个实现类:StringObserverImpl和IntegerObserverImpl,代码如下。

3.3 测试类及运行结果如下。

 

 

附录:代码

package observer;

import java.util.ArrayList;

public class Goal {
    private Object msg;
    private final ArrayList<Observer> observers = new ArrayList<>();

    public Object getMsg() {
        return msg;
    }

    public void notify(Object msg) {
        this.msg = msg;
        // 目标发送消息时,调用观察者的方法(相当于通知观察者),观察者根据消息执行相应操作
        for(Observer ob: observers){
            ob.execute();
        }
    }

    public ArrayList<Observer> getObservers() {
        return observers;
    }
}







package observer;

public interface Observer {
    void observer(Goal goal);
    void execute();
}






package observer;

public class StringObserverImpl implements Observer {
    private Goal goal;

    @Override
    public void observer(Goal goal) {
        this.goal = goal;
        // 当前观察者观察了当前目标,之后目标要向观察者发送通知,
        // 所以要将当前观察者加入目标的观察者列表中
        this.goal.getObservers().add(this);
    }

    @Override
    public void execute() {
        // 不同观察者接收不同的消息
        if(goal.getMsg() instanceof String){
            System.out.println("StringObserverImpl recive " + goal.getMsg());
        }
    }
}







package observer;

public class IntegerObserverImpl implements Observer {
    private Goal goal;

    @Override
    public void observer(Goal goal) {
        this.goal = goal;
        this.goal.getObservers().add(this);
    }

    @Override
    public void execute() {
        if(goal.getMsg() instanceof Integer){
            System.out.println("IntegerObserverImpl recive " + goal.getMsg());
        }
    }
}







package observer;


public class ObserverTest {
    public static void main(String[] args) {
        // 创建String消息观察者和Integer消息观察者以及目标
        StringObserverImpl stringObserver = new StringObserverImpl();
        IntegerObserverImpl integerObserver = new IntegerObserverImpl();
        Goal goal = new Goal();

        // 让String观察者和Integer观察者观察目标goal
        stringObserver.observer(goal);
        integerObserver.observer(goal);

        // 目标分别发送两种类型消息
        goal.notify("abc");
        goal.notify(123);
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值