设计模式之观察者模式

观察者模式通俗点讲相当于一个电台广播。打开收音机,找到电台这叫注册,离开电台叫注销,从电台听到的栏目就叫更新内容。内容对于注册了的用户时时更新,对于没有注册和已经注销了的用户也没有什么作用。
电台又可以叫做主题,打开电台的人可以叫做观察者。那么可以总结出主题具有更新内容的事件,而观察者可以注册、注销的事件。
对于一个主题,可以按照如下去设计代码:

// 主题
public interface Subject{
public void registerObservers(Observer o);
public void removeObservers(Observer o);
public void notifyObservers();
}

// 观察者
pubilc interface Observer{
public void update(String name,boolean sex);
}

// 观察者行为
public interface DisplayElement{
public void display();
}

通过使用接口我们可以更方便的扩展。

public class Thread implements Subject{
private String name;
private boolean sex;
private List<Observer> obList;

public Thread(){
obList = new ArrayList(Observer)();
}
@override
public void registerObservers(Observer o){
obList.add(o);
}
@override
public void removeObservers(Observer o){
int index = obList.getIndex(o);
if(index>=0){
obList.remove(index);
}
}
public void notifyObservers(){
for(Observer obs : obList){
obs.update(name,sex);
}
}
public void updateThreadProperty(String name,boolean sex){
this.name = name;
this.sex = sex;
notifyObservers();
}
}

public class ObserverPerson implements Observer,DisplayElement{
private String name;
private boolean sex;
public ObserverPerson(Thread th){
th.registerObserver(this);//将当前对象注册到广播中
}
@override
public void update(String name,boolean sex){
this.name = name;
this.sex = sex;
displayElement();
}
@override
public void displayElement(){
System.out.println("name is "+this.name+"sex is"+(sex)?"man":"woman");
}
}

public class Test{
public static void main(String[] args){
Thread th = new Thread();
ObserverPerson p1 = new ObserverPerson(th);
ObserverPerson p2 = new ObserverPerson(th);
ObserverPerson p3 = new ObserverPerson(th);
th.updateThreadProperty("will",true);
th.updateThreadProperty("lucy",false);
}
}

java中其实已经实现了观察者模式,上面代码中的Subject相当于java.util中的observerable类,Observer相当于java.util中的observer接口。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值