Patterns of Action

Action 模式

写了很长时间的Swing 程序,总结了一些Action 使用方面的模式与大家共享一下。

1、Sensitive Action Pattern

写过Swing 程序的人都知道,根据用户选择的对象来控制某些Action 的状态(Enable/Disable)是比较繁琐的一件事情,通常我们需要监听控件的选择事件,然后再获取到Action的实例,再根据不同的条件来改变它的状态,代码中到处充满了if...else...这些过程性的代码,而且有时为了获取到Action 的实例,还要做很多特殊的处理。

Sensitive Action 模式是我在编写代码时想出的,主要的目的是让代码变得更加简洁,尽量避免重复的代码。接口层的结构图如下:

接口图

上图中各成员的说明如下:

SensitiveAction:该接口定义了selectionChanged 方法,当用户选择对象发生变化时,可以通过该方法通知本Action,

InstanceProvider:该接口定义了一些方法用户获取用户选中的实例。

除了上面定义的接口以外,还有一些帮助类如下:

这些ActionHelper 类主要负责监听事件,然后通知所有被加入的SensitiveAction。

具体应用时的代码如下:

java 代码
 
  1. public void attachAction(JTable table) {
  2. JTableActionHelper helper = new JTableActionHelper(table);
  3. ConcreteAction action1 = new ConcreteAction();
  4. helper.addSensitveAction(action1);
  5. .....//Create popup menu and add it to the JTable
  6. }

2、Alternative Action Pattern

该模式是基于上面的SensitiveAction 模式的,我在开发的经常会遇到一些互斥的Action,例如:Lock/Unlock,Activate/Deactivate 等等。这些Action 同时只能出现一个,AlternativeAction 的代码实现如下:

java 代码
 
  1. public class AlternativeAction extends AbstractAction implements SensitiveAction{
  2. public AlternativeAction(SensitiveAction action1,SensitiveAction actions2) {
  3. this.action1 = action1;
  4. this.action2 = action2;
  5. }
  6. public void actionPerformed(ActionEvent event) {
  7. if(action1.isEnable())
  8. action1.actionPerformed(event);
  9. else if(action2.isEnable())
  10. action2.actionPerformed(event);
  11. }
  12. public void selectionChanged(InstanceProvider provider) {
  13. action1.selectionChanged(provider);
  14. action2.selectionChanged(provider);
  15. if(action1.isEnabled())
  16. putValue(NAME,action1.getValue(NAME);
  17. else if(action2.isEnable())
  18. putValue(NAME, action2.getValue(NAME));
  19. )
  20. }

3、Safe Action

在Action 的actionPerformed 方法中经常会出现一些 RuntimeException,这些异常如果不被捕捉,就会出现用户点击了一个菜单或按钮后没有任何反应;有时候,我们也需要在actionPerformed 方法中处理一些业务相关的Exception,例如:用户去删除一个用户组下有用户的用户组时,系统应该弹出相应的警告对话框。像这类的问题如果让每个Action 自己去处理会出现很多重复的代码,应该只需要一个类去处理这类问题,然后所有的Action 从该中继承就可以了,代码如下:

java 代码
 
  1. public abstract class SafeAction extends AbstractAction{
  2. private Container parent;
  3. public SafeAction(Container parent) {
  4. this.parent = parent;
  5. }
  6. public void actionPerformed(ActionEvent e) {
  7. try {
  8. performed(e);
  9. } catch (Throwable e1) {
  10. //Show error dialog;
  11. }
  12. }
  13. public abstract void performed(ActionEvent e)throws Throwable;
  14. }

该类定义了一个模板方法performed 方法,子类应该在该方法中编写Action 的执行代码。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值