`
greemranqq
  • 浏览: 966453 次
  • 性别: Icon_minigender_1
  • 来自: 重庆
社区版块
存档分类
最新评论
阅读更多

观察者模式,老生常谈的问题了,相信大家都有所了解,这里用通俗的语言简单介绍一下!

 

概念:

      顾名思义,"观察者" 存在,必然存在被观察者。JAVA 里面我们统称为对象。简单的说:比如

1.你参加高考,肯定会有监考老师,那么老师就是观察者,你就是被观察者。

2.当然观察者可以不只一个,可以存在多个观察者,同理被观察者也可以是多个,也就是多个老师观察多个学生。

3.老师肯定会观察你的考试是否存在zuobi行为,一旦发现任何zuobi行为,有的老师没收你的试卷,

     有的老师可能去上报,也就是说观察者会根据你的行为采取不同的措施,来共同处理你zuobi这一行为。

4.特征:

     你会发现观察者和被观察者,相对独立,学生考试,监考老师绝对不会打扰

     同时观察者或者被观察者可以被重复利用,或者替换,也就是说,如果考试中途出现事故,可以有其他

     老师代为监考。

     

 

 

下面我来简单设计一下。

1.我们要有学生:Students ,同时有考试和zuobi的能力:exam(),cheat()

2.我们要有老师:TeachearA,B,同时具有自己实现的行为:没收试卷,和上报

3.虽然不同观察者(老师),行为不同,但是他们都是内部实现不同,这里我们统一独立出来一个接口Observer,方法soSomething(),让观察者自己去实现

4.基本对象有了,我们还需要一个管理观察者 和 被观察者的监控管理器Observable,方便我们进行处理

 

看代码:

 

// 被观察者,学生
public class Students extends Observable{

	
	// 被观察的行为--考试
	public void exam(){
		System.out.println("开始考试!");
		// 开始zuobi
		if(cheat()){
			// 激活状态,并 执行观察者操作
			super.setChanged();
			super.notifyObservers();
		}
	}
	
	// 被观察的行为--zuobi
	private boolean cheat(){
		System.out.println("开始zuobi啦");
		return true;
	}
}

 

// 这是一个老师观察者类
// 假设老师A ,发现了会没收试卷
public class TeacherA implements Observer{
	
	@Override
	public void doSomething(Observable ob, Object o) {
		System.out.println(TeacherA.class.getName()+"没收试卷!");
	}
}

 

public class TeacherB implements Observer{

	@Override
	public void doSomething(Observable ob, Object o) {
		System.out.println(TeacherB.class.getName()+"上报考试中心!");
	}
}

 

// 这个是观察者,接口,方便我们去实现 各个观察者的动作
public interface Observer {
	// 参数,可以在实现过程中,获得其他信息
	// Observable:管理器,Object 被观察者
	public void doSomething(Observable ob,Object o);
}

 

// 观察者的一个管理器
public class Observable {
	
	private boolean isChanged = false;
	
	// 激活观察者触发 条件
	public synchronized void setChanged(){
		isChanged = true;
	}
	
	// 观察者集合,里面可以存放多个老师,Vector 是线程安全的
	private Vector obs;
	public Observable(){
		obs = new Vector();
	}
	
	
	// 添加一个观察者
	public void addObserver(Observer o){
		if(o == null)
			 throw new NullPointerException();
		if(!obs.contains(o)){
			obs.addElement(o);
		}
	public void notifyObservers(){
		if(isChanged){
			Object[] array = obs.toArray();
			for(Object o : array){
				Observer ob = (Observer) o;
					ob.doSomething(this, o);
			}
		}
	}
	
	// 返回观察者的个数
	public int countObservers(){
		return obs.size();
	}
}

 

public class Test{

	public static void main(String[] args) {
		Students s = new Students();
		TeacherA a = new TeacherA();
		TeacherB b = new TeacherB();
		s.addObserver(a);
		s.addObserver(b);
		s.exam();
	}

}

 

0
0
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics