观察者模式

观察者模式

观察者模式的主要精髓是被观察者拥有观察者的对象(本例中观察者是被观察者的类成员变量),当被观察者有所动作的时候能够调用到观察者的接口通知到它们。这些观察者们可以任意的增加删除,不影响原有的接口,符合开闭原则,即对扩展开放,对修改关闭。
将共有的接口分门别类,抽象出来做成接口模式,包括被观察事件接口,被观察者,观察者接口三个通用接口,因此想要增加和删除这些接口的实例都显得非常的容易。如下是一个实例代码:

接口类:

package new_pakage;
//被观察的一些活动,事件类
public interface IHanFeiZi {
	public void havingFun();
	public void sleep();
		
}
package new_pakage;
//观察者类
public interface Observer {
	//观察到状态、事件之后做出的反应
	public void updater(String str);
}
package new_pakage;
//被观察者类
public interface Observerable {
	public void addObsever(Observer obj);
	public void deleteObserver(Observer obj);
	void notifyObserver(String str);
}

 实现类(被观察者):

package new_pakage;

import java.util.ArrayList;

public class HanFeiZi implements IHanFeiZi, Observerable{
	//包含观察者数组成员
	private ArrayList <Observer> m_Observerlist = new ArrayList<Observer>();
	
	@Override
	public void havingFun() {
		// TODO 自动生成的方法存根
		System.out.println("韩非子:军中无以为乐,出去旅个游。。。");
		this.notifyObserver("韩非子在玩");
	}

	@Override
	public void sleep() {
		// TODO 自动生成的方法存根
		System.out.println("韩非子:好困,睡觉了。。。");
		this.notifyObserver("韩非子在睡觉");
	}

	@Override
	public void notifyObserver(String str) {
		// TODO 自动生成的方法存根
		for(Observer obs: m_Observerlist){
			obs.updater(str);	
		}
	}

	@Override
	public void addObsever(Observer obj) {
		// TODO 自动生成的方法存根
		m_Observerlist.add(obj);
	}

	@Override
	public void deleteObserver(Observer obj) {
		// TODO 自动生成的方法存根
		m_Observerlist.remove(obj);
	}

}

实现类(观察者):

package new_pakage;

public class LiSi implements Observer{

	@Override
	public void updater(String str) {
		// TODO 自动生成的方法存根
		 //观察到变化采取的措施
		System.out.println("LiSi: "+"陛下,韩非子有活动了--->"+ str);
	}

}
package new_pakage;

public class MiSi implements Observer{

	@Override
	public void updater(String str) {
		// TODO 自动生成的方法存根
		 //观察到变化采取的措施
		System.out.println("MiSi: "+"我家儿子韩非子现在的状态:"+ str);
	}
}

 

package new_pakage;

public class GiSi implements Observer{

	@Override
	public void updater(String str) {
		// TODO 自动生成的方法存
       //观察到变化采取的措施
		System.out.println("GiSi: "+"很开心啊, "+ str);
	}

}

场景类:

package new_pakage;

public class Client {
	public static void main(String[] args){
		HanFeiZi hanfeizi = new HanFeiZi();
		Observer liSi = new LiSi();
		Observer miSi = new MiSi();
		Observer giSi = new GiSi();
		
		hanfeizi.addObsever(liSi);
		hanfeizi.addObsever(miSi);
		hanfeizi.addObsever(giSi);	
		//韩非子的动作
		hanfeizi.havingFun();
		//睡觉
		//hanfeizi.sleep();
	}
}

运行结果: 

观察者模式