怎么不花钱建网站,网站开发工程师薪资,上海百度研发中心,wordpress 卡当对象间存在一对多关系时#xff0c;则使用观察者模式#xff08;Observer Pattern#xff09;。比如#xff0c;当一个对象被修改时#xff0c;则会自动通知它的依赖对象。观察者模式属于行为型模式。 关键代码#xff1a;在抽象类里有一个 ArrayList 存放观察者们。 优… 当对象间存在一对多关系时则使用观察者模式Observer Pattern。比如当一个对象被修改时则会自动通知它的依赖对象。观察者模式属于行为型模式。 关键代码在抽象类里有一个 ArrayList 存放观察者们。 优点 1、观察者和被观察者是抽象耦合的。 2、建立一套触发机制。 缺点 1、如果一个被观察者对象有很多的直接和间接的观察者的话将所有的观察者都通知到会花费很多时间。 2、如果在观察者和观察目标之间有循环依赖的话观察目标会触发它们之间进行循环调用可能导致系统崩溃。 3、观察者模式没有相应的机制让观察者知道所观察的目标对象是怎么发生变化的而仅仅只是知道观察目标发生了变化。 注意事项 1、JAVA 中已经有了对观察者模式的支持类。 2、避免循环引用。 3、如果顺序执行某一观察者错误会导致系统卡壳一般采用异步方式。 创建 Observer 类。/*** 1. 创建 Observer 类。* author mazaiting*/
public abstract class Observer {protected Subject subject;public abstract void update();
}创建 Subject 类。/*** 2. 创建 Subject 类。* author mazaiting*/
public class Subject {private ListObserver observers new ArrayListObserver();private int state;public int getState() {return state;}public void setState(int state) {this.state state;notifyAllObservers();}/*** 添加观察者*/public void attach(Observer observer){observers.add(observer);}/*** 通知全部观察者更新数据*/public void notifyAllObservers(){for (Observer observer : observers) {observer.update();}}
}创建实体观察者类/*** 3. 创建实体观察者类。* author mazaiting*/
public class BinaryObserver extends Observer{public BinaryObserver(Subject subject) {this.subject subject;this.subject.attach(this);}Overridepublic void update() {System.out.println( Binary String: Integer.toBinaryString(subject.getState())); }}/*** 3. 创建实体观察者类。* author mazaiting*/
public class OctalObserver extends Observer{public OctalObserver(Subject subject) {this.subject subject;this.subject.attach(this);}Overridepublic void update() {System.out.println( Octal String: Integer.toOctalString( subject.getState() ) );}}/*** 3. 创建实体观察者类。* author mazaiting*/
public class HexaObserver extends Observer{public HexaObserver(Subject subject) {this.subject subject;this.subject.attach(this);}Overridepublic void update() {System.out.println( Hex String: Integer.toHexString( subject.getState() ).toUpperCase() ); }}使用Subject和实体观察者对象/*** 4. 使用 Subject 和实体观察者对象。* author mazaiting*/
public class Client {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: 15);subject.setState(15);System.out.println(Second state change: 10);subject.setState(10);}
}打印结果First state change: 15
Hex String: F
Octal String: 17
Binary String: 1111
Second state change: 10
Hex String: A
Octal String: 12
Binary String: 1010