實現日期選擇 實現了核心的日期選擇面板
並將它做為一個可用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(int
boolean)} */
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對象的方法
最後它提供了模仿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的解決方法是生成一
四人幫
工廠
它是比剛才那樣假想的正確做法容易多了
From:http://tw.wingwit.com/Article/program/Java/gj/201311/27359.html