解决解耦的钥匙——观察者模式

  • 介绍:

观察者模式是一个使用率非常高的模式,它最常用的地方是GUI系统、订阅——发布系统。因为这个模式的一个重要作用就是解耦,将被观察者和观察者解耦,使得它们之间的依赖性更小,甚至做到毫无依赖。以GUI系统来说,应用的UI具有易变性,尤其是前期随着业务的改变或者产品的需求修改,应用界面也会经常性变化,但是业务逻辑基本变化不大,此时GUI系统需要一套机制来应对这种情况,是的UI层与具体的业务逻辑解耦,观察者模式此时就派上用场了。

  • 定义:

定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新。

  • 使用场景:
  1. 关联行为场景,需要注意的是,关联行为是可拆分的,而不是“组合”关系。
  2. 事件多级触发场景
  3. 跨系统的消息交换场景,如消息队列、事件总线的处理机制
  • 代码实现:

三个类:Subscriber(消息订阅者/观察者) DtPublicNumber(dt公众号/被观察者) Test(测试类)

package dreamtech.mode.observe;

import java.util.Observable;
import java.util.Observer;

public class Subscriber implements Observer {
	public String name;

	public Subscriber(String name) {
		this.name = name;
	}

	@Override
	public void update(Observable o, Object arg) {
		System.out.println("Observable info : " + o.toString());
		System.out.println("Hi, " + name + ", dtPublicNumber has updated, content: " + arg);

	}

}

  

package dreamtech.mode.observe;

import java.util.Observable;

public class DtPublicNumber extends Observable {

	public void postNewPublication(String content) {
		setChanged();
		notifyObservers(content);
	}

}

  

package dreamtech.mode.observe;

public class Test {

	public static void main(String[] args) {
		DtPublicNumber dt = new DtPublicNumber();
		Subscriber subscriber1 = new Subscriber("Yiqing Xu");
		Subscriber subscriber2 = new Subscriber("Tianyi Zhang");
		Subscriber subscriber3 = new Subscriber("Zewang Chen");
		dt.addObserver(subscriber1);
		dt.addObserver(subscriber2);
		dt.addObserver(subscriber3);

		dt.postNewPublication("dt is ready to recruit new members");
	}
}

  输出

Observable info : dreamtech.mode.observe.DtPublicNumber@15db9742
Hi, Zewang Chen, dtPublicNumber has updated, content: dt is ready to recruit new members
Observable info : dreamtech.mode.observe.DtPublicNumber@15db9742
Hi, Tianyi Zhang, dtPublicNumber has updated, content: dt is ready to recruit new members
Observable info : dreamtech.mode.observe.DtPublicNumber@15db9742
Hi, Yiqing Xu, dtPublicNumber has updated, content: dt is ready to recruit new members

  

posted @ 2019-09-20 17:29  zty-lyq  阅读(214)  评论(0编辑  收藏  举报