行为型--观察者模式

概念


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

优点:

  1. 观察者和被观察者是抽象耦合的。
  2. 建立一套触发机制,实现状态的同步更新。

缺点:

  1. 如果一个被观察者对象有很多的直接和间接的观察者的话,将所有的观察者都通知到会花费很多时间。
  2. 如果在观察者和观察目标之间有循环依赖的话,观察目标会触发它们之间进行循环调用,可能导致系统崩溃。
  3. 观察者模式没有相应的机制让观察者知道所观察的目标对象是怎么发生变化的,而仅仅只是知道观察目标发生了变化。

 

举例


import java.util.Enumeration;
import java.util.Vector;

public class Client {
	public static void main(String[] args) {
		Subject subject = new ConcreteSubject();
		Observer Observer1 = new Observer1(subject);
		Observer Observer2 = new Observer2(subject);
		subject.add(Observer1);
		subject.add(Observer2);
		subject.setState(10);
		System.out.println();
		subject.setState(7);
	}
}
/* 目标,被观察的对象
 * 提供添加和删除观察者的接口
 * */
interface Subject {  
    /*增加观察者*/  
    void add(Observer observer);  
    /*删除观察者*/  
    void delete(Observer observer);  
    /*通知所有的观察者*/  
    void notifyObservers();  
    /*得到被观测目标的状态或设置目标的状态*/
    int getState();
    void setState(int state);
}
// 抽象被观察目标,实现一些共有默认操作
// 具体被观察目标,其状态改变时通知所有它的观察者
abstract class AbstractSubject implements Subject {  
    private Vector<Observer> vector = new Vector<Observer>();  
    @Override  
    public void add(Observer observer) {  
        vector.add(observer);  
    }  
    @Override  
    public void delete(Observer observer) {  
        vector.remove(observer);  
    }  
    @Override  
    public void notifyObservers() {  
        Enumeration<Observer> enumo = vector.elements();  
        while(enumo.hasMoreElements()){  
            enumo.nextElement().update();  
        }
    }
}
// 具体被观察目标
class ConcreteSubject extends AbstractSubject {  
	private int subjectState;
	@Override 
	public int getState() {
		return subjectState;
	}
	// 设置状态时通知观察者
	@Override 
	public void setState(int state) {
		System.out.println("ConcreteSubject state update: old state = "+subjectState);  
		this.subjectState = state;
		System.out.println("ConcreteSubject information start updating");  
		System.out.println("ConcreteSubject state update: current state = "+subjectState);  
		System.out.println("ConcreteSubject information update completed");  
		notifyObservers();
	}
} 
// 观察者更新接口
interface Observer{
	void update();  
}
// 具体观察者
class Observer1 implements Observer {  
	private Subject subject;
	private int observerState;
	public Observer1(Subject s) {
		subject = s;
	}
    @Override  
    public void update() {  
    	System.out.println("Observer1 state update: old state = "+observerState);  
    	System.out.println("Observer1 information start updating");  
    	observerState = subject.getState(); //状态统一,但该状态下的具体变化彼此无关
		System.out.println("Observer1 state update: current state = "+observerState);  
		System.out.println("Observer1 information update completed");  
    }  
}  
class Observer2 implements Observer {  
	private Subject subject;
	private int observerState;
	public Observer2(Subject s) {
		subject = s;
	}
    @Override  
    public void update() {  
    	System.out.println("Observer2 state update: old state = "+observerState);  
    	System.out.println("Observer2 information start updating");  
    	observerState = subject.getState();
		System.out.println("Observer2 state update: current state = "+observerState);  
		System.out.println("Observer2 information update completed");  
    }
} 
 
Output:
ConcreteSubject state update: old state = 0
ConcreteSubject information start updating
ConcreteSubject state update: current state = 10
ConcreteSubject information update completed
Observer1 state update: old state = 0
Observer1 information start updating
Observer1 state update: current state = 10
Observer1 information update completed
Observer2 state update: old state = 0
Observer2 information start updating
Observer2 state update: current state = 10
Observer2 information update completed

ConcreteSubject state update: old state = 10
ConcreteSubject information start updating
ConcreteSubject state update: current state = 7
ConcreteSubject information update completed
Observer1 state update: old state = 10
Observer1 information start updating
Observer1 state update: current state = 7
Observer1 information update completed
Observer2 state update: old state = 10
Observer2 information start updating
Observer2 state update: current state = 7
Observer2 information update completed
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值