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

$Java设计模式之——观察者模式(Observer)

2016-05-01 01:26 736 查看
  (一)观察者模式简介

  1、定义:定义对象间一种一对多的依赖关系,一个对象状态发生改变时,所有依赖它的对象都会接到通知并作出相应的响应。

  2、应用场景:

  (1)GUI系统

  (2)订阅-发布系统

  (3)事件多级触发场景

  (4)当一个对象改变时需要通知其他对象,但不知道有其他对象具体有哪些时

  3、UML类图


  

  (二)观察者模式实例

  1、假设有个珠宝公司要运送一批钻石,强盗也盯上这批钻石了,准备在运输途中抢劫,而珠宝公司雇佣的保镖要全程对钻石进行保护,警察也派出警车护航,关系如下图:



  2、代码如下:

  (1)抽象观察者接口:

/**
* 抽象观察者
*
*/

public interface Watcher {
// 对被观察者状态变化做出响应的抽象方法
public void update(String msg);
}


  (2)抽象被观察者接口:

/**
* 抽象被观察者
*
*/

public interface Watched {
// 添加观察者
public void addWatcher(Watcher watcher);

// 移除观察者
public void removeWatcher(Watcher watcher);

// 通知观察者
public void notifyWatchers(String msg);
}


  (3)保镖类:

/**
* 保镖类,实现Watcher接口
*
*/

public class Security implements Watcher {

@Override
public void update(String msg) {
System.out.println("保镖收到消息:" + msg + "。保镖开始保护!");
}

}


  (4)警察类:

/**
* 警察类,实现Watcher接口
*
*/

public class Police implements Watcher {

@Override
public void update(String msg) {
System.out.println("警察收到消息:" + msg + "。警察开始派警车护航!");
}

}


  (5)强盗类:

/**
* 强盗类,实现Watcher接口
*
*/

public class Thief implements Watcher {

@Override
public void update(String msg) {
System.out.println("收到消息:" + msg + "。强盗准备动手!");
}

}


  (6)珠宝运输类:

/**
* 具体的被观察者
*
*/

public class Transporter implements Watched {

List<Watcher> wathcerList = new ArrayList<Watcher>();

@Override
public void addWatcher(Watcher watcher) {
wathcerList.add(watcher);
}

@Override
public void removeWatcher(Watcher watcher) {
wathcerList.remove(watcher);
}

@Override
public void notifyWatchers(String msg) {
for (Watcher w : wathcerList) {
w.update(msg);
}
}

}


  (6)测试类:

public class Test {
public static void main(String[] args) {
Security s = new Security();
Thief t = new Thief();
Police p = new Police();

Transporter transPorter = new Transporter();
transPorter.addWatcher(s);
transPorter.addWatcher(t);
transPorter.addWatcher(p);

transPorter.notifyWatchers("运输车队开始出发了");

transPorter.removeWatcher(t);
transPorter.notifyWatchers("运输车队摆脱了强盗");
}
}


  (7)输出结果:

保镖收到消息:运输车队开始出发了。保镖开始保护!
收到消息:运输车队开始出发了。强盗准备动手!
警察收到消息:运输车队开始出发了。警察开始派警车护航!
保镖收到消息:运输车队摆脱了强盗。保镖开始保护!
警察收到消息:运输车队摆脱了强盗。警察开始派警车护航!

Refer:http://blog.csdn.net/jason0539/article/details/45055233
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: