观察者模式
一. 定义
官方的定义如下:
当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知依赖它的对象。观察者模式属于行为型模式。
其实通俗的讲也就是一个发布订阅,好比你微信关注了一个公众号,当这个公众号发布了一个新的内容的时候,就会给你推送。
下面来简单的说说实现思想。
比如说我们的subject对象就是一个公众号,它里面有个集合用来存放所有订阅了他的账号对象,当在subject里面更新值得时候,去遍历这个存放对象得集合,并且调用这些订阅了消息得对象得某个方法,以此达到消息得推送
二. 代码实现
subject
public class subject{
Arraylist<Observer> observers = new Arraylist<Observer>();
private int state;
public int getState(){
return state
}
public void attach(Observer observer){
observers.add(observer);
}
public void setState(int state){
this.state = state;
notifyAllObservers;
}
public void notifyAllObservers(){
for (Observer observer : observers) {
observer.update();
}
}
}
创建所有订阅者的父类Observer
public abstract class Observer{
protected Subject subject;
public abstract void update();
}
创建订阅者
public class BinaryObserver extends Observer{
public BinaryObserver(Subject subject){
this.subject = subject;
this.subject.attach(this);
}
@Override
public void update() {
System.out.println( "Binary String: "
+ Integer.toBinaryString( subject.getState() ) );
}
}
创建订阅者
public class HexaObserver extends Observer{
public HexaObserver(Subject subject){
this.subject = subject;
this.subject.attach(this);
}
@Override
public void update() {
System.out.println( "Hex String: "
+ Integer.toHexString( subject.getState() ).toUpperCase() );
}
}
创建订阅者
public class OctalObserver extends Observer{
public OctalObserver(Subject subject){
this.subject = subject;
this.subject.attach(this);
}
@Override
public void update() {
System.out.println( "Octal String: "
+ Integer.toOctalString( subject.getState() ) );
}
}
创建测试
public class ObserverPatternDemo {
public static void main(String[] args) {
Subject subject = new Subject();
new HexaObserver(subject);
new OctalObserver(subject);
new BinaryObserver(subject);
System.out.println("First state change: 5");
subject.setState(5);
System.out.println("Second state change: 10");
subject.setState(10);
}
}
输出结果:
First state change: 15
Hex String: 5
Octal String: 5
Binary String: 101
Second state change: 10
Hex String: A
Octal String: 12
Binary String: 1010