观察者模式-Observer Pattern

先俗气的借百科来解释一下概念

观察者模式(有时又被称为发布-订阅Subscribe>模式、模型-视图View>模式、源-收听者Listener>模式或从属者模式)是软件设计模式的一种。在此种模式中,一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实现事件处理系统。

接下来看观察者模式的类结构图:


接下来看一个Java的基本实现:

1.先定义一个被观察者(可以叫做主题)的接口

package com.spook.observer;

/**
 * 主题接口,作为被观察者,被观察者订阅
 */
public interface Subject {
	/** 添加观察者 */
	public void addObserver(Observer observer);

	/** 删除观察者 */
	public void removeObserver(Observer observer);

	/** 通知所有的观察者 */
	public void notifyAllObservers();

}
2.再定义一个观察者的接口

package com.spook.observer;

/**
 * 观察者接口
 */
public interface Observer {
	/** 观察者收到通知后会响应 */
	public void update();
}
3.创建一个具体的主题实现类,作为被观察的对象

package com.spook.observer;

import java.util.ArrayList;
import java.util.List;

/**
 * 具体的某个主题,实现Subject接口
 */
public class ConcreteSubject implements Subject {
	/** 观察者列表 */
	private List<Observer> observerList;

	public ConcreteSubject() {
		observerList = new ArrayList<Observer>();
	}

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

	@Override
	public void removeObserver(Observer observer) {
		observerList.remove(observer);
	}

	@Override
	public void notifyAllObservers() {
		for (Observer o : observerList) {
			o.update();
		}
	}

}
4.创建一个观察者接口的实现类A

package com.spook.observer;

/***
 * 观察者A
 */
public class ObserverA implements Observer {

	@Override
	public void update() {
		// TODO Auto-generated method stub
		System.out.println("Observer A has received notice!");
	}

}
5.再创建一个观察者接口的实现类B

package com.spook.observer;

/***
 * 观察者B
 */
public class ObserverB implements Observer {

	@Override
	public void update() {
		// TODO Auto-generated method stub
		System.out.println("Observer B has received notice!");
	}

}
6.测试类

package com.spook.observer;

/**
 * 观察者模式测试类
 */
public class Test {

	public static void main(String[] args) {
		/** 创建一个主题对象 */
		ConcreteSubject subject = new ConcreteSubject();
		/** 初始化两个订阅者,注意要针对接口编程 */
		Observer a = new ObserverA();
		Observer b = new ObserverB();
		/** 为主题添加观察者 */
		subject.addObserver(a);
		subject.addObserver(b);
		/** 为主题移除观察者 */
		// subject.removeObserver(a);

		/** 当主题变化时,通知所有观察者 */
		subject.notifyAllObservers();
	}

}
运行测试类会输出如下内容:
Observer A has received notice!
Observer B has received notice!

以上是观察者模式的一个基本实现,说明了观察者模式的基本原理。但以上实现依然有它的局限或者可以改进的地方,比如案例中的两个观察者是同一类型,收到通知后执行相同的响应,实际需求中可能不同观察者在收到通知后需要做不同的事情,甚至观察者之间是风马牛不相及的不同对象等,这些可以举一反三,留给大家思考。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值