声明:本套日志,纯属个人理解,欢迎各位架构高手不吝赐教!当然,咱都是搞技术的,磨嘴皮子的事,同行们就少点吧!!
看了很多设计模式的书,还是什么其他的资料,多数是从工厂模式,单例模式开始的,一开始还能消化一点点,到了后面就越看越糊涂了!
总是又下定决心把设计模式相关的东西再学习一遍,不管怎么说,这一边要留下点自己的心得。基于此,就从Command设计模式开始吧!
Command(命令)设计模式
这个模式在很多网站(我比较喜欢jdon,www.jdon.com)上都有介绍,多数开篇就说这个模式是比较简单也比较复杂的。对于我这样的架构新手来讲,我想“简单”这个词对我来说可能不适应。因为我只是了解到,命令模式就是执行命令,就像是部队中上级对下级的指示一样(谁给这个模式起的名,传神啊!),司令只需要根据战况发号使令就好,而下面的同志们只要管好自己的枪,往前冲就ok,大家各司其职,根本不需要关心谁是谁(现实中,哪个司令知道各个班里的同志们的情况啊,能知道所领导的部队的人数就差不多了,愚见啊,大家不要鄙视俺,毕竟参过军)!所以,不管是网上还是书上,都简单的指明,命令模式中最关键的是一个接口,一个下面执行人的统一接口,在此命名为Command接口。定义如下:
public interface Command{
public void execute();
}
这个接口中只有一个方法,当所谓的上级(即调用者)对实现了Command接口的下级发号时,这个兄弟就去execute了。所以,上级只需要知道他的下级是个兵,而且这个兵是有特征的(就是实现了 Command接口),这种特征就决定了这个上级的管辖范围。也就是兵的行为。
所以,上级不需要管下级的任何其他特征(除了知道他是个Command实现),下级也不需要跟上层有任何关联(在现实中,最好是低调做人,高调做事!千万别掩盖自己的功劳!要不然就有人出来替你担功劳了,呵呵)!
以上基本上就是Command模式的大体意思吧。好像非常简单。就看项目中如何使用了。
这个模式的特征(也就是咱什么时候可以使用这个模式呢?):上级要有一批下级(注意哦,上下级关系或者从属关系或者再简单点就是调用关系,怎么表达更好呢,抛砖引玉吧!!)。
到了举例子的时候,没有例子,自己实在是不清楚,可是看了他们的例子,我是真的糊涂了,归根结蒂还是咱对Java的某些方面不清楚造成的。
我也不求创新了,完全为了个人理解。
例子是这样的。
在java的awt底层实现中,对于事件的处理就是使用了Command模式。怎么使用的呢?(我就斗胆从不熟悉的角度分析一下java的源代码吧。说实话,我看了他们例子,还是有点模糊。只好硬着头皮啃点代码了。)
就看看Button.java在java里面的包路径是java.awt.Button。
在Button里面有这样一个方法,等等,还是要先摘一段关于Button的说明(这个说明绝对官方!):
* <p>
* The gesture of clicking on a button with the mouse
* is associated with one instance of <code>ActionEvent</code>,
* which is sent out when the mouse is both pressed and released
* over the button. If an application is interested in knowing
* when the button has been pressed but not released, as a separate
* gesture, it can specialize <code>processMouseEvent</code>,
* or it can register itself as a listener for mouse events by
* calling <code>addMouseListener</code>. Both of these methods are
* defined by <code>Component</code>, the abstract superclass of
* all components.
* <p>
* When a button is pressed and released, AWT sends an instance
* of <code>ActionEvent</code> to the button, by calling
* <code>processEvent</code> on the button. The button's
* <code>processEvent</code> method receives all events
* for the button; it passes an action event along by
* calling its own <code>processActionEvent</code> method.
* The latter method passes the action event on to any action
* listeners that have registered an interest in action
* events generated by this button.
* <p>
java的源代码值得一看啊,这段说明是从使用的角度跟咱说了它的调用方式。尤其是第二段各位可以跟我一起品味一下(声明哦,新手是我!敢狂言,说明俺就是新手,呵呵):当一个Button被pressed 或者 released,AWT就会通过调用Button的processEvent方法发送一个ActionEvent的实例给这个Button,然后这个Button呢就会调用自己的processActionEvent方法,而这个方法又会把event传给注册在这个Button上的监听器,实际上由这个监听器来响应了这个事件。
哈哈,这个processActionEvent方法,我认为很有意思,贴出来看看:
protected void processActionEvent(ActionEvent e) {
ActionListener listener = actionListener;
if (listener != null) {
listener.actionPerformed(e);
}
}
各位看到了吗?对于这个listener.actionPerformed(e);statement才是最有意思的。这个监听使我们注册给这个Button的,尤其是这个监听不是特定某个监听,我们平常使用的时候多数是以匿名类的方式来进行实现,也就是对应的ActionListener 这个接口应该就是我上面说的Command的接口,Button调用这个listener,根本不需要管我们在实际中如何实现,实现什么操作。一个接口分离了调用与被调用者。
在以上的说明中,废话挺多,还好自己好像明白了点,还是希望自己的初衷,抛砖引玉的行为能够得到支持!
1655

被折叠的 条评论
为什么被折叠?



