Command设计模式

声明:本套日志,纯属个人理解,欢迎各位架构高手不吝赐教!当然,咱都是搞技术的,磨嘴皮子的事,同行们就少点吧!!

 

看了很多设计模式的书,还是什么其他的资料,多数是从工厂模式,单例模式开始的,一开始还能消化一点点,到了后面就越看越糊涂了!

总是又下定决心把设计模式相关的东西再学习一遍,不管怎么说,这一边要留下点自己的心得。基于此,就从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,根本不需要管我们在实际中如何实现,实现什么操作。一个接口分离了调用与被调用者。

在以上的说明中,废话挺多,还好自己好像明白了点,还是希望自己的初衷,抛砖引玉的行为能够得到支持!

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值