- 浏览: 218452 次
- 性别:
- 来自: 广州
文章分类
最新评论
-
thebye85:
引用 另外一个需要注意的问题,就是SessionMap和隐藏对 ...
WebWork深度探索之Session -
lanxiaoshuang:
写的真好
说的都是概念——有关编程范式 -
lhz:
grep unique wc你需要的只是这么几个小工具而已
努力做个Pragmatic Programmer
模式是什么?说实在的,对于模式,我了解得很少。但是,我知道,模式是用来解决软件设计问题的,是用来增加软件设计的灵活性和可维护性的,总之,它应该是程序员经过大量开发工作之后,对于解决问题的经验总结;模式不是用来生搬硬套的,也不是拿来故弄玄虚的,它是用来解决问题,从而让我们更加享受编码的乐趣。我无意直接去讲解什么模式,因为我还没有那样的实力,我能够讲的就只有模式给我带来的顿悟了。咦,怎么文不对题了呢?呵呵,有了顿悟,难道还不是莫大的乐趣吗?闲话少说,言归正传。
首先,让我们先来看一段代码:
JPanel panel;
public MainFrame() {
panel = new JPanel();
panel.setLayout(new FlowLayout());
JButton blueButton = new JButton("Blue");
blueButton.addActionListener(new BlueColorActionListener());
JButton redButton = new JButton("Red");
redButton.addActionListener(new RedColorActionListener());
panel.add(blueButton);
panel.add(redButton);
getContentPane().add(panel);
setSize(300, 100);
setVisible(true);
}
class BlueColorActionListener implements ActionListener {
public void actionPerformed(ActionEvent event) {
panel.setBackground(Color.blue);
}
}
class RedColorActionListener implements ActionListener {
public void actionPerformed(ActionEvent event) {
panel.setBackground(Color.red);
}
}
public static void main(String[] args) {
MainFrame frame = new MainFrame();
}
}
如果你有写过Java GUI的程序,一定会对以上的代码很熟悉。这段小代码实现的功能也很简单,就是通过点击按钮去改变窗口的背景颜色。大家在看这段代码的时候,有没有不爽的感觉呢?是的,就是这里了。为了使得窗口上的按钮能够响应鼠标或者是键盘的事件,我们都必须为每个按钮增加相应的ActionListener。如果每个button对应Click事件有迥异的处理,那么构建不同的ActionListener也是无可厚非的,但是,如果按下button,所做的事情很类似呢?譬如以上代码中,两个按钮的功能就很类似,一个是让背景变成红色,一个则是蓝色而已。那么,我们是不是应该将这些共同点提取出来,以减少代码的重复呢?接着就是第二个版本的程序了,使用CommonActionListener去替代原有的两个ActionListener:
public void actionPerformed(ActionEvent event) {
JButton button = (JButton)event.getSource();
if (button.getText().equals("Blue"))
panel.setBackground(Color.blue);
else if (button.getText().equals("Red"))
panel.setBackground(Color.red);
}
}
这样的改动之后,最明显的提高之处就是减少了一个Inner Class,让代码更加集中了,同时复杂性也转嫁到了一个class中。大家可以想象,随着button的增加,if...else的数量也随之增加,如果又出现了一个不同功能的button,增加新的ActionListener也是必不可少的。这个CommonActionListener根本就不Common。到底怎么样才能让它变成真正Common呢?好,最重要的问题终于提出来了。
public void execute();
}
JPanel panel;
public BlueButton(String text, JPanel panel) {
super(text);
this.panel = panel;
this.addActionListener(new CommonActionListener());
}
public void execute() {
panel.setBackground(Color.blue);
}
}
class RedButton extends JButton implements Command {
JPanel panel;
public RedButton(String text, JPanel panel) {
super(text);
this.panel = panel;
this.addActionListener(new CommonActionListener());
}
public void execute() {
panel.setBackground(Color.red);
}
}
public void actionPerformed(ActionEvent event) {
Command command = (Command)event.getSource();
command.execute();
}
}
public MainFrame() {
JPanel panel = new JPanel();
panel.setLayout(new FlowLayout());
JButton blueButton = new BlueButton("Blue", panel);
JButton redButton = new RedButton("Red", panel);
panel.add(blueButton);
panel.add(redButton);
getContentPane().add(panel);
setSize(300, 100);
setVisible(true);
}
public static void main(String[] args) {
MainFrame frame = new MainFrame();
}
}
(MainFrame.java)
以上的代码正是使用Command模式,对于ActionListener而言,它只是知道调用execute方法,而这个方法对于每一个button都是适用的,就像是命令(Command)一样,而真正的处理则放到了每个特定的button中。就像一位指挥官对着士兵们喊出Action,接着士兵们就去行动了,而指挥官并不需要知道士兵们怎么去做事情,因为指挥官知道士兵们都能做好事情,这些士兵都是服从命令的(实现了Command接口)。需要说明的一点是,在这里由于两个button的功能比较类似,这样组织代码所带来的好处并不是非常突出,大家可以考虑一下,如果button的功能截然不同的情况。
发表评论
-
在String的面前丢脸
2004-06-18 00:39 1214重返C++的世 ... -
Summary of function parameter
2004-07-14 02:33 1106对C++这位入 ... -
此Vector非彼Vector
2004-08-05 15:51 996在学习STL的过程中,我发现了一个熟悉的面孔— ... -
模板——泛型和STL的基础
2004-08-07 01:01 1275所谓泛型,从字面上可以猜想,就是泛化的类型(型 ... -
让人头痛的Vector(提问篇)
2004-08-07 16:55 1187在写完了此Vector非彼Vector这篇随笔 ... -
我该怎样shuffle呢
2004-08-10 01:47 1090在STL的Algorithm中有着这样的一种算 ... -
WebWork初体验
2004-08-11 17:43 1219在这篇ASP.NET ... -
WebWork深度探索之盲人摸象
2004-08-12 23:54 1049昨天尝试着利用WebWork做了一个小功能[1 ... -
WebWork深度探索之号外
2004-08-14 09:03 992昨天开始对WebWork进行了一些初步的探索[ ... -
WebWork深度探索之标签库
2004-08-15 00:28 1483由于WebWork本身提供了一套自定义的标签库 ... -
什么是Law of Demeter
2004-08-15 14:22 1158今天一如昨日,继续对WebWork进行小打小闹 ... -
所谓的Dumb Question
2004-08-15 17:16 968为了能够更 ... -
WebWork深度探索之标签库(续)
2004-08-16 15:58 1071昨日对WebWork的标签库进行了小小的研究[ ... -
WebWork深入探索之初见端倪
2004-08-19 16:35 844使用WebWork进 ... -
建网站的小Tips
2004-08-20 23:58 974这几天都在忙着做一个小网站,从网页美工到后台处 ... -
URL与RequestDispatcher
2004-08-21 23:58 951今天照例继续自己的网站建设之旅,原本以为可以大 ... -
WebWork深度探索之Pitfall
2004-08-25 14:31 920在使用WebWork进行开发的过程中,她的种种 ... -
WebWork深度探索之Session
2004-08-26 15:38 1459昨天上午刚 ... -
搞笑的textarea标签
2004-08-31 18:17 1543很久没有用 ... -
两天四疑问
2004-09-03 10:56 9379月份的前两天,我仍然做着网站开发的工作。在开 ...
相关推荐
业务层框架 —— Command Pattern指南.mht业务层框架 —— Command Pattern指南.mht
iOS实例开发源码——commanda-TwitterGame-26b6290.zip
rip的命令,我总结的关于常见的rip的命令,很好用的亲。谢谢支持!谢谢!
提起Command模式,我想没有什么比遥控器的例子更能说明问题了,本文将通过它来一步步实现GOF的Command模式。 我们先看下这个遥控器程序的需求:假如我们需要为家里的电器设计一个远程遥控器,通过这个控制器,我们...
14. 命令模式(Command Pattern) 15. 迭代器模式(Iterator Pattern) 16. 观察者模式(Observer Pattern) 17. 解释器模式(Interpreter Pattern) 18. 中介者模式(Mediator Pattern) 19. 职责链模式(Chain of ...
Command设计模式ppt 代码示例 设计模式 Command ppt 代码实例 撤销重做实例
自己写个command模式的测试代码,很清楚,一看就会。呵呵,混点资源分。
Command模式(Java设计模式),经典设计模式之一,有利于编程学习
有关设计模式里边的命令模式,内含ppt、源代码及结果、word整理。在此以供大家学习交流。
C++设计模式代码资源23_Command_命令模式.zip
本书分类描述了一组设计良好,表达清楚的软件设计模式,这些模式在实用环境下有特别有用。 -------- 目 录 序言 前言 读者指南 第1章 引言 1 1.1 什么是设计模式 2 1.2 Smalltalk MVC中的设计模式 3 1.3 描述设计...
C#面向对象设计模式纵横谈(15):(行为型模式) Command 命令模式
命令模式,将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤消的操作。
命令模式(Command) 用意:把一个请求封装到一个对象中,把发出命令和执行命令的责任分开,委派给不同的对象实现。
C++设计模式课件23_Command_命令模式.pdf
将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可取消的操作。
5.2 COMMAND(命令)——对象行为型模式 5.3 INTERPRETER(解释器)——类行为型模式 5.4 ITERATOR(迭代器)——对象行为型模式 5.5 MEDIATOR(中介者)——对象行为型模式 5.6 MEMENTO(备忘录)——对象行为型...
设计模式C++学习之命令模式(Command)
用C++实现Command模式实现undo操作
这是用Command设计模式设计的搭建的一个小框架例子,初学使用,如果是框架设计高手,不用看了,初学者可以参考下。