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