观察者设计模式

2018, Apr 18    

观察者设计模式

观察者模式:一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新

  • 优点:建立一套触发机制
  • 缺点:通知默认是顺序执行,一个观察者卡壳,会影响整体的执行效率
  1. Subject被观察者:必须实现的职责是管理(增加或减少)观察者并通知观察者。

    public abstract class Subject {
        // 定义一个观察者数组
        private Vector<Observer> obsVector = new Vector<Observer>(); 
          
        // 增加一个观察者
        public void addObserver(Observer obs) {
            this.obsVector.add(obs);
        }
        // 减少一个观察者
        public void delObserver(Observer obs) {
            this.obsVector.remove(obs);
        }
           
        // 通知所有观察者
        public void notifyObservers() {
            for (Observer obs : this.obsVector) {
                obs.update();
            }
        }
    }
    
  2. Observer观察者:观察者接收到消息后,即进行update(更新方法)操作,对接收到的信息进行处理。

    public interface Observer {
    	//更新方法
    	public void update();
    }
    
  3. ConcreteSubject具体的被观察者:定义被观察者自己的业务逻辑,同时定义对哪些事件进行通知。

public ConcreteSubject extends Subject {
    public void doSomething() {
        /*
         * 业务逻辑代码。。。。。
         */
        // 通知所有被观察者
        super.notifyObservers();
    }
}
  1. ConcreteObserver具体的观察者:每个观察在接收到消息后的处理反应是不同,各个观察者有自己的处理逻辑。

    public class ConcreteObserver implements Observer {
    	//实现更新方法
    	public void update() {
    		System.out.println("接收到信息,并进行处理!");
    	}
    }
    

测试函数

public class Client {
	public static void main(String[] args) {
		//创建一个被观察者
        // 因为subject.doSomething方法,只有子类才有,所以声明的类型为ConcreteSubject
		ConcreteSubject subject = new ConcreteSubject(); 
		//定义一个观察者
		Observer obs= new ConcreteObserver();
		// 观察者 观察 被观察者
		subject.addObserver(obs);
    	// 被观察者开始活动了
		subject.doSomething();
	}
}