熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java高級技術 >> 正文

使用Decorator模式實現日期選擇組件(2)

2013-11-23 19:43:18  來源: Java高級技術 

  實現日期選擇
  實現了核心的日期選擇面板並將它做為一個可用Decorator 模式的接口(在i/o例子中所有的Decorate 對象都是inputStream 對象因此可同等對待所有的模式構造器參數都是InputStream 引 用你可以在不知道包裝對象時用其他Decorator 來包裝任何一個Decorator
  
  public interface Date_selector
  {
    public static final int CHANGE_ACTION = ;
    public static final int SELECT_ACTION = ;
  
    public void addActionListener(ActionListener l);
    public void removeActionListener(ActionListener l);
  
    public Date get_selected_date();
    public Date get_current_date();
  
    /** Must work just like {@link Calendar#roll(intboolean)} */
    public void roll(int flag boolean up);
  
    /** Must work just like {@link Calendar#get(int)} */
    public int get(int flag);
  }
  
  Date_selector接口定義了個靜態值CHANGE_ACTION和SELECT_ACTION用於事件處理過程中(在下面將有更多例子)接口也提供了添加與移除當選擇日期時已激發的ActionListener對象的方法最後它提供了模仿javautilCalendar()方法通過增量(年月)來推進日歷並獲取屬性值(如當前月份和年份)的接口
  我們返回動作監聽向按紐增加監聽一樣在日期選擇中增加監聽
  
  Date_selector selector = new Date_selector_panel();
  selectoraddActionListener
  (  new ActionListener()
    {  public void actionPerformed( ActionEvent e )
      {  // Do whatever youd do to process an event
      }
    }
  );
  
  監聽策略采用的是觀察者(Observer)模式
  在兩種情況下監聽將被喚醒(actionPerformed()被調用)兩者區別是通過發送 ActionEvent 對象並傳遞給actionPerformed一個getID()消息下面表進行了詳細說明
  
  動作事件
  CHANGE_ACTION當日歷面板改變顯示的月與年(典型的就是導航條要改變)的時候發送該事件調用eventgetActionCommandgetActionCommand()去獲得發生改變後的當前月與年你也可以調用get_current_date()獲取當前用戶選擇的日期
  SELECT_ACTION:當用戶點擊日期時發送時間調用eventgetActionCommandgetActionCommand()去獲得選擇日期的字符串形式(這字符串和使用toString()得到相同的結構)你也可以調用get_selected_date()獲取改變後當前用戶選擇的日期
  下面代碼演示了這兩種事件類型它實現了當用戶通過導航條改變月份Date_selector改變標簽與用戶點擊面板改變日期的功能
  Date_selector selector = new Date_selector_panel();
  JLabel moth_display = new JLabel();
  
  saddActionListener
  (  new ActionListener()
    {  public void actionPerformed( ActionEvent e )
      {  if( egetID() == Date_selectorCHANGE_ACTION )
          month_displaysetText( egetActionCommand() );
        else
          Systemoutprintln( egetActionCommand() );
      }
    }
  );
  
  所有實現了Date_selector接口還繼承了 JPanel類(或至少說是一些 Container 的衍生物)代碼要實現這個需求以便日期選擇器不用派生也可以當作一個JPanel使用但是此時實現不了因為javaawtContainer不是一個接口對於一個方法如果要返回一個能看為日期選擇器或容器它將必須實現這兩個類這樣是非法的而且接口(Date_selector)不能繼承於一個類(Container)
  
  這個缺陷正好是一個很好的例子:這說明了有時為何難於在已經存在而沒有正確使用接口的代碼上改型四人幫模式如果是我我重制它並將 Container寫成一個接口實現 Container與Date_selector(很明顯我無法改變java*包)這種類到接口重組是非常困難的因為所有的類代碼不變而接口變化程序將會中斷
  
  引進c++風格的重載操作原因是通過重載操作new可以是重組變的容易些這種方式你可以新建(new)一個接口並且具有默認借口類的性質java的解決方法是生成一四人幫工廠它是比剛才那樣假想的正確做法容易多了
From:http://tw.wingwit.com/Article/program/Java/gj/201311/27359.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.