设计模式学习(七)、命令模式

1.命令模式的概念:

将请求封装成对象,这样可以让你使用不同的请求、队列、或者日志请问来参数化其他对象。命令模式也支持撤销操作。

2.命令模式的结构图

3.命令模式角色说明

调用者(invoker)角色:这个调用者持有一个命令对象,并在某个时刻调用命令对象的excute()方法,将请求付诸实行。
命令(command)角色:为所有的命令声明一个接口,调用命令对象的excute()方法,就可以让接收者进行先关的动作。这个接口也具备一个undo()方法。调用者(invoker)角色:这个调用者持有一个命令对象,并在某个时刻调用命令对象的excute()方法,将请求付诸实行。
具体命令(ConcreteCommand)角色:定义了动作和接收者之间的绑定关系。
接收者(receiver)角色:这个接收者知道如何进行必要的工作。

4.命令模式的实现

<?php
/**
 * Created by PhpStorm.
 * User: Administrator
 * Date: 16-10-21
 * Time: 上午10:19
 */
/*
 * 抽象命令接口
 */
interface Command
{
    public function execute();
    public function undo();
}
/*
 * 具体命令
 */
Class ConcreteCommand1 implements Command{
    public $receiver;
    public function __construct($receiver){
        $this->receiver = $receiver;
    }
    public function execute(){
        $this->receiver ->action();
    }
    public function undo(){
        echo ‘取消concreteCommand1 操作<br>‘;
    }
}
/*
 * 具体命令
 */
Class NoCommand implements Command{
    public function __construct(){
    }
    public function execute(){
        echo ‘no command<br>‘;
    }
    public function undo(){
        echo ‘no undo<br>‘;
    }
}
/*
 * 具体命令
 */
Class ConcreteCommand2 implements Command{
    public $receiver;
    public function __construct($receiver){
        $this->receiver = $receiver;
    }
    public function execute(){
        $this->receiver ->action();

    }
    public function undo(){
        $this->receiver ->action1();
    }
}
/*
 * 接收者
 */
Class Receiver1{
    public function action(){
        echo ‘Receiver1 action<br>‘;
    }
    public function action1(){
        echo ‘取消 Receiver1 action<br>‘;
    }
}
/*
 * 接收者
 */
Class Receiver2{
    public function action(){
        echo ‘Receiver2 action‘;
    }
    public function action1(){
        echo ‘取消 Receiver2 action‘;
    }
}
/*
 * 调用者
 */
Class Invoker{
    public $commandArr = array();
    public $undoCommand;
    public function __construct(){
        for($i=0;$i<=1;$i++){
            $this->commandArr[$i] = new NoCommand();
        }
        $this->undoCommand =  new NoCommand();
    }
    public function setCommand($slot,$command){
        $this->commandArr[$slot] = $command;
    }
    public function executeCommand($slot){
        $this->commandArr[$slot]->execute();
        $this->undoCommand = $this->commandArr[$slot];
    }
    public function undoCommand(){
        $this->undoCommand->undo();
    }
}
//客户端操作
$invoker = new Invoker();
$invoker->setCommand(0,new ConcreteCommand1(new Receiver1()));
$invoker->setCommand(1,new ConcreteCommand1(new Receiver2()));
$invoker->executeCommand(0);
$invoker->undoCommand();
时间: 2024-08-28 19:19:21

设计模式学习(七)、命令模式的相关文章

Java-马士兵设计模式学习笔记-命令模式

