首页 > 其他分享 >命令模式

命令模式

时间:2023-08-06 17:06:57浏览次数:28  
标签:door light void 模式 命令 Command new public

**介绍:**将“请求”封装成对象,以便于使用不同的请求、队列或者日志来参数化其他对象。命令模式也支持可撤销的操作。

**主要解决:**在软件系统中,行为请求者与行为实现者通常是一种紧耦合的关系,但某些场合,比如需要对行为进行记录、撤销或重做、事务等处理时,这种无法抵御变化的紧耦合的设计就不太合适。

**何时使用:**在某些场合,比如要对行为进行”记录、撤销/重做、事务”等处理,这种无法抵御变化的紧耦合是不合适的。在这种情况下,如何将”行为请求者”与”行为实现者”解耦?将一组行为抽象为对象,可以实现二者之间的松耦合。

**如何解决:**通过调用者调用接受者执行命令,顺序:调用者→命令→接受者。

**关键代码:**定义三个角色:1、received 真正的命令执行对象 2、Command 3、invoker 使用命令对象的入口

**应用实例:**struts 1 中的 action 核心控制器 ActionServlet 只有一个,相当于 Invoker,而模型层的类会随着不同的应用有不同的模型类,相当于具体的 Command。

优点: 1、降低了系统耦合度。 2、新的命令可以很容易添加到系统中去。

**缺点:**使用命令模式可能会导致某些系统有过多的具体命令类。

**使用场景:**认为是命令的地方都可以使用命令模式,比如: 1、GUI 中每一个按钮都是一条命令。 2、模拟 CMD。

**注意事项:**系统需要支持命令的撤销(Undo)操作和恢复(Redo)操作,也可以考虑使用命令模式,见命令模式的扩展。

实现

public class CommandPattenTest {

    public static void main(String[] args) {
        SimpleRemoteControl remoteControl = new SimpleRemoteControl();
        
        remoteControl.setCommand(new LightOnCommand(new Light()));
        remoteControl.buttonWasPressed();
        remoteControl.setCommand(new LightOffCommand(new Light()));
        remoteControl.buttonWasPressed();

        remoteControl.setCommand(new DoorOpenCommand(new Door()));
        remoteControl.buttonWasPressed();
        remoteControl.setCommand(new DoorCloseCommand(new Door()));
        remoteControl.buttonWasPressed();
    }

    static class SimpleRemoteControl{
        Command slot;

        public SimpleRemoteControl() { }

        public void setCommand(Command slot) {
            this.slot = slot;
        }

        public void buttonWasPressed() {
            slot.execute();
        }
    }

    interface Command {
        void execute();
    }
    static class LightOnCommand implements Command {

        Light light;

        public LightOnCommand(Light light) {
            this.light = light;
        }

        @Override
        public void execute() {
            light.on();
        }
    }
    static class LightOffCommand implements Command {

        Light light;

        public LightOffCommand(Light light) {
            this.light = light;
        }

        @Override
        public void execute() {
            light.off();
        }
    }

    static class Light {

        void on(){
            System.out.println("light on");
        }
        void off(){
            System.out.println("light off");
        }
    }

    static class DoorOpenCommand implements Command {

        Door door;

        public DoorOpenCommand(Door door) {
            this.door = door;
        }

        @Override
        public void execute() {
            door.open();
        }
    }

    static class DoorCloseCommand implements Command {

        Door door;
        public DoorCloseCommand(Door door) {
            this.door = door;
        }

        @Override
        public void execute() {
            door.close();
        }
    }

    static class Door {

        void open(){
            System.out.println("Door is open");
        }
        void close(){
            System.out.println("DoorOpen is close");
        }
    }
}

标签:door,light,void,模式,命令,Command,new,public
From: https://blog.51cto.com/u_11906056/6985084

相关文章

  • 适配器模式
    适配器模式**适配器模式:**将一个类的接口,转换成客户期望的另一个接口。适配器让原本接口不兼容的类可以合作无间适配器模式(AdapterPattern)是作为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能。这种模式涉及到一个单一的类,该类负责......
  • 外观模式
    **外观模式:**提供了一个统一的接口,用来访问子系统中的一群接口。外观定义了一个高层接口,让子系统更容易使用。外观模式(FacadePattern)隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口。这种类型的设计模式属于结构型模式,它向现有的系统添加一个接口,来隐藏系统的复......
  • git-bash命令
    Sometimesit’saboutdoingtherightthing,evenifit’spainfulinside.有时候就是要做对的事,哪怕内心万分痛苦。01git-bash命令代码说明ls#llist查看当前目录下的内容cd#changedirectory更改运行目录(文件名不区分大小写)pwd#printworkingdirec......
  • 模板方法模式
    **模板方法模式:**在一个方法中定义一个算法的骨架,现将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。在模板模式(TemplatePattern)中,一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象......
  • 常见的电商模式 B2B、B2B、C2B、C2C、O2O
    1电商模式市面上有5种常见的电商模式B2B、B2B、C2B、C2C、O2O1.1B2B模式B2B(BusinesstoBusiness),是指商家和商家建立的商业关系,如阿里,1.2B2C模式B2C(BusinesstoConsumer)就是我们经常看到的供应商直接把商品买个用户,即“商对客”模式,也就是我们呢说的商业零售......
  • 策略模式
    IfyoucanNOTexplainitsimply,youdoNOTunderstanditwellenough**介绍:**定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户**主要解决:**在有多种算法相似的情况下,使用if…else所带来的复杂和难以维护。**何时使用:**一个系......
  • 观察者模式
    **介绍:**定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖都会收到通知并自动更新。**主要解决:**一个对象状态改变给其他对象通知的问题,而且要考虑到易用和低耦合,保证高度的协作。**何时使用:**一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得......
  • 装饰者模式
    装饰者模式**装饰者模式:**动态地将责任附加到对象上。若要扩展功能,装饰者提供了比继承更有弹性的替代方案。*设计原则:*类应该对扩展开放,对修改关闭继承属于扩展形式之一,但不见得是达到弹性设计的最佳方式。在我们的设计中,应该允许行为可以被扩展,而无须修改现有的代码。组合和......
  • 工厂方法模式
    工厂方法模式**工厂方法模式:**定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到子类。设计原则:依赖倒置原则:要依赖抽象,不要依赖具体类。下面的指导方针,能避免在OO设计原则中违反依赖倒置原则:变量不可以持有具体的类的引用。不要让......
  • 【Java】智慧工地管理系统源码(SaaS模式)
    智慧工地是聚焦工程施工现场,紧紧围绕人、机、料、法、环等关键要素,综合运用物联网、云计算、大数据、移动计算和智能设备等软硬件信息技术,与施工生产过程相融合。一、什么是智慧工地智慧工地是指利用移动互联、物联网、智能算法、地理信息系统、大数据挖掘分析等信息技术,提高项目......