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

Java设计模式--观察者模式

2018-04-07 00:00 543 查看
摘要: java射即模式之观察者模式

观察者模式

观察者模式:(行为型模式)
定义对象的一种一对多的依赖关系,当一个对象的状态发生变化时,
所有依赖它的对象都得到通知并被自动更新。
使用场景:
一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知,进行广播通知。
1、当某对象数据更新时,需要通知其他对象,但该对象又不希望和被通知的其他对象形成紧耦合;
2、当某对象数据更新时,需要让其他对象也各自更新自己的数据,但该对象不知道具体有多少对象需要更新数据。

能解决:
适合解决多种对象跟踪一个对象数据变化的程序问题,有一个称作“主题”的对象和若干个称作“观察者”的对象。

设计角色:
1、主题:有观察者集合对象,主要做添加、撤销观察者,向观察者发送信息,引起观察者响应
2、观察者:

优点:
1、观察者和被观察者是抽象耦合的。
2、建立一套触发机制。

缺点:
1、如果一个被观察者对象有很多的直接和间接的观察者的话,将所有的观察者都通知到会花费很多时间。
2、如果在观察者和观察目标之间有循环依赖的话,观察目标会触发它们之间进行循环调用,可能导致系统崩溃。
3、观察者模式没有相应的机制让观察者知道所观察的目标对象是怎么发生变化的,而仅仅只是知道观察目标发生了变化。

应用场景:
1、一个对象必须通知其他对象,而并不知道这些对象是谁。
2、需要在系统中创建一个触发链,A对象的行为将影响B对象,B对象的行为将影响C对象……,
可以使用观察者模式创建一种链式触发机制。
3、JDK自带了观察者模式:Observable主题类和Observer观察者接口,

demo

1、接口:

/**
* 观察者接口
*/
public interface IObserver<T> {
void refresh(T data);
}

/**
* 主题接口
*/
public interface ISubject<T> {
/**
* 注册观察者
* @param iObserver
*/
void register(IObserver<T> iObserver);

/**
* 撤销观察者
* @param iObserver
*/
void unregister(IObserver<T> iObserver);

/**
* 通知观察者
*/
void notifyObserver();
}

2、实现

public class Observer implements IObserver<ISubject> {
@Override
public void refresh(ISubject data) {
Subject subject = (Subject) data;
System.out.println("收到数据:"+subject.data);
}
}

/**
* 主题实现
*/
public class Subject implements ISubject {
Vector<IObserver> vector = new Vector<>();
String data;

@Override
public void register(IObserver iObserver) {
if (!vector.contains(iObserver)){
vector.add(iObserver);
}
}

@Override
public void unregister(IObserver iObserver) {
if (vector.contains(iObserver)) {
vector.remove(iObserver);
}
}

@Override
public void notifyObserver() {
vector.forEach(v ->{
// v.refresh(data); 推数据
// 拉数据
v.refresh(this);
});
}
}

3、测试

public class Test {
public static void main(String[] args) {
// 主题
Subject subject = new Subject();
// 观察者
IObserver observer = new Observer();
subject.data = "hello word.";
subject.register(observer);
subject.notifyObserver();
}
}

4、jdk自带的设计模式:

主题类:Observable

观察者接口:Observer

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