设计模式分析与探究

设计模式无非是通过两种手段---封装和解耦 , 以达到软件的健壮性和可复用性。而23种设计模式是这些思想的集中体现, 其实自己完全可以依照上述思想,对这23种基本的模式进行一些修改,以适应自己的需求。

 现在分析一下命令模式。

  在命令模式中, 主要还是使用了封装和解耦。封装体现在Comand接口。在该接口中,有一个excued()方法,该方法定义了具体的命令应该实现的接口(也就是, 应该实现的功能)。然后,在具体的命令类中,实现excued()方法。这里,就涉及到一个解耦的问题, 可以将该命令的实际执行放到具体的业务类中,比如car类的start()方法, 这样,在具体的命令类中,通过依赖该业务类,并且在excued()方法中调用car类的start()方法来完成命令。 这样的设计是属于一种解耦- 具体的命令类和完成功能的业务类之间的耦合。 这样的好处是,降低了业务层和控制层的耦合,利于系统的可重用性(解耦本来就是为了提高软件的可重用性)。

其实,这里还有一个可以自己扩展的地方,就是, 我们发现, 在原始的命令模式中, 具体的命令类中,是依赖于具体的业务类的(比如 car类),我们想到了 应该依赖于抽象 而不是具体这句话。 这样, 我们可以在这里进行一下扩展, 就是, 把业务类抽象成一个接口或者抽象类。 比如 vehicle接口。 这样, 我们在具体的命令类中,原来这个接口。 这样带来的好处 就是,  在同一个局的命令中, 我们可以传入不同的交通工具类,来实现向不同的交通工具发送命令而不需要更改什么代码。确实很强大。 这是因为“依赖于抽象 而不是具体”这句话,其实是抽象大原则下的一个具体的小原则。 都是为了提高软件的可扩展性的。 我们可以看到, 这样的设计确实提高了软件的可扩展性。 呵呵。

  上面 , 是我自己对命令模式的一点扩展, 其实,原始的命令模式要更加具体的使用场合来决定是否需要上述扩展。 因为在一般情况下, 原始的命令模式已经够用了。

 

 在命令模式中, 还有一个值得注意的地方,就是解耦。 下面说说解耦。

  解耦体现在具体的命令类和业务类中实际执行该命令的代码之间的解耦。 这种解耦在命令方法比较复杂,而且与业务逻辑紧密关联的时候使用。 如果, 命令的执行方法比较简单的话, 就应该直接在具体命令类中的excued()方法中完成了。 这样, 具体的命令类就完全不依赖业务类了。

 

最后 , 要说明一下的是,在命令模式中, 还有一种封装。 因为抽象和封装是紧密关联的,通过抽象 ,提取共同点, 然后把这些共同点封装在接口或者抽象类中。 其实 , 封装也可以单独使用,也可以达到降低系统的耦合度的作用。 在命令模式中体现在,通过抽象出Comand接口以后, 客户端已经可以使用这些命令了, 只需要 Car car=new Car();   IComand c=new ConceretComand(car); c.excued();就可以了。 如果, 具体的命令类中的命令比较简单, 是直接执行命令方法的话, 那么构造car业务类的那一句就不需要了。 可见, 解耦的实质, 就是把系统中比较复杂的部分分解成几个比较简单的部分, 而且要保证分解以后, 各个部分尽量的减少依赖。 同时带来的问题,就是,在客户端使用的时候, 需要由客户端来构造各个子部分,并且建立各部分的关联(如果各部分关联很复杂,i那么现在 在客户端建立关联的时候,代码就会很复杂,所以, 解耦时,必须降低各部分的关联)。这等同于将一个大的模块分解成很多小的模块, 在使用的时候, 由客户端来定制这些模块之间的组合,从何大大的提高了代码的灵活性,可见解耦增加了系统的可重用性和灵活性。

 

但是, 命令模式对接口Comand进行了再次的封装。 封装在了具体类Involker中。

封装是解耦的逆过程。 目的是把系统中相关的部分放在一起以便于管理。以减少系统的复杂度和提高系统的易用性。在类Involker中,依赖于抽象comand接口。并且每个接口的引用对应一个具体的命令类。在该类中, 对每个命令类又有一个命令方法,在该命令方法中通过接口调用具体命令类的执行方法,这样,类Involker就像是所有命令的一个家,里面有所有的命令。这样,客户端使用的时候, 就可以直接和 类Involker交互了,当然,在此之前,需要将具体的命令类的实例来初始化类Involker。 这就是因为在类Involker中,依赖的是抽象的Comand接口,带来灵活性的的同时, 在使用的时候, 必须由客户端来确定具体的类。这样,上述 客户端的代码就可以写成:

Car car= new Car();
       Command switchUp=new FlipUpCommand(car );
       Command switchDown=new FlipDownCommand(car );
 
       Switch s=new Switch(switchUp,switchDown);
s.flipUp();
s.flipDown();

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

walkingmanc

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值