首页 观察者设计模式
文章
取消

观察者设计模式

观察者模式概念

定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。

应用场景

  1. 日志记录器:用户可以选择日志存储到什么地方
  2. 数据库访问:用户可以选择数据库
  3. 设计一个连接服务器的框架

    实现案例

    • 创建 Subject 类。 ``` java public class Subject {

private List observers = new ArrayList(); 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(); } } }

1
2
3
4
5
6
- 创建 Observer 类。
``` java
public abstract class Observer {
   protected Subject subject;
   public abstract void update();
}
  • 创建实体观察者类。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    
    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() ) );
     }
    }
    
  • OctalObserver类:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    
    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() ) );
     }
    }
    
  • HexaObserver类:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    
    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() );
     }
    }
    
  • 使用 Subject 和实体观察者对象。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    
    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: 15");
        subject.setState(15);
        System.out.println("Second state change: 10");
        subject.setState(10);
     }
    }
    
本文由作者按照 CC BY 4.0 进行授权
载入天数...载入时分秒...