最近做了一个系统对接,突然想起这个设计模式,与大家分享O(∩_∩)O~

观察者模式定义的是一对多的依赖关系,让多个观察者对象同时监听某一个主体对象。

这个对接的情形与此类似:航空公司实时往定制航班的客户发送航班信息(及航班信息一有变化立即通知相关客户)。

 类图:

抽象主题里面定义了一个私有的链表,存放客户信息,同时定义了3个方法分别是添加(Attach)、删除(Detach)观察者的方法,Notify会将航班信息通知到各个客户。

下面是具体的类:

航班信息:

 

public class FightInfo {
private String fightNo;
private String fDates;
private String fArrive;

public String getFightNo(){
 return this.fightNo;
}
public void setFightNo(String FightNo){
 this.fightNo=FightNo;
}
public String getFDate(){
 return this.fDates;
}
public void setFDate(String FDate){
 this.fDates=FDate;
}
public String getFArrive(){
 return this.fArrive;
}
public void setFArrive(String FArrive){
 this.fArrive=FArrive;

}

 

定义抽象观察者

public interface Client {
 public void update( FightInfo Info);
}

定义具体的观察者-客户A

public class ClientA implements Client {

 public void update(FightInfo Info) {
  // TODO Auto-generated method stub
  System.out.print("\n");
  System.out.append("A has Get the Fight Infomation!");
  System.out.append(Info.getFightNo()+"*"+Info.getFDate()+"*"+Info.getFArrive());
  System.out.print("\n");
 }
}

 

定义抽象主题:

 

public abstract class Airlines {

 private List<Client> lObserver=new ArrayList<Client>();
 public  void attach(Client o)
 {
    lObserver.add(o);
 }
 
 public void detach(Client o)
 {
    lObserver.remove(o);
 }
 
 public void notifyObserver(FightInfo Info)
 {
    for(Client c : lObserver)
    {
       c.update(Info);
    }
 }
}

 

 定义具体的被观察者——航空服务公司

 

public class CocreteAirlines extends Airlines{

}

 

观察者和被观察者都有了 再看一下他吗之间的调用关系

 public static void main(String[] args)
 {
  FightInfo Info=new FightInfo();
  Info.setFightNo("HY8712");
  Info.setFArrive("北京");
  Info.setFDate("2010-10-12 12:12:12");
  Client c=new ClientA();
  Airlines al=new CocreteAirlines();
  al.attach(c);
  al.notifyObserver(Info);

 }

如果有更多的客户,可以定义更多的观察者(继承Client类)即可

 

Posted on 2010-08-29 18:25  ItisFriday  阅读(324)  评论(0编辑  收藏  举报