医学院的外科老师给同学讲解什么是无菌什么是干净,老师说:你把一坨屎放在高压锅里蒸一个刻钟,它就是无菌的了,但是它干净不干净呢?真是服了这个老师,好有才。(摘~~)
观察者模式:定义对象之间一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。
书中阐述的例子是报纸订阅服务:
出版者 就是一:出版者更新数据,马上立刻通知订阅者
订阅者 就是多:订阅者即为观察者,获取消息。订阅者可以选择退出观察队列,非订阅者可以选择加入观察队列中。
subject--->observer
需要定义两大接口:一个 主题 接口,一个 观察者 接口(针对接口进行编程,而不是针对实现进行编程)
我们可以把主题想象成一个狼人杀公会,此公会需要向外提供注册的,退出公会,并提供即时更新公会消息通知给公会成员的接口。
而公会成员有很多很多,因此仍然需要提供一个成员接口,用于获取公会消息。具体的公会成员只需要实现即可。每个成员属于自己的消息显示界面。我们把消息显示界面也定义成一个接口。
具体实现如下:
首先定义一个狼人杀公会接口:
package com.zl.observer.one;
public interface GuildWolf {
public void registerObserver(Observer o);//参数为成员对象
public void removeObserver(Observer o);
public void notifyObserver();//该方法用于发布消息
}
公会成员接口:
package com.zl.observer.one;
public interface Observer {
public void update(String message);
}
消息显示接口:
package com.zl.observer.one;
public interface DisplayMessage {
public void display();
}
建立一个狼人杀公会:
package com.zl.observer.one;
import java.util.ArrayList;
public class GuildWolfOne implements GuildWolf {
private ArrayList<Observer> Observes;//把公会成员依次放进list容器中,便于管理
private String message;
public GuildWolfOne(){
Observes=new ArrayList<Observer>();
}
@Override
public void registerObserver(Observer o) {
// TODO Auto-generated method stub
Observes.add(o);
}
@Override
public void removeObserver(Observer o) {
// TODO Auto-generated method stub
int i = Observes.indexOf(o);
if(i>=0)
Observes.remove(i);
}
@Override
public void notifyObserver() {
// TODO Auto-generated method stub
for(int i=0;i<Observes.size();i++){
Observer observer=Observes.get(i);
observer.update(message);
}
}
public void MessageContentChanged(){//内部方法直接调用接口方法
notifyObserver();
}
public void setMessageContent(String message){//该方法用于设置消息
this.message=message;
}
}
实例化第一个狼人杀游戏者:
package com.zl.observer.one;
public class Observerone implements Observer,DisplayMessage {
private String message;
private GuildWolf GuildWolfone;
public Observerone(GuildWolf GuildWolfone){//构造器初 申请进入狼人杀公会
this.GuildWolfone=GuildWolfone;
GuildWolfone.registerObserver(this);
}
@Override
public void update(String message) {
// TODO Auto-generated method stub
this.message=message;
display();
}
public void display(){
System.out.println(this.getClass().getName()+message);
}
}
实例化第二个狼人杀游戏玩家:
package com.zl.observer.one;
public class Observertwo implements Observer, DisplayMessage {
private GuildWolf tGuildWolf;
private String message;
public Observertwo(GuildWolf tGuildWolf){
this.tGuildWolf=tGuildWolf;
tGuildWolf.registerObserver(this);
}
@Override
public void display() {
// TODO Auto-generated method stub
System.out.println(this.getClass().getName()+message);
}
@Override
public void update(String message) {
// TODO Auto-generated method stub
this.message=message;
display();
}
}
开始进行测试:
package com.zl.observer.one;
public class TestObserver {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
GuildWolfOne tGuildWolf=new GuildWolfOne();
Observer tObserver=new Observerone(tGuildWolf);
Observer mObserver=new Observertwo(tGuildWolf);
tGuildWolf.setMessageContent("节日快乐!!!");
tGuildWolf.MessageContentChanged();
}
}