设计模式学习之四观察者模式

想象一棵树,子节点中某些属性依赖于父节点某个属性。
当父节点中这个属性改变时想让这些子节点随之改变,该怎么设计代码结构呢?

父节点 Subject
子节点 Observer(1,2,3)
我的第一想法是 创造一个第三方,初始化subject 后 创建 第三方关系类,再初始化observer1,2,3 并依次在关系类中维护他们的关系。
subject有更新时,再调用关系类中 对observer对象们的更新。
但是,不仅引入了一个第三方模块,而且初始化一个subject时还得多初始化一个关系类。

观察者模式:
subject中 创造一个观察者列表的属性,并且维护一个通知观察者的方法,当它的某些属性改变时,调用这个方法,这个方法再依次调用对应的观察者的更新方法。

优点:
1. 观察者和被观察者耦合
2. 触发机制
缺点:
1. 耦合多
2. 如果有循环依赖可能会导致系统崩溃

应用场景:

1. 温度计实时测温 ,当温度发生变化时通知空调、人进行相应的调节。

2. ....反正就是一对多的关系中,当这个一出现变化时去通知别的多进行相应的更新。

 

package designpatterns.ob;

public abstract class Observer { protected Subject subject; public abstract void handleChange(); }

 

package designpatterns.ob;

public class ObserverA extends Observer{ public ObserverA(Subject subject) { subject.attachObserver(this); }

public void handleChange(){
    System.out.println("A中:subject新的name是:"+subject.getName());
}

}

 

package designpatterns.ob;

public class ObserverB extends Observer{ public ObserverB(Subject subject) { subject.attachObserver(this); } public void handleChange(){ System.out.println("B中:subject新的name是:"+subject.getName()); } }

 

package designpatterns.ob;

import java.util.LinkedList; import java.util.List;

public class Subject { List<Observer> observers = new LinkedList<>(); private String name; public String getName(){ return this.name; }

public void updateName(String name){
    this.name = name;
    //通知它的观察者 自己被修改了
    notifyObservers();
}

private void notifyObservers(){
    for (Observer observer:observers){
        //调用处理 此次改动
        observer.handleChange();
    }
}
public void attachObserver(Observer observer){
    this.observers.add(observer);
}

}

 

package designpatterns.ob;

public class T { public static void main(String[] args) { Subject subject = new Subject(); new ObserverA(subject); new ObserverB(subject); subject.updateName("fuck"); subject.updateName("aaa"); } }