java设计模式——命令模式一

命令模式第一篇

一:命令模式的定义:
将“请求”封装成对象,以便使用不同的请求,队列或者日志来参数化其他对象。命令模式也支持可撤销的操作。
二:命令模式所含有得成员:
(1)command(命令接口),它是所有命令的接口,声明执行命令的方法(面向接口编程,而非面向具体)
(2)concretecommand(具体命令),命令的请求者(将请求封装成了对象——concretcommand),通常含有一个命令的接收者的对象引用,将”接收者”的方法接口封装在”执行命令的方法”中(只知道调用了“接收者”类的哪些方法,并不知道这些方法怎么实现的)
(3)receiver(命令的接收者):具体执行命令的对象,任何类都可能成为一个接收者,只要它能够实现命令要求实现的相应功能。
(4)Invoker(命令的提交者):要求命令对象执行请求,通常会持有命令对象,可以持有很多的命令对象。这个是客户端真正触发命令并执行相应操作的地方,也就是说相当于使用命令对象的入口。
(5)client:创建具体的命令对象,并且设置命令对象的接收者。注意这个不是我们常规意义上的客户端,而是在组装命令对象和接收者,或许,把这个Client称为装配者会更好理解,因为真正使用命令的客户端是从Invoker来触发执行。
三:命令模式的特点:
(1)命令模式的最大特点是:将行为的请求者与行为的实现者解耦(方法就是:将“请求”封装成对象)
(2)命令模式将行为的请求者和行为的实现者解耦后,行为的请求者只关注“将哪些请求传给行为的实现者,并且做出了响应”而不关注“行为的实现者如何具体处理这些请求”
(3)通常命令提交者含有一个命令接口的对象引用。”命令的接收者”类中含有一个“命令请求者”类的对象引用。

以下是命令模式的一个代码示例:

public interface command {      //命令类
    public void excute();        //含有一个提交订单的方法(通过该方法调用厨师类的一些方法,完成餐品制作操作)       
}

public class Light {            //接受者类,真正的动作执行者
    String name;
    public Light(String name)
    {
        this.name=name;             //初始化灯的名字
    }
    public void lighton()
    {
        System.out.println("打开"+name+"的灯!!!");
    }
    public void lightoff()
    {
        System.out.println("关闭"+name+"的灯!!!");
    }
}

public class lightoncommand implements command      //命令的请求者(体现了命令模式的特点:将请求封装成了对象)
            //利用command接口,每个动作都被实现成了一个命令对象
{
    Light light;         //含有一个接受者类的对象引用
    public lightoncommand(Light light)      
    {
        this.light=light;       //初始化“命令的接受者”类的对象
    }
    public void excute()
    {
        light.lighton();        //向命令的接受者发出请求,使命令的执行者具体执行某些操作
    }
}

public class controler {    //命令的提交者(命令的接受者和命令的请求者之间的桥梁)
    command comm;           //含有一个命令接口的对象引用,用于传递“请求”(实现了动作的请求者和动作的执行者解耦的目的)
                            //这个例子中,动作的请求者为lightoncommand,动作的执行者为light
    public void setcommand(command comm)
    {
        this.comm=comm;            
        //该方法用于设置命令(传递进来的参数肯定是实现某个command接口的类,所以势必用到接口回调)
    }
    public void submmitcommand()
    {
        comm.excute();      
        //调用该方法将“命令”提交给receiver(真正的动作执行者),中间桥梁是excute(“请求”),“请求”方法内封装receiver的方法接口
    }
}


public class client {
    public static void main(String[] args) {
        Light light=new Light("卧室");        //先实例化一个“请求的接收者”类的对象
        lightoncommand lighton=new lightoncommand(light);   //实例化一个命令(传递进来一个“接受者”类的对象引用)
        controler control=new controler();  //实例化一个“命令的提交者”类的对象
        control.setcommand(lighton);       //然后调用setcommand方法设置命令 
        control.submmitcommand();           //然后将命令提交给“命令的接受者”,命令其完成某一些操作
    }  
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值