java进阶|java23种设计模式—观察者模式
定义
观察者模式定义了对象之间的一对多依赖,当一个对象改变状态时,它大所有依赖者都会收到通知并自动更新。
角色
观察者模式主要包含的角色为抽象观察者,抽象主题,以及它们各自具体的实现。
推模型
推模型是一种主题对象状态发生变化时主动推送信息给所有观察者的模型,无论是否需要,被注册的观察者只能被动地接受改变。
抽象主题
/** * Created by tiantian on 2018/7/22 */public interface Subject {void registerObserver(Observer observer);
void removeObserver(Observer observer);
void notifyObservers();
public void setState(String state);
}
【java进阶|java23种设计模式—观察者模式】
抽象观察者
/** * desc :抽象观察者 * Created by tiantian on 2018/7/22 */public interface Observer {public void update(String state);
}
具体主题
/** * desc : 具体主题 * Created by tiantian on 2018/7/22 */public class ConcreteSubject implements Subject {List observers;
String state = "state";
public ConcreteSubject() {this.observers = new ArrayList<>();
}@Overridepublic void registerObserver(Observer observer) {this.observers.add(observer);
}@Overridepublic void removeObserver(Observer observer) {int index = observers.indexOf(observer);
observers.remove(index);
}@Overridepublic void notifyObservers() {for(Observer o : observers) {o.update(this.state);
}}@Overridepublic void setState(String state) {this.state = state;
}}
具体观察者
/** * desc : 具体观察者 * Created by tiantian on 2018/7/22 */public class ConcreteObserver implements Observer{String state = "state";
@Overridepublic void update(String state) {this.state = state;
}}
客户端测试类
public class Client {public static Subjectsubject = new ConcreteSubject();
public static void main(String[] args) {Observer observer = new ConcreteObserver();
subject.registerObserver(observer);
subject.setState("new state");
subject.notifyObservers();
System.out.println(((ConcreteObserver) observer).state);
}}
在测试中,我们简单的创建了一个主题对象和一个观察者对象,先注册观察者对象。然后通过主题对象的setState方法模拟主题对象的状态改变,调用调用notifyObservers通知所有观察者更新状态。
拉模型
拉模型把数据的控制权转移到了观察者。主题对象状态更新之后依然会发送通知给各位观察者们,但只是简单的告诉它们我更新了。观察者的update的参数列表接收一个主题对象,具体怎么更新自己的数据,各观察者们自己选择。这就是观察者模式的拉模型。
拉模型抽象主题和具体主题
/** * desc : 抽象主题 * Created by tiantian on 2018/7/22 */public interface Subject {void registerObserver(Observer observer);
void removeObserver(Observer observer);
void notifyObservers();
public void setState(String state);
public String getState();
}
/** * desc : 具体主题 * Created by tiantian on 2018/7/22 */public class ConcreteSubject implements Subject {List observers;
String state = "state";
public ConcreteSubject() {this.observers = new ArrayList<>();
}@Overridepublic void registerObserver(Observer observer) {this.observers.add(observer);
}@Overridepublic void removeObserver(Observer observer) {int index = observers.indexOf(observer);
observers.remove(index);
}@Overridepublic void notifyObservers() {for(Observer o : observers) {o.update(this);
}}@Overridepublic void setState(String state) {this.state = state;
}@Overridepublic String getState() {return this.state;
}}
抽象观察者和具体观察者
/** * desc :抽象观察者 * Created by tiantian on 2018/7/22 */public interface Observer {public void update(Subject subject);
}/** * desc : 具体观察者 * Created by tiantian on 2018/7/22 */public class ConcreteObserver implements Observer{String state = "state";
@Overridepublic void update(Subject subject) {this.state = subject.getState();
}}
客户端测试
public class Client {public static Subjectsubject = new ConcreteSubject();
public static void main(String[] args) {Observer observer = new ConcreteObserver();
subject.registerObserver(observer);
subject.setState("New State!");
subject.notifyObservers();
System.out.println(((ConcreteObserver) observer).state);
}}
// Outout : New State!
推荐阅读
- JAVA(抽象类与接口的区别&重载与重写&内存泄漏)
- 事件代理
- Java|Java OpenCV图像处理之SIFT角点检测详解
- java中如何实现重建二叉树
- 数组常用方法一
- 【Hadoop踩雷】Mac下安装Hadoop3以及Java版本问题
- Java|Java基础——数组
- 推荐系统论文进阶|CTR预估 论文精读(十一)--Deep Interest Evolution Network(DIEN)
- RxJava|RxJava 在Android项目中的使用(一)
- java之static、static|java之static、static final、final的区别与应用