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