andy's blog

记录我的所做所思

  BlogJava :: 首页 :: 联系 :: 聚合  :: 管理
  1 Posts :: 13 Stories :: 0 Comments :: 0 Trackbacks

常用链接

留言簿(1)

我参与的团队

搜索

  •  

最新评论

一:case context:
     有一个气象信息类WeatherData,属性包括temperature,humidity等,现有两种显示WeatherData数据的类WeatherDataDisplay1和WeatherDataDisplay2,当WeatherData的信息改变时,这两个显示的类中的数据也改变,维护性方面,可能会有第三种显示方法,某个显示类可以申请不根据WeatherData数据实时改变。

二:
    目前现方法, WeatherData中
     public void measurementsChanged()
    {
         display1.update(getTemperature(),getHumidity());
         display2.update(getTemperature(),getHumidity());
    } 
    但方法体中的代码是可能会变的,有display3的时候,必须得修改代码。
三:
     The Observer pattern:defines a one-to-many dependency between objects so that when one object changes state,
                                           all of its dependents are notified and updated automatically.

    此模式类包括:  Subject 接口{registerObserver();removeObserver(),notifyObservers()}, Concrete Subject 类
                               Observer接口{update();},  多个ConcreteObserver类(display1,display2)。
    public class WeatherData implements Subject
    {
           private  List observerList;
           private float temperature;
           private float humidity;

          public void registerObserver(Observer observer)
          {
                 observerList.add(observer);
          }
          public void notifyObjects()
        {
           for (Iterator iter=objectList.iterator();iter.hasNext();)
         {
           Observer observer=(Observer)iter.next();
            observer.update();
          }
        }
        public void changeData(float newTemperature)
        {
              this.temperature=newTemperature;
              notifyObjects();
        }
    }
   //
    public class WeatherReport1 implements Observer{
      private WeatherData weatherData;
      public WeatherReport1(WeatherData weatherData)
     {
        this.weatherData=weatherData;
        weatherData.registerObject(this);
    }
    public void update() 
    {
     System.out.println("report1--now temperature is:"+weatherData.getTemperature());
    }
  }
 //客户端测试代码
 public class Tester {
 public static void main(String[] args) {
  WeatherData weatherData=new WeatherData();
  WeatherReport1 weatherReport1=new WeatherReport1(weatherData);
  WeatherReport2 weatherReport2=new WeatherReport2(weatherData);
  weatherData.changeData(10);
  weatherData.removeObject(weatherReport1);
  weatherData.changeData(20);
 }
}
四:java语言build-in支持
       在java.util.包中
     Subject接口-->Observable 类(把Observer注册,notify等方法实现)
     Observer接口-->Observer接口
     缺点:Observable是一个类你必须继承它,如果还要继承其它类就不行了。
     所以如果java内建的类不适合你,就按我们上面写的自己重头写一个。

五:实例
     1: swing中的事件处理:
          button.addActionListener(new AL1);
          button.addActionListerner(new AL2);
          public void AL1 implements ActionListener{
                  public void actionPerformed(Event e)
                  {//---
                  }
         }

      2:应用系统中,订阅信息:
         如有多个用户订阅的跟踪某记录更新信息。

posted on 2006-03-27 19:17 zhoumin 阅读(81) 评论(0)  编辑  收藏 所属分类: 设计模式

只有注册用户登录后才能发表评论。


网站导航: