设计模式-浅谈观察者模式

import java.util.ArrayList;

/**
 * 观察者模式test
 * GG观察MM
 * @author zhuchen
 * 
 */
public class Test {

	/**
	 * @param args
	 */
	public static void main(String[] args) {

		MM mm = new MM();
		//在MM里 注册个观察者
		mm.registerObserver(new DataSetObserver() {

			@Override
			public void onChange() {
				super.onChange();
				System.out.println("GG know MM's seek help 1!");
			}
		});
		
		//MM发出数据,数据模型发生变化
		mm.sendHelp("help me!");
	}
}
/**
 * 抽象类
 * @author zhuchen
 *
 */
abstract class DataSetObserver {

	public void onChange() {
	};
}
/**
 * MM 被观察者
 * @author zhuchen
 *
 */
class MM {

	GG gg = new GG();

	public void registerObserver(DataSetObserver dataSetObserver) {
		gg.registerObserver(dataSetObserver);
	}

	public void unRegisterObserver(DataSetObserver dataSetObserver) {
		gg.unRegisterObserver(dataSetObserver);
	}

	public void sendHelp(String content) {
		System.out.println("MM say: " + content);
		gg.notifyDataSetChange();
	}
	/**
	 * 观察者
	 * @author zhuchen
	 *
	 */
	class GG extends DataSetObserverable {
		
		public void notifyDataSetChange() {
			super.notifyDataChange();
		}
	}
}
/**
 * 定制的观察者 提供唤醒调用所有的观察者回调方法
 * @author zhuchen
 *
 */
class DataSetObserverable extends Observable<DataSetObserver> {

	public void notifyDataChange() {
		synchronized (mObservers) {
			for (DataSetObserver observer : mObservers) {
				observer.onChange();
			}
		}
	}
}
/**
 * 抽象类  提供观察者集合存放
 * @author zhuchen
 *
 * @param <T>
 */
abstract class Observable<T> {

	protected final ArrayList<T> mObservers = new ArrayList<T>();

	public void registerObserver(T observer) {
		if (observer == null) {
			throw new RuntimeException("current observer is not null");
		}

		if (mObservers.indexOf(observer) != -1) {
			throw new RuntimeException("current observer:" + observer
					+ " is already exist!");
		}
		mObservers.add(observer);
		System.out.println("GG observe MM!");
	}

	public void unRegisterObserver(T observer) {
		if (observer == null) {
			throw new RuntimeException("current observer is not null");
		}
		int index = mObservers.indexOf(observer);
		if (index != -1) {
			mObservers.remove(index);
		}
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值