菜鸟硕枫设计模式系列之20 观察者模式

本文介绍了一种常用的设计模式——观察者模式,详细解释了其工作原理,并通过具体代码示例展示了如何实现。观察者模式允许对象在状态改变时通知所有依赖它的对象。
观察者模式是设计模式中非常重要的设计模式之一。主要特点是,向要获得信息的对象在观察平台注册,然后当感兴趣的事情发生时,平台通知每一个注册的观察者,观察者根据发生的事情来做出自己的行为。其中要点在于观察者要能方便注册,方便解除注册,观察平台在事情发生时通知他们。消息的发布 订阅传输方式就是采用观察者模式这种机理的。

观察者模式类图:
[img]http://dl.iteye.com/upload/attachment/364911/da16f36c-c9ac-3876-b121-d0f893b925dc.jpg[/img]


具体代码示例:
观察者接口

package oberserverPattern;

public interface Obersever {

void changeState(int tag);
}


具体实现对象类:


package oberserverPattern;

public class Person implements Obersever {

private String name;

public void setName(String name) {
this.name = name;
}

public String getName() {
return name;
}

public void changeState(int tag){
if(tag==1)
System.out.println(this.name
+" changes his state from playing to hardworking");
if(tag==2)
System.out.println(this.name
+" changes his state from hardworking to playing");
}
}



package oberserverPattern;

import java.util.List;

public interface Subject {

void notify(Obersever obersever,int tag);
}



package oberserverPattern;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class ConcreteSubject implements Subject{

private List<Obersever> obersevers= null;

public void notify(List<Obersever> obersevers,int tag) {
Iterator<Obersever> it = obersevers.iterator();
while(it.hasNext()){
notify(it.next(),tag);
}

}

@Override
public void notify(Obersever obersever,int tag) {

obersever.changeState(tag);
}

public List<Obersever> getList(){
if (obersevers==null)
return new ArrayList<Obersever>();
else
return obersevers;
}
}



package oberserverPattern;

public class Coder extends Person{

}



package oberserverPattern;

public class Boss extends Person{

private int tag;

public void changeState(int tag){
if(tag==1)
System.out.println(this.getName()
+"is coming");
if(tag==2)
System.out.println(this.getName()
+"has gone.");
}

public void setTag(int tag) {
this.tag = tag;
}
public int getTag() {
return tag;
}
}


测试类:

package oberserverPattern;

public class OberseverTest {

public static void main(String[] args){
Boss boss = new Boss();
boss.setName("boss wang");
boss.setTag(1);

Coder coder1 = new Coder();
coder1.setName("lxy");

Coder coder2 = new Coder();
coder2.setName("shuofeng");

ConcreteSubject subject = new ConcreteSubject();
subject.getList().add(coder1);
subject.getList().add(coder1);
boss.changeState(boss.getTag());
subject.notify(subject.getList(), boss.getTag());
coder1.changeState(boss.getTag());
coder2.changeState(boss.getTag());

System.out.println();
System.out.println("---------------Changer boss's state from 1 to 2-----------");
System.out.println();
boss.setTag(2);
boss.changeState(boss.getTag());
subject.notify(subject.getList(), boss.getTag());
coder1.changeState(boss.getTag());
coder2.changeState(boss.getTag());
}
}


说明:观察者模式在消息订阅等其他场合应用广泛,是一种重要的设计模式。要点在于有存储订阅者的聚集,有触发通知的时间,有添加订阅,取消订阅的功能方法。优点在于只有当订阅者期望的事情发生时,订阅者才会被通知,从而完成订阅者期望的事件。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值