~~行为型-观察者模式
一:概述
定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
二:代码实现
package com.test.mode;
import java.util.Vector;
/**
* 观察者模式测试
*/
public class ObserverTest {
public static void main(String[] args) {
Subject mySubject = new MySubject();
mySubject.add(new ObserverOne());
mySubject.add(new ObserverTwo());
mySubject.operation();
}
}
/**
* 观察者接口 消息会通知到该接口中
*/
interface Observer {
//收到通知,改变自身状态
void update();
}
/**
* 第一个观察者 订阅者
* 观察者模式中1对多中的多
*/
class ObserverOne implements Observer{
@Override
public void update() {
System.out.println("第一个观察者收到通知,状态更新了");
}
}
/**
* 第二个观察者 订阅者
* 观察者模式中1对多中的多
*/
class ObserverTwo implements Observer {
@Override
public void update() {
System.out.println("第二个观察者收到通知,状态更新了");
}
}
/**
* 我们的普通接口,operation也是我们的普通方法,若是需要对该接口实现观察者模式,则需增加删除,添加,通知接口 由另一个抽象类来实现来实现这三个接口
* operation这个普通业务接口,则是在正常实现类中实现。
* 抽象主题角色:也叫抽象目标类,抽象主题知道自己的观察者有哪些,提供删除和新增观察者的方法以及通知观察者的抽象方法,由抽象类或接口实现
* 观察者模式中1对多中的1:就operation方法来说的
*/
interface Subject {
//添加观察者 订阅
void add(Observer observer);
//删除观察者 删除订阅
void remove(Observer observer);
//通知所有观察者
void notifyObservers();
//自身操作
void operation();//具体的业务方法
}
/**
* 消息发布者
* 该类是我们要实现观察者模式的额外类
* 具体主题角色:也叫具体目标类,实现抽象目标类的通知方法(代码中的notifyObservers)以及实现抽象目标类增删观察者方法,当具体主题发生改变时通知所有订阅自己的观察者
* 必须是abstract抽象类
*/
abstract class AbstractSubject implements Subject{
Vector<Observer> vector = new Vector<Observer>();
@Override
public void add(Observer observer){
vector.add(observer);
}
@Override
public void remove(Observer observer){
vector.remove(observer);
}
//通知观察者,调用观察者接口
@Override
public void notifyObservers(){
for (Observer observer : vector) {
observer.update();
}
}
}
//普通借口的普通实现类。只需实现operation接口
class MySubject extends AbstractSubject{
@Override
public void operation() {
System.out.println("具体目标状态改变");
System.out.println("正在通知观察者。。。");
notifyObservers();
System.out.println("通知完毕!");
}
}