一.概述 命令模式 二.代码 1.Client.java 1 public class Client { 2 3 public void request(Server server){ 4 server.addCommand(new TextCommand()); 5 server.addCommand(new ImageCommand()); 6 server.doSomething(); 7 } 8 } 2.Server.java 1 public class Server { 2 3 pr

设计模式学习之命令模式

模式动机 在软件设计中,我们经常需要向某些对象发送请求,但是并不知道请求的接收者是谁,也不知道被请求的操作是哪个,我们只需在程序运行时指定具体的请求接收者即可,此时,可以使用命令模式来进行设计,使得请求发送者与请求接收者消除彼此之间的耦合,让对象之间的调用关系更加灵活. 命令模式可以对发送者和接收者完全解耦,发送者与接收者之间没有直接引用关系,发送请求的对象只需要知道如何发送请求,而不必知道如何完成请求.这就是命令模式的模式动机. 模式定义 命令模式(Command Pattern):将一个请求

设计模式学习笔记--命令模式

1 using System; 2 3 namespace Command 4 { 5 /// <summary> 6 /// 作者:bzyzhang 7 /// 时间:2016/5/31 20:21:09 8 /// 博客地址:http://www.cnblogs.com/bzyzhang/ 9 /// Receiver说明:本代码版权归bzyzhang所有,使用时必须带上bzyzhang博客地址 10 /// </summary> 11 public class Receive

设计模式学习之-状态模式

一.状态模式状态模式,当一个对象的内在状态发生改变时允许改变其行为行为,这个对象像是改变了其子类.状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况.把状态的判断逻辑转移到表示不同的状态的一系列类当中,可以把复杂的判断逻辑简化.当然,如果这个状态判断比较简单,那就没有必要用“状态模式”了.这段话有点难以理解,简而言之就是,在一类中根据当前状态去实例化下一状态子类.下面是状态模式结构图. State类,是一个抽象状态类,定义一个接口以封装与Context的特定状态相关的行为.

设计模式学习02—工厂模式

1.动机与定义 我们在程序中使用一个对象时,需要new一下,如果需要设置其他值就再初始化一下.比如我要使用一个按钮,手动new一个矩形按钮,然后初始化一些值,如显示文字,背景色等. // 矩形按钮 IButton btn = new RecButton(); // 初始化其他值 btn.setText("提交"); btn.setBackgroundColor("#00aaff"); // 其他初始化省略 // 圆形按钮 IButton btn2 = new Rou

设计模式学习之外观模式(Facade,结构型模式)(8)

1.什么是外观模式为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用 2.为什么要使用外观模式在软件开发系统中,客户程序经常会与复杂系统的内部子系统之间产生耦合,从而导致客户程序随着子系统的变化而变化,那么如何简化客户程序与子系统之间的交互接口?如何将复杂系统的内部子系统与客户程序之间的依赖解耦? 现在来考虑这样一个抵押系统,当有一个客户来时,有如下几件事情需要确认:到银行子系统查询他是否有足够多的存款,到信用子系统查询他是否有良好的信

设计模式学习05—原型模式

一.动机与定义 之前学习原型模式一直以为原型模式目的是为了方便的创建相同或相似对象,用复制对象的方式替换new的方式,还研究了深克隆和浅克隆.最近仔细看了GOF的设计模式,发现原型模式的本意并不仅仅是复制对象这么简单. 复制对象确实是一方面,当我们需要大量相似,甚至相同对象的时候,除了一个个的new之外,还可以根据一个原型,直接复制出更多的对象.但是如果把原型模式认为只是复制对象这么简单就错了. 创建型模式主要讲如何创建对象,通常包含何时创建,谁来创建,怎么创建等.GOF书里面写的意图是,用原型

设计模式学习之代理模式(Proxy)

一.代理模式的初衷 不想让客户端直接访问具体实现接口,客户端不应该直接访问具体实现,一般会涉及到以下四个对象 业务接口:定义客户端访问的接口,是实现类和代理类都需要实现的 实现类:实现了业务接口,真正的实现是在这里 代理类:同样实现了业务接口,一般都会关联一个实现类的实例,由它来调用实现类 客户端:顾名思义,使用者,与代理类打交道,甚至都不知道具体实现类的存在. 二.代理模式设计图 三.代理模式的简单实现代码 BizInterface.java package com.lipan.designp

设计模式学习--------12.代理模式学习

场景: 福尔摩斯一直想送礼物给花生,但是羞于直接赠送,于是想到让房东太太去帮忙送礼物.编程如何实现呢? 定义: 为其他对象提供一种代理以控制对这个对象的访问. 角色: Proxy:代理对象.有下列功能: 实现与具体的目标对象一样的接口,这样就可以使用代理来代替具体的目标对象. 持有一个具体目标对象的引用,可以在需要时调用具体的目标对象. 可以控制对目标对象的访问,并可以负责创建和删除它. package com.kris.study; public class Proxy implements

设计模式学习之模板方法模式(TemplateMethod,行为型模式)(9)

一.什么是模板方法模式 Template Method模式也叫模板方法模式,是行为模式之一,它把具有特定步骤算法中的某些必要的处理委让给抽象方法,通过子类继承对抽象方法的不同实现改变整个算法的行为. 二.模板方法模式的应用场景 Template Method模式一般应用在具有以下条件的应用中: - 具有统一的操作步骤或操作过程 - 具有不同的操作细节 - 存在多个具有同样操作步骤的应用场景,但某些具体的操作细节却各不相同 private static void Main(string[] arg