首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件开发 >

学学设计形式【观察者模式】

2012-08-24 
学学设计模式【观察者模式】?观察者模式学习:比如一个角色发生了变化,或者做了什么操作,要通知其他一系列对

学学设计模式【观察者模式】

?观察者模式学习:

比如一个角色发生了变化,或者做了什么操作,要通知其他一系列对象做动作。又叫发布/订阅模式。

写了个例子,下面是个通用类图和一个例子的类图:


学学设计形式【观察者模式】

下面是例子的部分代码:(例子是中国做了些事情,美国,小日本就急了,跟着做了些事情)

1.首先是一个观察者接口和具体的实现类,

package com.myapp.observer;     /**   * 观察者接口   * @author seeeyou   *   */  public interface ForeignObserver {       public void doSometing();   }       package com.myapp.observer;     public class America implements ForeignObserver {         public void doSometing() {           System.out.println("美国发现中国XXXXXXXXXXX,发表XXXX,中国威胁论...");       }     }       package com.myapp.observer;     public class Jpan implements ForeignObserver {         public void doSometing() {           System.out.println("日本发现中国XXXXXXXXXXX,也开始自己XXXXXXXXXXX");       }     }  ?

?

2、然后是被观察者抽象类和实现类,

?

?

package com.myapp.observer;     import java.util.ArrayList;   import java.util.Iterator;     /**   * 被观察者,里面包含了两个具体逻辑,可以抽象出一个具体的接口,使被观察接口更单一,这里写在一起   * @author seeeyou   *   */  public abstract class Subject {       ArrayList<ForeignObserver> obseList = new ArrayList<ForeignObserver>();              /**       * 增加一个观察者       * @param obj       */      public void addObserver(ForeignObserver obj){           obseList.add(obj);       }              /**       * 删除一个观察者,可能根据具体不同,实现也不同       * @param obj       */      public void deleteObserver(ForeignObserver obj) {           obseList.remove(obj);       }              /**       * 通知所有的观察者       */      public void notifyAllObServer(){           for (ForeignObserver obj : obseList) {               obj.doSometing();           }       }              public abstract void sendWeixing();              public abstract void doYuanZIdan();   }       package com.myapp.observer;     public class China extends Subject{       /**       * 一个具体操作       */      public void sendWeixing(){           System.out.println("中国发射卫星。。。。。。。");           notifyAllObServer();       }              /**       * 一个具体操作       */      public void doYuanZIdan() {           System.out.println("中国做了个原子弹。");           notifyAllObServer();       }   }  ?

?

?

3.客户端来调:

?

?

package com.myapp.observer;     public class Client {       public static void main(String[] args) {           America america = new America();           Jpan jpan = new Jpan();           Subject subject = new China();           subject.addObserver(america);           subject.addObserver(jpan);           //发射卫星           subject.sendWeixing();           System.out.println("--------------------");           //造原子弹           subject.doYuanZIdan();       }   }         运行结果是:     中国发射卫星。。。。。。。   美国发现中国XXXXXXXXXXX,发表XXXX,中国威胁论...   日本发现中国XXXXXXXXXXX,也开始自己XXXXXXXXXXX   --------------------   中国做了个原子弹。   美国发现中国XXXXXXXXXXX,发表XXXX,中国威胁论...   日本发现中国XXXXXXXXXXX,也开始自己XXXXXXXXXXX  

?

结束了

4、目前java中已经有了Observable这个被观察者接口了,只需要实现即可,也已经有了observer观察者接口了,实现也可以。所以这个模式现在应该比较简单了。

热点排行