设计模式-观察者模式应用

        这几天,仔细的看了设计模式的观察者部分,认认真真的翻看了几本书的介绍,终于对这个模式有了新的认识.主要还是说说我对它的理解和应用吧

        设计模式主要还是通过抽象来实现的吧~.所以可以到处看到设计模式中不论那个模式都是带有抽象类,接口等结构的.观察者模式也不例外.观察者模式主要有参与者,具体参与者,观察者和具体观察者.

         参与者主要就是被观察对象的抽象,如java.util.Observable类就是被观察对象的抽象类,它实现了观察者的增加,删除以及通知等方法.而一般都不推荐此种使用,为什么呢?因为Java使用单一继承,如果你的类已经继承了某个类,想再实现被观察的话,就不能通过继承Observable这个类来实现了.这个时候就要采取另外的做法,实现接口.接口定义观察者增加,删除,通知以及状态改变的方法,而在实现该接口的类中去实现这些方法.

         在这里,主要还是说说我对这个模式的应用吧.由于是通信工程毕业,因此一直在思考网络即时通信系统,也就是类似QQ的系统了.在会员状态改变的时候,会提示某某会员已经上线,这个QQ是做的很好的~.不过,发现一个有趣的是,就是在会员离线或者状态改变的时候好象通知就不那么的及时了,不知道QQ是怎么实现的,但我觉得观察者模式在这个地方用一定是非常好的.

         我构造一个Person类来表示会员类,然后每个对象就表示一个会员,为了让会员之间能够彼此通知状态改变,也是利用观察者模式实现这个功能,利用Member类同时实现参与者接口和观察者接口,这样就可以实现会员之间相互通知,即时同志好友的状态变化了~.

         参与者接口为Subject, 观察者接口为Observer, 分别定义如下:

        

  1. package common;
  2. /**
  3.  * @author HUHG
  4.  *
  5.  */
  6. public interface Subject {
  7.     public void addObserver(Observer observer);
  8.     public void deleteObserver(Observer observer);
  9.     public void notifyObservers();
  10.     
  11.     public boolean hasChanged();
  12. }
  1. package common;
  2. /**
  3.  * @author HUHG
  4.  *
  5.  */
  6. public interface Observer {
  7.     public void update(Person person);
  8. }

 

然后类Person设计如下,其中hasChanged()用来判断用户状态改变是否通知观察者,判断条件改变时可通过改变方法实现即可.代码如下:

  1. package common;
  2. import java.util.ArrayList;
  3. import java.util.Iterator;
  4. import java.util.List;
  5. /**
  6.  * 同一个类,实现观察者和可被观察接口
  7.  * @author HUHG
  8.  *
  9.  */
  10. public class Person implements Subject, Observer {
  11.     private String name= "";
  12.     
  13.     private int status= 0;
  14.     private boolean isChanged= false;
  15.     
  16.     private List<Observer> observerList;
  17.     
  18.     /**
  19.      * @param status
  20.      */
  21.     public Person(String name) {
  22.         super();
  23.         this.name= name;
  24.         
  25.         observerList= new ArrayList<Observer>();
  26.     }
  27.     /**
  28.      * @return the name
  29.      */
  30.     public String getName() {
  31.         return name;
  32.     }
  33.     /**
  34.      * @param name the name to set
  35.      */
  36.     public void setName(String name) {
  37.         this.name = name;
  38.     }
  39.     /**
  40.      * @return the status
  41.      */
  42.     public int getStatus() {
  43.         return status;
  44.     }
  45.     /**
  46.      * 设置对象状态,并通知观察者状态已改变
  47.      * @param status the status to set
  48.      */
  49.     public void setStatus(int status) {
  50.         this.status = status;
  51.         
  52.         if(hasChanged()){
  53.             notifyObservers();
  54.         }
  55.     }
  56.     /* (non-Javadoc)
  57.      * @see common.Observable#addObserver(java.util.Observer)
  58.      */
  59.     public void addObserver(Observer observer) {
  60.         observerList.add(observer);
  61.     }
  62.     /* (non-Javadoc)
  63.      * @see common.Observable#deleteObserver(java.util.Observer)
  64.      */
  65.     public void deleteObserver(Observer observer) {
  66.         observerList.remove(observer);
  67.     }
  68.     /* (non-Javadoc)
  69.      * 通知所有观察者对象状态已经改变
  70.      * @see common.Observable#notifyObsrevers()
  71.      */
  72.     public void notifyObservers() {
  73.         Iterator<Observer> iterator= observerList.iterator();
  74.         while(iterator.hasNext()){
  75.             Observer observer= iterator.next();
  76.             observer.update(this);
  77.         }
  78.     }
  79.     /* (non-Javadoc)
  80.      * 输出显示被观察对象状态已经改变
  81.      * @see common.Observer#update(common.Person)
  82.      */
  83.     public void update(Person person) {
  84.         System.out.println("Name: "+ name);
  85.         System.out.println("Friend: "+ person.getName()+ " Status has changed! Now status is "+ person.getStatus());
  86.         
  87.     }
  88.     
  89.     /* (non-Javadoc)
  90.      * 确定是否需要通知观察者状态已改变
  91.      * @see common.Subject#hasChanged()
  92.      */
  93.     public boolean hasChanged() {
  94.         // TODO Auto-generated method stub
  95.         if(this.getStatus()== 1){
  96.             this.isChanged= true;
  97.         }
  98.         
  99.         return isChanged;
  100.     }
  101. }

        这样所需要的代码就实现了,然后运行测试是否能正确运行.测试类如下:

  1. package common;
  2. /**
  3.  * @author HUHG
  4.  *
  5.  */
  6. public class TestStatus {
  7.     /**
  8.      * @param args
  9.      */
  10.     public static void main(String[] args) {
  11.         // TODO Auto-generated method stub
  12.         Person John= new Person("John");
  13.         Person Lily= new Person("Lily");
  14.         Person Lucy= new Person("Lucy");
  15.         John.addObserver(Lily);
  16.         Lucy.addObserver(Lily);
  17.         
  18.         John.setStatus(1);
  19.         Lucy.setStatus(1);
  20.     }
  21. }

 

运行,输出如下:

Name: Lily
Friend: John Status has changed! Now status is 1
Name: Lily
Friend: Lucy Status has changed! Now status is 1

说明状态改变的时候便会通知好友状态改变,这样就实现了观察者模式的应用~.

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值