1可以任意添加观察者,只要注册就会发信息给观察者
2观察者模式就是出版者与订阅者的关系
3对象是1对多的依赖,当主题改变状态时,所有观察者都会收到通知并自动更新
4涉及的原则
交互对象松耦合,主题不知道观察者的细节,只知道观察者实现了观察者接口
5观察者模式有推(demo1)和拉(demo2)2种模式

 

观察者模式-LMLPHP

观察者模式-LMLPHP

 

 

demo1

/**
 *
 * @author  feizhou
 * 描述:观察者
 */
public interface Observer {

	/**
	 *
	 * 描述:当主题状态改变是,该方法被调用
	 */
void update(String DCName);

}




/**
 *
 * @author feizhou 描述:动漫频道
 */
public class DCChannel implements Subject {



	/**
	 * 订阅动漫频道的用户
	 */
	private ArrayList<Observer> Observers;
	/**
	 * 动漫名称
	 */
	private String DCName;

	public DCChannel() {
		Observers=new ArrayList<Observer>();
	}
	@Override
	public void registerObserver(Observer observer) {
		// 描述:
		Observers.add(observer);
	}

	@Override
	public void removeObserver(Observer observer) {
		// 描述:
		Observers.remove(observer);
	}

	/**
	 * 通知所有的观察者
	 */
	@Override
	public void notifyObservers() {
		// 描述:
		for (Observer observer : Observers) {
			observer.update(DCName);
		}
	}

	/**
	 *
	 * 描述:设置今天的动漫
	 *
	 * @param DCName
	 */
	public void changeTodayTV(String DCName) {
		this.DCName = DCName;
		// 通知所有的观看者
		notifyObservers();
	}

}

/**
 *
 * @author  feizhou
 * 描述:观察者
 */
public interface Observer {

	/**
	 *
	 * 描述:当主题状态改变是,该方法被调用
	 */
void update(String DCName);

}


**
 *
 * @author feizhou 描述:订阅了动漫的观察者1
 */
public class WatchDC1 implements Observer {
	/**
	 * 主题
	 */
	public Subject subject;

	public WatchDC1(Subject subject) {
		this.subject = subject;
		// 注册到主题队列中
		subject.registerObserver(this);
	}

	@Override
	public void update(String DCName) {
		// 描述:
		System.out.println("WatchDC1收到今天看的动漫是" + DCName);
	}

}





/**
 *
 * @author feizhou 描述:订阅了动漫的观察者1
 */
public class WatchDC2 implements Observer {
	/**
	 * 主题
	 */
	public Subject subject;

	public WatchDC2(Subject subject) {
		this.subject = subject;
		// 注册到主题队列中
		subject.registerObserver(this);
	}

	@Override
	public void update(String DCName) {
		// 描述:
		System.out.println("WatchDC2收到今天看的动漫是" + DCName);
	}

}
public static void main(String[] args) {
	DCChannel dCChann=new DCChannel();
	//观察者1注册了主题
	WatchDC1 WatchDC1=new WatchDC1(dCChann);
	//观察者2注册了主题
	WatchDC2 WatchDC2=new WatchDC2(dCChann);

	dCChann.changeTodayTV("奥特曼");
	System.out.println("---------");
	dCChann.changeTodayTV("火影忍者");


结果:
//	WatchDC1收到今天看的动漫是奥特曼
//	WatchDC2收到今天看的动漫是奥特曼
//	---------
//	WatchDC1收到今天看的动漫是火影忍者
//	WatchDC2收到今天看的动漫是火影忍者
}

demo2

/**
 *
 * @author feizhou 描述:动漫频道
 */
public class DCChannel extends Observable {

	public boolean changed;
	/**
	 * 订阅动漫频道的用户
	 */
	private ArrayList<Observer> Observers;
	/**
	 * 动漫名称
	 */
	private String DCName;

	public DCChannel() {
		Observers=new ArrayList<Observer>();
	}

	@Override
	public synchronized void addObserver(Observer o) {
		// 描述:注册主题
		Observers.add(o);
	}

	@Override
	public synchronized void deleteObserver(Observer o) {
		// 描述:删除主题
		Observers.remove(o);
	}

	@Override
	public void notifyObservers() {
		// 描述:通知所有的观察者
		notifyObservers(null);
	}

	@Override
	public void notifyObservers(Object arg) {
		// 描述:通知所有观察者,arg是传送给观察者的数据
		if (changed) {
			for (Observer observer : Observers) {
				observer.update(this, arg);
			}
		}
	}

	@Override
	protected synchronized void setChanged() {
		// 描述:状态标记已经改变的事实
		super.setChanged();
	}

	/**
	 *
	 * 描述:设置今天的动漫
	 *
	 * @param DCName
	 */
	public void changeTodayTV(String DCName) {
		this.DCName = DCName;
		changed = true;
		// 通知所有的观看者
		notifyObservers();
	}

	public String getDCName() {
		return DCName;
	}

}
/**
 *
 * @author feizhou 描述:订阅了动漫的观察者1
 */
public class WatchDC1 implements Observer {
	/**
	 * 主题
	 */
	public Observable observable;
	public WatchDC1(Observable observable) {
		this.observable = observable;
		// 注册到主题队列中
		observable.addObserver(this);
	}
	@Override
	public void update(Observable o, Object arg) {
		DCChannel dCChannel=(DCChannel)o;
		//描述:
		System.out.println("WatchDC1收到今天看的动漫是" + dCChannel.getDCName());
	}



}




/**
 *
 * @author feizhou 描述:订阅了动漫的观察者1
 */
public class WatchDC2 implements Observer {
	/**
	 * 主题
	 */
	public Observable observable;
	public WatchDC2(Observable observable) {
		this.observable = observable;
		// 注册到主题队列中
		observable.addObserver(this);
	}
	@Override
	public void update(Observable o, Object arg) {
		DCChannel dCChannel=(DCChannel)o;
		//描述:
		System.out.println("WatchDC2收到今天看的动漫是" + dCChannel.getDCName());
	}



}

public static void main(String[] args) {
	DCChannel dCChann=new DCChannel();
	//观察者1注册了主题
	WatchDC1 WatchDC1=new WatchDC1(dCChann);
	//观察者2注册了主题
	WatchDC2 WatchDC2=new WatchDC2(dCChann);

	dCChann.changeTodayTV("奥特曼");
	System.out.println("---------");
	dCChann.changeTodayTV("火影忍者");

结果:
//	WatchDC1收到今天看的动漫是奥特曼
//	WatchDC2收到今天看的动漫是奥特曼
//	---------
//	WatchDC1收到今天看的动漫是火影忍者
//	WatchDC2收到今天看的动漫是火影忍者

 

10-05 21:54