Java设计模式--观察者模式

import java.util.ArrayList;
import java.util.List;

/**
 * 观察者模式
 * @author 15735400536
 *
 */
public class ObserverPattern {
	public static void main(String[] args) {
		//创建一个主题
		Observer observer = new Observer("工信部");
		
		//创建四个订阅者
		Observable xiaomi = new Observable("小米");
		Observable hauwei = new Observable("华为");
		Observable vivo = new Observable("vivo");
		Observable oppo = new Observable("oppo");
		
		observer.addObservable(xiaomi);
		observer.addObservable(hauwei);
		observer.addObservable(vivo);
		observer.addObservable(oppo);
		
		observer.sendMsg("明天统一发布新机");
		
		observer.removeObservable(hauwei);
		observer.sendMsg("HuaWei提供5G技术支持");
	}
}

/**
 * 观察者
 * @author 15735400536
 *
 */
class Observer {
	/**
	 * 消息
	 */
	private String msg;
	
	/**
	 * 名称
	 */
	private String name;
	
	/**
	 * 被观察者对象列表
	 */
	private List<Observable> list = new ArrayList<Observable>();
	
	/**
	 * 添加被观察者
	 * @param observable
	 */
	public void addObservable(Observable observable) {
		list.add(observable);
	}
	
	/**
	 * 移除被观察者
	 * @param observable
	 */
	public void removeObservable(Observable observable) {
		list.remove(observable);
	}
	
	/**
	 * 向被观察者发送消息
	 * @param msg
	 */
	public void sendMsg(String msg) {
		System.out.println(this.name + "发布消息:" + msg);
		for (Observable observable : list) {
			observable.receive(msg);
		}
	}

	public Observer(String name) {
		super();
		this.name = name;
	}
	
}

/**
 * 被观察者
 * @author 15735400536
 *
 */
class Observable {
	
	/**
	 * 被观察者名称
	 */
	private String name;
	
	/**
	 * 接收消息
	 * @param msg2 
	 */
	public void receive(String msg) {
		System.out.println(this.name + "接收消息: " + msg);
	}

	public Observable(String name) {
		super();
		this.name = name;
	}
}

  执行效果:

     Java内置观察者模式:

  在java.util包中包含有基本的Observer接口和Observable抽象类.功能上和上述代码类似.不过在使用上,就方便多了,因为许多功能比如说注册,删除,通知观察者的那些功能已经内置好了.

  观察者模式的好处:

  观察者模式提供了一种对象设计,让主题和观察者之间耦合度降得很低,为什么呢?关于观察者的一切,主题只知道观察者实现了Observer接口,并不需要观察者具体的类是谁,做了什么或者其他细节.

  这样的话,由于松耦合,改变主题或者观察者其中一方,并不会影响另一方,只要他们之间的接口仍被遵守,就可以自由地改变它.

  降低对象之间的耦合度,也是面设对象设计的一个很重要的原则.

posted @ 2019-06-22 18:13  尘世间迷茫的小书童  阅读(206)  评论(0编辑  收藏  举报