设计模式--行为型--观察者模式

一、观察者模式简介(Brief Introduction)

       观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,这个主题对象在状态发生变化的时,会通知所有观察者对象,使他们能够自动更新自己。

二、解决的问题(What To Solve)

      当一个对象的改变需要同时改变其他对象的时候,而且不知道有多少对象有待改变时,应该考虑使用观察者模式。
      观察者模式所做的工作其实就是解除耦合,让耦合的双方都依赖于抽象,而不是依赖于具体,从而使的各自的变化都不会影响另一边的变化。

三、观察者模式分析(Analysis)

Subject:目标对象,通常具有如下功能
         一个目标可以被多个观察者观察
         目标提供对观察者注册和退订的维护
         当目标的状态发生变化时,目标负责通知所有注册的、有效的观察者
Observer:定义观察者的接口,提供目标通知时对应的更新方法,这个更新方法进行相应的业务处理,可以在这个方法里面回调目标对象,以获取目标对象的数据
ConcreteSubject:具体的目标实现对象,用来维护目标状态,当目标对象的状态发生改变时,通知所有注册的、有效的观察者,让观察者执行相应的处理
ConcreteObserver:观察者的具体实现对象,用来接收目标的通知,并进行相应的后续处理,比如更新自身的状态以保持和目标的相应状态一致        

四、实例代码

1、Subject对象及其子类

public class Subject {

	private List<Observer> listObservers = new ArrayList<Observer>();
	
	public void attach(Observer observer){
		this.listObservers.add(observer);
	}
	
	public void detach(Observer observer){
		this.listObservers.remove(observer);
	}
	
	public void notifyObservers(){
		for(Observer observer:listObservers){
			observer.update(this);
		}
	}
}
public class ConcreteSubject extends Subject {
	
	private String state;
	
	public String getState(){
		return this.state;
	}
	
	public void setState(String state){
		this.state = state;
		this.notifyObservers();
	}
}

2、Observer接口及其实现

public interface Observer {

	public void update(Subject subject);
}
public class ConcreteObserver implements Observer {

	private String state;
	
	public void update(Subject subject) {
		System.out.println("状态发生改变,处理相应业务.....");
		state = ((ConcreteSubject)subject).getState();
	}
}

3、客户端调用

public class Client {

	public static void main(String[] args) {

		Observer observer1 = new ConcreteObserver();
		Observer observer2 = new ConcreteObserver();
		
		ConcreteSubject subject = new ConcreteSubject();
		subject.attach(observer1);
		subject.attach(observer2);
		subject.setState("state1");
	}
}

运行结果:


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值