zoukankan      html  css  js  c++  java
  • 设计模式------命令模式

    命令模式定义

    将一个请求封装成一个对象,从而让你使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和回复的功能。

    Receive接收者角色

    该角色就是干活的角色,命令传递到这里是应该被执行的。

    public abstract class Receiver{
        //抽象接收者,定义每个接收者都必须完成的业务
        public abstract void doSomething();
    }

    Command命令角色

    需要执行的所有命令都在这里声明。

    public abstract class Command{
        //每个命令都必须有一个执行命令的方法
        public abstract void execute();
    }

    具体的Command类

    public class ConcreteCommand1 extends Command{
        //对哪个Receiver类进行命令处理
        private Receiver receiver;
    
        //构造函数传递接收者
        public ConcreteCommand1(Receiver receiver){
            this.receiver = receiver;
        }
    
        //必须实现一个命令
        public void execute(){
            //业务处理
            this.receiver.doSomething();
        }
    }

    Invoker调用者角色

    接收到命令,并执行命令。

    public class Invoker{
        private Command command;
        
        //接收命令
        public void setCommand(Command command){
            this.command = command;
        }
    
        //执行命令
        public void action(){
            this.command.execute();
        }
    }

    命令模式的优点:

    类间的解耦,可扩展性

    缺点:

    命令很多时,Command的子类变多,类变得复杂。

    命令模式扩充

    public abstract class Command{
        //定义一个子类的全局共享变量
        protected final Receiver receiver;
    
        //实现类必须定义一个接收者
        public Command(Receiver receiver){
            this.receiver = receiver;
        }
    
        //每个命令类都必须有一个执行命令的方法
        public abstract void execute();
    }
    public class ConcreteCommand1 extends Command{
        //声明自己默认接收者
        public ConcreteCommand1(){
            super(new ConcreteCommand1());
        }
    
        //设置新的接收者
        public ConcreteCommand1(Receiver receiver){
            super(receiver);
        }
    
        //每个具体的命令都必须实现一个命令
        public void execute(){
            //业务处理
            super.receiver.doSomething();
        }
    }

    每个命令完成单一的职责,而不是根据接收者的不同完成不同的职责。在高层模块的调用时就不用考虑接收者是谁的问题。

  • 相关阅读:
    CSS3 实现六边形Div图片展示效果
    自己编写jQuery插件 之 放大镜
    自己编写jQuery插件 之 无缝滚动
    C#装箱拆箱
    C#基础知识
    数据库锁
    SQL2008中Merge的用法
    SQl去获取相同记录
    判断DataRow中是否包含某列
    Quartz中时间表达式的设置-----corn表达式
  • 原文地址:https://www.cnblogs.com/maple92/p/7376090.html
Copyright © 2011-2022 走看看