您的位置:首页 > 其它

设计模式之观察者模式

2016-07-07 19:08 155 查看
一、什么是观察者模式

观察者模式(有时又被称为发布(publish )-订阅(Subscribe)模式、模型-视图(View)模式、源-收听者(Listener)模式或从属者模式)是软件设计模式的一种。在此种模式中,一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实现事件处理系统。

二、观察者设计模式类图

观察者:(Observer)将自己注册到被观察对象(Subject)中,被观察对象将观察者存放在一个容器(Container)里。

被观察:被观察对象发生了某种变化(如图中的SomeChange),从容器中得到所有注册过的观察者,将变化通知观察者。

撤销观察:观察者告诉被观察者要撤销观察,被观察者从容器中将观察者去除。

观察者将自己注册到被观察者的容器中时,被观察者不应该过问观察者的具体类型,而是应该使用观察者的接口。这样的优点是:假定程序中还有别的观察者,那么只要这个观察者也是相同的接口实现即可。一个被观察者可以对应多个观察者,当被观察者发生变化的时候,他可以将消息一一通知给所有的观察者。基于接口,而不是具体的实现——这一点为程序提供了更大的灵活性。

一、实例浅析观察者设计模式

/*

 * 观察者设计模式:创建观察者抽象接口和被观察者抽象接口,创建观察者具体类实现观察者抽象接口

 * 创建被观察者具体类实现被观察者抽象接口,观察者对应的被观察者有很多个,因此观察者需要创建

 * 一个容器来存放被观察者。

 * 不想太官方,简单点就是一个类的对象拥有很多个其他的同类的对象,并把这些对象都放在自己的

 * 管辖区域内(自己的容器),需要的时候(需要调用某个方法实现某项行为或功能的时候)

 * 就遍历这个容器做到同时全部的管理。想一想,好像就这样哟,哈哈。

 */

观察者抽象接口的创建

package WatcherModel;

import java.util.ArrayList;

/*
* 观察者抽象类
*/
public interface Observer {
//可以自定义各种方法
public void addOne(BeObservered beObservered);
public void removeOne(BeObservered beObservered);
public String sendMessage(String message);
}


被观察者抽象接口的创建
package WatcherModel;
/*
* 被观察者抽象类
*/
public interface BeObservered {
//自定义各种方法
public void receivemessage(String message);
}


观察者具体类
package WatcherModel;

import java.util.ArrayList;

/*
* 观察者具体类,实现观察者抽象接口
*/
public class Boss implements Observer {
// 一个观察者对应多个被观察者,即一个Boss对应多个Worker
// 需要个容器来装被观察者
ArrayList<BeObservered> list = new ArrayList<BeObservered>();

public void addOne(BeObservered beObservered) {
list.add(beObservered);
}

// 从list中移除当前的对象
public void removeOne(BeObservered beObservered) {
list.remove(beObservered);
}

public void sendMessage() {
String message = "明天放假!";
// 遍历list,调用每个被观察者对象的方法
for (int i = 0; i < list.size(); i++) {
list.get(i).receivemessage(message);
}
}

public String sendMessage(String message) {
return null;
}

}
被观察者具体类

package WatcherModel;
/*
* 被观察者的具体类,实现被观察者抽象接口
*/
public class Worker implements BeObservered {
public void receivemessage(String message) {
System.out.println(message);
}
}


测试类

package WatcherModel;

public class Test {
public static void main(String[] args) {
Boss boss = new Boss();
Worker worker1 = new Worker();
Worker worker2 = new Worker();
Worker worker3 = new Worker();
Worker worker4 = new Worker();

boss.addOne(worker1);
boss.addOne(worker2);
boss.addOne(worker3);
boss.addOne(worker4);

boss.sendMessage();

}
}


运行结果
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: