设计模式-观察者模式 实现

Posted 粗鲁师太

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式-观察者模式 实现相关的知识,希望对你有一定的参考价值。

观察者模式:

  已一对多的方式,通过制定一个主题,使多个不同的订阅者能时时的接收到最新的消息。

 

定义一个主题:

 

主题中处理基本的添加/删除 订阅者  消息发布 还加入一个change锁  可以负责消息发布的控制,将灵活的控制消息的发布,减少不必要的消息传播。

消息的发布主要是依靠接口的特性传播,通过实现一个订阅者接口来设定订阅者,主题不需要具体的订阅者是谁,只需要在消息更新时对这个接口的所有实现发布即可。

public interface Subjects {

	void add(Object obj);

	void remove(Object obj);

	void notifyObserver();

	void setMessage(String msg);

	void setChange();

}

  

public class Subject implements Subjects{
	
	private ArrayList<Object> observers;
	
	private String message;
	
	private boolean lock;
	
	public Subject() {
		observers = new ArrayList<>();
	}
	
	@Override
	public void add(Object obj) {
		observers.add(obj);
	}
	
	@Override
	public void remove(Object obj) {
		int i = observers.indexOf(obj);
		if (i > 0) {
			observers.remove(obj);
		}
	}
	
	@Override
	public void notifyObserver() {
		if (lock) {
			for (int i = 0; i < observers.size(); i++) {
				Observers observer = (Observers)observers.get(i);
				observer.update(message);
			}
			lock = false;
		}
	}
	
	public void change() {
		setChange();
		notifyObserver();
	}
	
	@Override
	public void setMessage(String msg) {
		this.message = msg;
		change();
	}
	
	@Override
	public void setChange() {
		lock = true;
	}
}

  

 

订阅者

 主题消息的发布与订阅者之间有个共同的方法,通过这个方法订阅者来接受发布出来的消息。 单纯的实现订阅接口但是不重写方法而是自己编写另一个方法就无法实现消息的接收了。

public interface Observers {

	public void update (String message);
}

  

 

public class Observer implements Observers{
	
	public Observer(Subject s) {
		s.add(this);
	}
	
	@Override
	public void update(String message) {
		System.out.println("订阅主题发布的消息:" + message);
	}

}

  

 另外java提供了Observer和Observable现成的api可供我们直接使用,setchange的想法也是参考这api的。

以上是关于设计模式-观察者模式 实现的主要内容,如果未能解决你的问题,请参考以下文章

js设计模式之实现观察者模式实例代码

20-观察者(Observer)模式Ruby实现

设计模式 -- 观察者模式

观察者模式/ java实现附代码 /

设计模式之单例模式

Java设计模式-观察者模式