设想形式之敕令形式(一)

2019年7月2日11:03:29设想形式之敕令形式(一)已关闭评论 239

在本次进修过程当中,我们把封装带到一个全新的境地:把要领挪用(method invocation)封装起来。没错,经由过程封装要领挪用,我们可以或许把运算块包装成形。

以是挪用此运算的对象不须要体贴事变是怎样举行的,只需晓得怎样运用包装成形的要领来完成它就可以够。经由过程封装要领挪用,也可以或许做一些很智慧的事变,比方纪录日记,或许重复运用这些封装来完成打消。让我们最先吧

如今有一个用户A,他们家有许多家电,在装修的时刻,他让装修公司把这些家电当成了一个团体,想要经由过程一个遥控器就可以掌握家里的电灯、电扇、热水器、声响设备和其他的相似的可掌握装配,如许的话就显得很嵬峨上。

以是呢,他让每一个厂商投供应了一组Java类,用来掌握家电。手上又有一个遥控器,愿望我们可以或许建立一组掌握遥控器的API,让每一个插槽都能掌握一个或一组装配,即经由过程一个遥控器就可以掌握一切家电,是否是很酷。

我们先来看下厂商给的类。

这个类确切很多呀,并且接口也各有差别。另有更贫苦的,跟着家电数目标增添,如许的类还会越来越多。那末,怎样想象一个遥控器API就变得很有挑战性了是吧。

以是,敕令形式应运而生了。在我们的想象中,接纳“敕令形式”,应用敕令对象,把要求(比方翻开电灯)封装成一个特定对象(比方客堂电灯对象)。以是,若是对每一个按钮都存储一个敕令对象,那末当按钮被按下的时刻,就可以够请敕令对象做相干的事情。遥控器并不须要晓得事情内容是什么,只需有个敕令对象能和准确的对象雷同,把事变做好就可以够了。如许,遥控器和电灯对象都解耦了。

可能把遥控器换成餐厅点餐,人人会更轻易明白。我在这里简朴形貌下:起首主顾到了餐厅,依据菜单点了一部分菜,把菜单给服务员;服务员拿到了定单,就提交到柜台上,并向后厨喊了一声“xx号桌xx定单”来了;后厨依据菜单举行配菜,烧菜。全称服务员都不须要晓得定单具体内容是什么,只需将桌上的客户点的餐供应给后厨便可,这和我们的遥控器就是一个道理了。

第一个敕令对象

完成敕令接口

那我们就来建立我们的敕令对象吧。起首,我们得让一切的敕令对象完成雷同的包罗一个要领的接口。在餐厅订餐的例子上,就是建立定单,我们在顺序的天下里,取名叫做execute()

public interface Command {
    public void execute();
}
完成一个翻开电灯的敕令

如今,假想象完成一个翻开电灯的敕令。依据之前看到的厂商供应的类,Light类有两个要领,on和off。

// 这是一个敕令,以是须要完成Command接口
public class LightOnCommand implements Command {
    Light light;

// 组织器传入某个电灯,以便让这个敕令掌握,然后纪录在实例变量中
    public LightOnCommand(Light light) {
        this.light = light;
    }

// 这个execute要领挪用吸收对象的on要领
    public void execute() {
        light.on();
    }

}

运用敕令对象

如今,我们让遥控器事情起来,先来点简朴的。假定遥控器只要一个按钮和对应的插槽,可以或许掌握一个装配:

public class SimpleRemoteControl {
// 有一个插槽持有敕令,而这个敕令掌握着一个装配
    Command slot;
 
    public SimpleRemoteControl() {}
 
// 这个要领用来设置插槽掌握的敕令
    public void setCommand(Command command) {
        slot = command;
    }
 
// 当按下按钮时,这个要领就会被挪用,使得以后敕令连接插槽,并挪用它的execute要领
    public void buttonWasPressed() {
        slot.execute();
    }
}

就如许我们就可以完成一个简朴的遥控器了。请看我们的测试

public class RemoteControlTest {
    public static void main(String[] args) {
    // 遥控器就是挪用者,会传入一个敕令对象,可以或许用来发出要求
        SimpleRemoteControl remote = new SimpleRemoteControl();
    // 如今建立一个电灯对象,此对象也就是要求的吸收者
        Light light = new Light();
    // 这里建立一个敕令,然后将吸收者传给它
        LightOnCommand lightOn = new LightOnCommand(light);
    
    // 把敕令传给挪用者
        remote.setCommand(lightOn);
    // 模仿按下按钮
        remote.buttonWasPressed();
    }
    
}

界说敕令形式

经由订餐流程的明白,以及适才这个小演习,相信你也对敕令形式内的类 和对象怎样互动明白得很清晰了吧。那我们在这里一气呵成,界说一下敕令形式。

敕令形式将要求封装成对象,以便运用分歧的要求,行列或许日记来参数化其他对象。敕令形式也支撑可打消的操纵。

细致想一想,我们晓得有一个敕令对象经由过程在特定吸收者上绑定一组行动来封装一个要求。要到达这一点,敕令对象将行动和吸收者包进对象中。这个对象只暴露出一个execute()要领,当此要领被挪用的时刻,吸收者就会举行这些行动。从表面来看,其他对象不晓得终究哪一个吸收者举行了哪些行动,只晓得若是挪用execute()要领,要求的目标就可以到达。

avatar