橘子味的心
标题:Java观察者模式

观察者模式在对象之间存在一对多关系时使用,例如,如果一个对象被修改,它的依赖对象将被自动通知。 观察者模式属于行为模式类别。

实现实例

观察者模式使用三个操作类- Subject, ObserverClientSubject是具有将观察者附加和分离到Client对象的方法的对象。创建了一个抽象类Observer和一个具体类Subject,它们都是扩展了 Observer 类。

ObserverPatternDemo这是一个演示类,将使用 Subject 和具体类对象在操作中显示观察者模式。

观察者模式示例的结构如下图所示 -

第1步

创建一个 Subject 类,如下代码所示 -
Subject.java

  1. import java.util.ArrayList;
  2. import java.util.List;
  3.  
  4. public class Subject {
  5.  
  6. private List<Observer> observers = new ArrayList<Observer>();
  7. private int state;
  8.  
  9. public int getState() {
  10. return state;
  11. }
  12.  
  13. public void setState(int state) {
  14. this.state = state;
  15. notifyAllObservers();
  16. }
  17.  
  18. public void attach(Observer observer){
  19. observers.add(observer);
  20. }
  21.  
  22. public void notifyAllObservers(){
  23. for (Observer observer : observers) {
  24. observer.update();
  25. }
  26. }
  27. }
  28. Java

第2步

创建一个 Observer 类,如下代码所示 -
Observer.java

  1. public abstract class Observer {
  2. protected Subject subject;
  3. public abstract void update();
  4. }
  5. Java

第3步

创建具体的观察者类,如下代码所示 -
BinaryObserver.java

  1. public class BinaryObserver extends Observer{
  2.  
  3. public BinaryObserver(Subject subject){
  4. this.subject = subject;
  5. this.subject.attach(this);
  6. }
  7.  
  8. @Override
  9. public void update() {
  10. System.out.println( "Binary String: " + Integer.toBinaryString( subject.getState() ) );
  11. }
  12. }
  13. Java

OctalObserver.java

  1. public class OctalObserver extends Observer{
  2.  
  3. public OctalObserver(Subject subject){
  4. this.subject = subject;
  5. this.subject.attach(this);
  6. }
  7.  
  8. @Override
  9. public void update() {
  10. System.out.println( "Octal String: " + Integer.toOctalString( subject.getState() ) );
  11. }
  12. }
  13. Java

HexaObserver.java

  1. public class HexaObserver extends Observer{
  2.  
  3. public HexaObserver(Subject subject){
  4. this.subject = subject;
  5. this.subject.attach(this);
  6. }
  7.  
  8. @Override
  9. public void update() {
  10. System.out.println( "Hex String: " + Integer.toHexString( subject.getState() ).toUpperCase() );
  11. }
  12. }
  13. Java

第4步

使用 Subject 和具体的观察者对象。
ObserverPatternDemo.java

  1. public class ObserverPatternDemo {
  2. public static void main(String[] args) {
  3. Subject subject = new Subject();
  4.  
  5. new HexaObserver(subject);
  6. new OctalObserver(subject);
  7. new BinaryObserver(subject);
  8.  
  9. System.out.println("First state change: 15");
  10. subject.setState(15);
  11. System.out.println("Second state change: 10");
  12. subject.setState(10);
  13. }
  14. }
  15. Java

第5步

验证输出,执行上面的代码得到以下结果 -

  1. First state change: 15
  2. Hex String: F
  3. Octal String: 17
  4. Binary String: 1111
  5. Second state change: 10
  6. Hex String: A
  7. Octal String: 12
  8. Binary String: 1010
  9. Java