设计模式-行为型模式-Observer 观察者模式

设计模式-行为型模式-Observer 观察者模式

1.简介

软件程序之间的解耦,减少相互之间的依赖关系,但是模块之间又是需要协同工作的;

观察者模式使得一个对象的状态发生改变的时候,已经预约的其他对象可以看到这一个改变;

很多事基于多态来实现;

2.角色

在这里插入图片描述

  • Subject :主题接口,通知观察者使用这个attach 方法注册, detach 注销 ,notify() 提示变更
  • ConcreteSubject:具体主题,Subject 接口的具体实现,实现观察者在链表的注册和注销,状态改变
  • Observer:观察者,当状态变更 需要做什么事情
  • ConcreteObserver:具体观察者,实现 Observer 的状态变更实现

3.场景

写个例子

设计一个钱包到账,支付宝,银行划款;

3.1.被观察者

interface Subject {
	void attach(Observer obsercer);

	void detach(Observer obsercer);

	void notifyObserver();
}

class Wallet implements Subject {
	public boolean moneyState = false;

	List<Observer> observers = new ArrayList<>();

	public boolean isMoneyState() {
		return moneyState;
	}

	public void setMoneyState(boolean moneyState) {
		this.moneyState = moneyState;
		System.out.println("钱包钱到账");
		notifyObserver();
	}

	@Override
	public void attach(Observer obsercer) {
		observers.add(obsercer);
	}

	@Override
	public void detach(Observer obsercer) {
		observers.remove(obsercer);
	}

	@Override
	public void notifyObserver() {
		for (Observer observer : observers) {
			observer.updateMoney();
		}
	}

}

3.2 观察者

interface Observer {

    void updateMoney();
}


class BankObserver implements Observer {

   @Override
   public void updateMoney() {
      System.out.println("还银行钱");
   }
}

class AliPayObserver implements Observer {

   @Override
   public void updateMoney() {
      System.out.println("还花呗钱");
   }
}

3.3 测试

	public static void main(String[] args) {
		Wallet wallet = new Wallet();
		wallet.attach(new BankObserver());
		wallet.attach(new AliPayObserver());
		wallet.setMoneyState(true);
	}

//效果是
Connected to the target VM, address: '127.0.0.1:62672', transport: 'socket'
钱包钱到账
还银行钱
还花呗钱

3.4 总结

根据这个模式有点像 责任链模式,下面来总结一下那些异同点:

相同点:都是先把观察者和处理器 添加到一个业务链表,在根据业务来做每个观察者和处理器链的遍历;

不同点:1. 责任链有一个先进后出的过程,观察者没有这个过程 ;2. 责任链可以根据处理器链路来中断后面的链路;

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值