實現日期選擇
    實現了核心的日期選擇面板,并將它做為一個可用Decorator 模式的接口。(在i/o例子中,所有的Decorate 對象都是inputStream 對象,因此可同等對待,所有的模式構造器參數都是InputStream 引 用,你可以在不知道包裝對象時,用其他Decorator 來包裝任何一個Decorator 。)
核心接口看起來像以下這樣:(先不考慮 javadoc 和一些無關的代碼,以便清晰的說明。更詳細的代碼請見Resources <http://www.javaworld.com/javaworld/jw-07-2003/>)
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個靜態值:CHANGE_ACTION和SELECT_ACTION,用于事件處理過程中(在下面將有更多例子)。接口也提供了添加與移除當選擇日期時已激發的ActionListener對象的方法。最后它提供了模仿java.util.Calendar()方法通過增量(年、月)來推進日歷并獲取屬性值(如當前月份和年份)的接口.
我們返回動作監聽:向按紐增加監聽一樣在日期選擇中增加監聽。
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
        }
    }
);
   監聽策略采用的是觀察者(Observer)模式。
  在兩種情況下監聽將被喚醒(actionPerformed()被調用),兩者區別是通過發送 ActionEvent  對象,并傳遞給actionPerformed一個getID()消息。下面表進行了詳細說明:
動作事件:
change_action:當日歷面板改變顯示的月與年(典型的就是導航條要改變)的時候發送該事件。調用event.getActionCommand.getActionCommand()去獲得發生改變后的當前月與年。你也可以調用get_current_date()獲取當前用戶選擇的日期。
select_action:當用戶點擊日期時發送時間,調用event.getActionCommand.getActionCommand()去獲得選擇日期的字符串形式。(這字符串和使用toString()得到相同的結構。)你也可以調用get_selected_date()獲取改變后當前用戶選擇的日期。
下面代碼演示了這兩種事件類型,它實現了當用戶通過導航條改變月份Date_selector改變標簽與用戶點擊面板改變日期的功能:
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() );
        }
    }
);
    所有實現了Date_selector接口,還繼承了 JPanel類(或至少說是一些 Container 的衍生物)。代碼要實現這個需求,以便日期選擇器不用派生也可以當作一個JPanel使用,但是此時實現不了因為java.awt.Container不是一個接口.對于一個方法,如果要返回一個能看為日期選擇器或容器,它將必須實現這兩個類,這樣是非法的,而且接口(Date_selector)不能繼承于一個類(Container)。
   這個缺陷正好是一個很好的例子:這說明了有時為何難于在已經存在而沒有正確使用接口的代碼上改型"四人幫"模式。如果是我,我重制它并將 Container寫成一個接口,實現 Container與Date_selector。(很明顯,我無法改變java.*包)。這種類到接口重組是非常困難的,因為,所有的類代碼不變而接口變化程序將會中斷。
   引進c++風格的重載操作原因是通過重載操作"new"可以是重組變的容易些。這種方式你可以新建(new)一個接口并且具有默認借口類的性質。java的解決方法是生成一“四人幫”工廠,它是比剛才那樣假想的正確做法容易多了。
ealy ,java 愛好者,Matrix jsp翻譯小組成員,可以點擊http://www.matrix.org.cn/user_view.asp?username=ealy查看她的個人信息 
進入討論組討論。
                     (出處:http://m.survivalescaperooms.com)