设计模式研究

观察者模式

2020-07-26  本文已影响0人  Stephenwish
观察者本质是发布订阅模式,一个类变化了,通知其他和这个类有关联的类,并且跟着变化

第一步先写一个简单的一个类执行方法触发另一个类的方法(简单观察者模型)后面在升级
//被观察的类
public abstract class Subject {
    abstract void doMethod1();
    abstract void doMethod2();
}
//观察类
public abstract class Observer {
    abstract void doMethodA();
    abstract void doMethodB();
}

两个抽象各自具体实现

public class SubjectImpl extends Subject{
   private Observer observer=new AObserverImpl();

   @Override
    void doMethod1() {
        System.err.println("被观察的类发出动作1");
        observer.doMethodA();
    }

    @Override
    void doMethod2() {
        System.err.println("被观察的类发出动作2");
    }
}
public class AObserverImpl extends  Observer{
    @Override
    void doMethodA() {
        System.err.println("发现观察对象有行为,我也跟着做执行对应方法A");
    }

    @Override
    void doMethodB() {
        System.err.println("发现观察对象有行为,我也跟着做执行对应方法B");
    }
}
再写一个测试类
public class Client {
    public static void main(String[] args) {
        Subject subject = new SubjectImpl();
        subject.doMethod1();
    }
}
//输出
//>>>>被观察的类发出动作1
//发现观察对象有行为,我也跟着做执行对应方法

\color{red}\spadesuitSubject 类有多个关联的类,不止一个,需要全部通知,把一个实现换成多个,用List改造下。

public class SubjectImpl extends Subject{
  private List<Observer> observers=new ArrayList<>();

  public void addObserver(Observer observer){
      observers.add(observer);
  }

  public void deleteObserver(Observer observer){
      observers.remove(observer);
  }

   @Override
    void doMethod1() {
        System.err.println("被观察的类发出动作1");
       for (Observer observer : observers) {
           observer.doMethodA();
       }
    }

    @Override
    void doMethod2() {
        System.err.println("被观察的类发出动作2");
    }
}
public class Client {
    public static void main(String[] args) {
        Observer observerA = new AObserverImpl();
        Observer observerB = new BObserverImpl();
        SubjectImpl subject = new SubjectImpl();
        subject.addObserver(observerA);
        subject.addObserver(observerB);
        subject.doMethod1();
    }
}

\color{red}\spadesuit在优化,在对代码SubjectImpl 里面的方法分离下观察对象为一个接口,方便以后扩展

public interface IBeiGuanCha {
     void addObserver(Observer observer);
     void deleteObserver(Observer observer);
}
public class SubjectImpl extends Subject implements IBeiGuanCha{
  private List<Observer> observers=new ArrayList<>();

  @Override
  public void addObserver(Observer observer){
      observers.add(observer);
  }

  @Override
  public void deleteObserver(Observer observer){
      observers.remove(observer);
  }

   @Override
    void doMethod1() {
        System.err.println("被观察的类发出动作1");
       for (Observer observer : observers) {
           observer.doMethodA();
       }
    }

    @Override
    void doMethod2() {
        System.err.println("被观察的类发出动作2");
    }
}


上一篇下一篇

猜你喜欢

热点阅读