第189章
大B:“解决办法:情况一、我们可以定义一个接口,让Receiver实现这个接口,Client按照接口调用。情况二、我们可以让Receiver记住一些状态,例如执行前的自己的状态,用来undo,但自己记录自己的状态实现起来比较混乱,一般都是一个累记录另一个类的状态。情况三、很难实现。情况四、我们须要在每个Action,前后加上log。”情况五、相对好实现,但是再加上这个,是否感觉最终的实现很混乱呢?
(“ActionOnehasbeentaken.”);
publicvoidactionTwo{
大B:“看!多简洁。如果是像上边如此简单的需求,这个才应该是我们的选择,但是有些情况下这样的写法不能解决的,或者说解决起来不好,所以引入命令模式。1、我们须要Client和Receiver同时开发,而且在开发过程中分别须要不停重构,改名。2、如果我们要求Redo,Undo等功能。3、我们须要命令不按照调用执行,而是按照执行时的情况排序,执行。4、开发后期,我们发现必须要log哪些方法执行了,如何在尽量少更改代码的情况下实现,并且渐少重复代码。5、在上边的情况下,我们的接受者有很多,不止一个。”
小A:“当我们遇到这些情况时应该怎样去解决?”
Commandcmd;
while((cmd=getCmd)!=null){www.smrhm.com 幻想小说网
log(“begin”+www.youxs.org);
www.youxs.org;
log(“end”+www.youxs.org);
publicCommandgetCmd{
//按照自定义优先级,排序取出。
publicclassClient{
publicstaticvoidmain(Stringargs){
Receiverreceiver=newReceiver;
CommandmandOne=newConcreteCommandOne(receiver);
CommandmandTwo=newConcreteCommandTwo(receiver);
Invokerinvoker=newInvoker;
(mandOne);
(mandTwo);
publicReceiver{
//
privateListcmdList=newArrayList;
publicInvoker{
publicclassClient{
publicvoidactionOne{
publicadd(Commandmand){
(mand);
publicremove(Commandmand){
}
publicclassReceiver{
为什么使用命令模式大B:“上边的代码是否看起来很傻呢,本来可以这样简单实现的。”
大B:“好,我们再来看看命令模式,在命令模式中,我们增加一些过渡的类,这些类就是上边的命名接口和命令实现,这样就很好的解决了情况一、情况二。我们再加入一个Invoker,这样情况三和情况四就比较好解决了。”
如下加入Log和排序后的。
publicclassInvoker{
(mand);
publicvoidaction{
(“ActionTwohasbeentaken.”);
publicstaticvoidmain(Stringargs){
Receiverreceiver=newReceiver;
阅读大话设计模式最新章节 请关注米妮小说网(www.qixinyuan.com.cn)
智能推荐:【天才俱乐部】【从婴儿开始入道】【养成系男神:听劝后,我成了顶流】【太阳与雄狮】【殊途仙路】【昭奚旧草】【斗罗之前世今生开局曝光唐三】【拥有学习面板的神豪】【黄昏分界】【四合院从美好生活开始】【从小欢喜开启诸天之旅】【职场沉浮录】【断刃行】【七零大杂院小寡妇】【归雾】【封神还没开始,你篡位了纣王?】【流浪诸天的剑客】【执掌风云萧峥】【苍蓝星,亦是宝可梦大师!】【诡道求仙,从将自己炼成傀儡开始】【这主播真狗,挣够200就下播】【重生99做汽车巨头】【我在红楼改气数】【重生1975:开局撕毁回城调令】【我儿明明是纨绔,咋成帝国之虎了】【绝世天龙】【影视:流窜在诸天的收集员】【全职高手之机械之王】【云其深】【摆烂太狠,我被宗门当反面教材了】