您的位置:首页 > 编程语言 > Java开发

Java设计模式-观察者模式

2017-06-19 21:11 489 查看
观察者模式中,一个被观察者管理所有相依于它的观察者物件,并且在本身的状态改变时主动发出通知。这通常通过呼叫各观察者所提供的方法来实现。此种模式通常被用来实现事件处理系统。

角色

抽象被观察者角色:把所有对观察者对象的引用保存在一个集合中,每个被观察者角色都可以有任意数量的观察者。被观察者提供一个接口,可以增加和删除观察者角色。一般用一个抽象类和接口来实现。

抽象观察者角色:为所有具体的观察者定义一个接口,在得到主题的通知时更新自己。

具体被观察者角色:在被观察者内部状态改变时,给所有登记过的观察者发出通知。具体被观察者角色通常用一个子类实现。

具体观察者角色:该角色实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题的状态相协调。通常用一个子类实现。如果需要,具体观察者角色可以保存一个指向具体主题角色的引用。

适用场景

1) 当一个抽象模型有两个方面, 其中一个方面依赖于另一方面。将这二者封装在独立的对象中以使它们可以各自独立地改变和复用。

2) 当对一个对象的改变需要同时改变其它对象, 而不知道具体有多少对象有待改变。

3) 当一个对象必须通知其它对象,而它又不能假定其它对象是谁。换言之, 你不希望这些对象是紧密耦合的。

应用:通过一个简单的例子,描述学生给玩游戏和看电影的学生把风,如果看见老师来了,则通知玩游戏和看电影的学生老师来了,该学习了,老师没看见玩游戏和看电影的学生做小动作。如果没看见老师,则玩游戏和看电影的学生被老师看到。

下面是源码:

1 Observer 抽象的观察者

package com.whf.observer;
/*
*  @author:辰
*  @E-mail:15538323378@163.com
*  @2017年6月19日下午5:44:38
*/

/**
* 抽象的观察者
* @author WU
*
*/
public interface Observer {
/**
* 更新接口状态
* @param state
*/
public void update(String state);
}


2 Watched 抽象的被观察者

pac
4000
kage com.whf.observer;
/*
*  @author:辰
*  @E-mail:15538323378@163.com
*  @2017年6月19日下午5:45:39
*/

/**
* 抽象的 【被观察者】
* 声明的方法(添加、移除观察者,通知观察者)
* @author WU
*
*/
public interface Watched {

public void addWatcher(Observer observer);

public void removeWatcher(Observer observer);

public void notifyWatchers();

}


3 PlayGameStudent类

package com.whf.observer;
/*
*  @author:辰
*  @E-mail:15538323378@163.com
*  @2017年6月19日下午5:50:05
*/

/**
* 具体的观察者
* 玩游戏的学生
* @author WU
*
*/
public class PlayGameStudent implements Observer {

@Override
public void update(String state) {
// TODO Auto-generated method stub
System.out.println("玩游戏的学生,老师来了,"+state);

}

}


4 WactchMoveStudent 类

package com.whf.observer;
/*
*  @author:辰
*  @E-mail:15538323378@163.com
*  @2017年6月19日下午5:50:05
*/

/**
* 具体的观察者
* 看电影的学生
* @author WU
*
*/
public class WactchMoveStudent implements Observer {

@Override
public void update(String state) {
// TODO Auto-generated method stub
System.out.println("看电影的学生,老师来了,"+state);

}

}


5 Sutdent 类

package com.whf.observer;

import java.util.ArrayList;

/*
*  @author:辰
*  @E-mail:15538323378@163.com
*  @2017年6月19日下午5:47:27
*/

/**
* 具体的观察者
* @author WU
*
*/
public class Student implements Watched{

/**
* 用来保存注册的观察者对象
*/
private ArrayList<Observer> observe = new ArrayList<Observer>();

private String state;

public Student(String state) {
super();
this.state = state;
}

public void setState(String state) {
this.state = state;
this.notifyWatchers();
}

/**
* 注册观察者对象
*  观察者对象
*/
@Override
public void addWatcher(Observer observer) {
// TODO Auto-generated method stub
observe.add(observer);
}

/**
* 删除观察者对象
* 观察者对象
*/
@Override
public void removeWatcher(Observer observer) {
// TODO Auto-generated method stub
observe.remove(observer);
}

/**
* 通知所有注册的观察者对象
*/
@Override
public void notifyWatchers() {
// TODO Auto-generated method stub
for(Observer observer : observe){
observer.update(state);
}
}

}


6 Teacher 类

package com.whf.observer;

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

/*
*  @author:辰
*  @E-mail:15538323378@163.com
*  @2017年6月19日下午6:52:45
*/

/**
* 具体的被观察者
* @author WU
*
*/
public class Teacher implements Watched{

/**
* 用来保存注册的观察者对象
*/
private List<Observer> list = new ArrayList<Observer>();

/**
* 状态
*/
private String state;

public Teacher(String state) {
super();
this.state = state;
}

public void setState(String state) {
this.state = state;
this.notifyWatchers();
}

/**
* 注册观察者对象
*  观察者对象
*/
@Override
public void addWatcher(Observer observer) {
// TODO Auto-generated method stub
list.add(observer);
}

/**
* 删除观察者对象
* 观察者对象
*/
@Override
public void removeWatcher(Observer observer) {
// TODO Auto-generated method stub
list.remove(observer);
}

/**
* 通知所有注册的观察者对象
*/
public void notifyWatchers() {
// TODO Auto-generated method stub
for(Observer observer : list){
observer.update(state);
}
}

}


7 Client 类

package com.whf.observer;
/*
*  @author:辰
*  @E-mail:15538323378@163.com
*  @2017年6月19日下午7:33:58
*/

/**
* 客户端测试类
* @author WU
*
*/
public class Client {

public static void main(String[] args) {

//被观察的学生
Student student = new Student("");

//被观察的老师
Teacher teacher = new Teacher("");

//玩游戏的学生
PlayGameStudent playGameStudent = new PlayGameStudent();

//看电影的学生
WactchMoveStudent wactchMoveStudent = new WactchMoveStudent();

// 注册观察者对象
student.addWatcher(playGameStudent);
student.addWatcher(wactchMoveStudent);

// 注册观察者对象
teacher.addWatcher(playGameStudent);
teacher.addWatcher(wactchMoveStudent);

//情况一 : 学生看见老师,状态发生变化
System.out.println("--------学生看见老师来了----------");
student.setState("学生看见老师来了,并进行提醒,老师没看见 ^_^");

System.out.println("\n");

//情况二 : 学生未老师,状态发生变化
System.out.println("---------学生没看见老师来了-------");
teacher.setState("学生没看见老师,老师看见了");

}

}


测试结果:

--------学生看见老师来了----------
玩游戏的学生,老师来了,学生看见老师来了,并进行提醒,老师没看见 ^_^
看电影的学生,老师来了,学生看见老师来了,并进行提醒,老师没看见 ^_^

---------学生没看见老师来了-------
玩游戏的学生,老师来了,学生没看见老师,老师看见了
看电影的学生,老师来了,学生没看见老师,老师看见了


至此,一个简单的观察者模式实现。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: