国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發(fā)設(shè)計 > 正文

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

2019-11-18 12:18:11
字體:
供稿:網(wǎng)友

  實現(xiàn)日期選擇
  實現(xiàn)了核心的日期選擇面板,并將它做為一個可用Decorator 模式的接口。(在i/o例子中,所有的Decorate 對象都是inputStream 對象,因此可同等對待,所有的模式構(gòu)造器參數(shù)都是InputStream 引 用,你可以在不知道包裝對象時,用其他Decorator 來包裝任何一個Decorator 。)
  
  public interface Date_selector
  {
    public static final int CHANGE_ACTION = 0;
    public static final int SELECT_ACTION = 1;
  
    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(int,boolean)} */
    public void roll(int flag, boolean up);
  
    /** Must work just like {@link Calendar#get(int)} */
    public int get(int flag);
  }
  
  Date_selector接口定義了2個靜態(tài)值:CHANGE_ACTION和SELECT_ACTION,用于事件處理過程中(在下面將有更多例子)。接口也提供了添加與移除當選擇日期時已激發(fā)的ActionListener對象的方法。最后它提供了模擬java.util.Calendar()方法通過增量(年、月)來推進日歷并獲取屬性值(如當前月份和年份)的接口.
  我們返回動作監(jiān)聽:向按紐增加監(jiān)聽一樣在日期選擇中增加監(jiān)聽。
  
  Date_selector selector = new Date_selector_panel();
  selector.addActionListener
  (  new ActionListener()
    {  public void actionPerformed( ActionEvent e )
      {  // Do whatever you'd do to PRocess an event
      }
    }
  );
  
  監(jiān)聽策略采用的是觀察者(Observer)模式。
  在兩種情況下監(jiān)聽將被喚醒(actionPerformed()被調(diào)用),兩者區(qū)別是通過發(fā)送 ActionEvent 對象,并傳遞給actionPerformed一個getID()消息。下面表進行了具體說明:
  
  動作事件:
  CHANGE_ACTION:當日歷面板改變顯示的月與年(典型的就是導航條要改變)的時候發(fā)送該事件。調(diào)用event.getActionCommand.getActionCommand()去獲得發(fā)生改變后的當前月與年。你也可以調(diào)用get_current_date()獲取當前用戶選擇的日期。
  SELECT_ACTION:當用戶點擊日期時發(fā)送時間,調(diào)用event.getActionCommand.getActionCommand()去獲得選擇日期的字符串形式。(這字符串和使用toString()得到相同的結(jié)構(gòu)。)你也可以調(diào)用get_selected_date()獲取改變后當前用戶選擇的日期。
  下面代碼演示了這兩種事件類型,它實現(xiàn)了當用戶通過導航條改變月份Date_selector改變標簽與用戶點擊面板改變?nèi)掌诘墓δ埽?br />  Date_selector selector = new Date_selector_panel();
  JLabel moth_display = new JLabel();
  
  s.addActionListener
  (  new ActionListener()
    {  public void actionPerformed( ActionEvent e )
      {  if( e.getID() == Date_selector.CHANGE_ACTION )
          month_display.setText( e.getActionCommand() );
        else
          System.out.println( e.getActionCommand() );
      }
    }
  );
  
  所有實現(xiàn)了Date_selector接口,還繼續(xù)了 JPanel類(或至少說是一些 Container 的衍生物)。代碼要實現(xiàn)這個需求,以便日期選擇器不用派生也可以當作一個JPanel使用,但是此時實現(xiàn)不了因為java.awt.Container不是一個接口.對于一個方法,假如要返回一個能看為日期選擇器或容器,它將必須實現(xiàn)這兩個類,這樣是非法的,而且接口(Date_selector)不能繼續(xù)于一個類(Container)。
  
  這個缺陷正好是一個很好的例子:這說明了有時為何難于在已經(jīng)存在而沒有正確使用接口的代碼上改型"四人幫"模式。假如是我,我重制它并將 Container寫成一個接口,實現(xiàn) Container與Date_selector。(很明顯,我無法改變java.*包)。這種類到接口重組是非常困難的,因為,所有的類代碼不變而接口變化程序?qū)袛唷?br />  
  引進c++風格的重載操作原因是通過重載操作"new"可以是重組變的輕易些。這種方式你可以新建(new)一個接口并且具有默認借口類的性質(zhì)。java的解決方法是生成一“四人幫”工廠,它是比剛才那樣假想的正確做法輕易多了。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 红桥区| 秀山| 邓州市| 藁城市| 大埔县| 郸城县| 东乡| 诸暨市| 金山区| 达拉特旗| 龙川县| 诸暨市| 霍山县| 昆明市| 光山县| 嘉鱼县| 黄冈市| 镇赉县| 房产| 榆林市| 娄底市| 鸡西市| 会昌县| 克东县| 临城县| 甘南县| 顺昌县| 繁峙县| 桑植县| 随州市| 渝中区| 凭祥市| 炎陵县| 清流县| 揭阳市| 黄陵县| 彰武县| 孝感市| 衡南县| 马关县| 沅陵县|