目录
PHP设计模式——命令模式
首页 后端开发 php教程 PHP设计模式——命令模式_PHP教程

PHP设计模式——命令模式_PHP教程

Jul 13, 2016 am 09:51 AM
命令 模式 设计模式

PHP设计模式——命令模式

 

命令模式:在软件系统中,“行为请求者”与“行为实现者”通常呈现一种“紧耦合”。但在某些场合,比如要对行为进行“记录、撤销/重做、事务”等处理,这种无法抵御变化的紧耦合是不合适的。在这种情况下,如何将“行为请求者”与“行为实现者”解耦?将一组行为抽象为对象,实现二者之间的松耦合。这就是命令模式。

 

类图:

\

角色分析:

抽象命令:定义命令的接口,声明执行的方法。

具体命令:命令接口实现对象,是“虚”的实现;通常会持有接收者,并调用接收者的功能来完成命令要执行的操作。

命令接收者:接收者,真正执行命令的对象。任何类都可能成为一个接收者,只要它能够实现命令要求实现的相应功能。

控制者:要求命令对象执行请求,通常会持有命令对象,可以持有很多的命令对象。这个是客户端真正触发命令并要求命令执行相应操作的地方,也就是说相当于使用命令对象的入口。

 

核心代码:

 

<!--?php
/**
 * Created by PhpStorm.
 * User: LYL
 * Date: 2015/6/4
 * Time: 20:21
 */

/**
 * 电视机是请求的接收者,
*遥控器上有一些按钮,不同的按钮对应电视机的不同操作。
*抽象命令角色由一个命令接口来扮演,有三个具体的命令类实现了抽象命令接口,
*这三个具体命令类分别代表三种操作:打开电视机、关闭电视机和切换频道。
*显然,电视机遥控器就是一个典型的命令模式应用实例。
 */

/**命令接收者
 * Class Tv
 */
class Tv
{
    public $curr_channel=0;

    /**
     * 打开电视机
     */
    public function turnOn()
    {
        echo The television is on..<br/-->;
    }

    /**
     * 关闭电视机
     */
    public function turnOff()
    {
        echo The television is off..
;
    }

    /**切换频道
     * @param $channel    频道
     */
    public function turnChannel($channel)
    {
        $this->curr_channel=$channel;
        echo This TV Channel is .$this->curr_channel.
;
    }
}

/**执行命令接口
 * Interface ICommand
 */
interface ICommand
{
    function execute();
}

/**开机命令
 * Class CommandOn
 */
class CommandOn implements  ICommand
{
    private $tv;

    public function __construct($tv)
    {
        $this->tv=$tv;
    }

    public function execute()
    {
        $this->tv->turnOn();
    }
}

/**关机命令
 * Class CommandOn
 */
class CommandOff implements  ICommand
{
    private $tv;

    public function __construct($tv)
    {
        $this->tv=$tv;
    }

    public function execute()
    {
        $this->tv->turnOff();
    }
}

/**切换频道命令
 * Class CommandOn
 */
class CommandChannel implements  ICommand
{
    private $tv;
    private $channel;

    public function __construct($tv,$channel)
    {
        $this->tv=$tv;
        $this->channel=$channel;
    }

    public function execute()
    {
        $this->tv->turnChannel($this->channel);
    }
}

/**遥控器
 * Class Control
 */
class Control
{
    private $_onCommand;
    private $_offCommand;
    private $_changeChannel;

    public function __construct($on,$off,$channel)
    {
        $this->_onCommand = $on;
        $this->_offCommand = $off;
        $this->_changeChannel = $channel;
    }

    public function turnOn()
    {
        $this->_onCommand->execute();
    }

    public function  turnOff()
    {
        $this->_offCommand->execute();
    }

    public function changeChannel()
    {
        $this->_changeChannel->execute();
    }
}
登录后复制

调用客户端代码:

header(Content-Type:text/html;charset=utf-8);
//----------------------命令模式--------------------
require_once ./Command/Command.php;
//测试代码
// 命令接收者  
$myTv = new Tv();
// 开机命令  
$on = new CommandOn($myTv);
// 关机命令  
$off = new CommandOff($myTv);

// 频道切换命令  
$channel = new CommandChannel($myTv, 2);
// 命令控制对象 
$control = new Control($on, $off, $channel);
// 开机  
$control->turnOn();
// 切换频道  
$control->changeChannel();
// 关机  
$control->turnOff();
登录后复制

 

适用场景:

 

1.系统需要将请求调用者和请求接收者解耦,使得调用者和接收者不直接交互。

2.系统需要在不同的时间指定请求、将请求排队和执行请求。

3.系统需要支持命令的撤销(Undo)操作和恢复(Redo)操作。

4.系统需要将一组操作组合在一起,即支持宏命令。

优点

1.降低对象之间的耦合度。

2.新的命令可以很容易地加入到系统中。

3.可以比较容易地设计一个组合命令。

4.调用同一方法实现不同的功能

 

 

 

www.bkjia.comtruehttp://www.bkjia.com/PHPjc/1015090.htmlTechArticlePHP设计模式——命令模式 命令模式:在软件系统中,行为请求者与行为实现者通常呈现一种紧耦合。但在某些场合,比如要对行为进行记录...
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

Java框架中设计模式与架构模式的区别 Java框架中设计模式与架构模式的区别 Jun 02, 2024 pm 12:59 PM

在Java框架中,设计模式和架构模式的区别在于:设计模式定义了在软件设计中解决常见问题的抽象解决方案,关注类和对象之间的交互,如工厂模式。架构模式定义了系统结构和模块之间的关系,关注系统组件的组织和交互,如分层架构。

Java设计模式之装饰器模式剖析 Java设计模式之装饰器模式剖析 May 09, 2024 pm 03:12 PM

装饰器模式是一种结构型设计模式,允许动态添加对象功能,无需修改原始类。它通过抽象组件、具体组件、抽象装饰器和具体装饰器的协作实现,可以灵活扩展类功能,满足变化的需求。示例中,将牛奶和摩卡装饰器添加到Espresso,总价为2.29美元,展示了装饰器模式在动态修改对象行为方面的强大功能。

PHP 设计模式实战案例解析 PHP 设计模式实战案例解析 May 08, 2024 am 08:09 AM

1.工厂模式:分离对象创建和业务逻辑,通过工厂类创建指定类型的对象。2.观察者模式:允许主题对象通知观察者对象其状态更改,实现松耦合和观察者模式。

设计模式如何应对代码维护难题 设计模式如何应对代码维护难题 May 09, 2024 pm 12:45 PM

设计模式通过提供可重用和可扩展的解决方案来解决代码维护难题:观察者模式:允许对象订阅事件,并在事件发生时收到通知。工厂模式:提供了一种创建对象的集中式方式,而无需依赖具体类。单例模式:确保一个类只有一个实例,用于创建全局可访问的对象。

Java设计模式之适配器模式的妙用 Java设计模式之适配器模式的妙用 May 09, 2024 pm 12:54 PM

适配器模式是一种结构型设计模式,允许不兼容对象协同工作,它将一个接口转换为另一个,使对象能够顺利交互。对象适配器通过创建包含被适配对象的适配器对象,并实现目标接口,实现适配器模式。在一个实战案例中,通过适配器模式,客户端(如MediaPlayer)可以播放高级格式的媒体(如VLC),尽管其本身仅支持普通媒体格式(如MP3)。

PHP设计模式:测试驱动开发实践 PHP设计模式:测试驱动开发实践 Jun 03, 2024 pm 02:14 PM

TDD用于编写高质量PHP代码,步骤包括:编写测试用例,描述预期功能并使其失败。编写代码,仅使测试用例通过,无需过分优化或详细设计。测试用例通过后,优化和重构代码以提高可读性、可维护性和可扩展性。

Guice框架中设计模式的应用 Guice框架中设计模式的应用 Jun 02, 2024 pm 10:49 PM

Guice框架应用了多项设计模式,包括:单例模式:通过@Singleton注解确保类只有一个实例。工厂方法模式:通过@Provides注解创建工厂方法,在依赖注入时获取对象实例。策略模式:将算法封装成不同策略类,通过@Named注解指定具体策略。

java框架中使用设计模式的优缺点有哪些? java框架中使用设计模式的优缺点有哪些? Jun 01, 2024 pm 02:13 PM

Java框架中使用设计模式的优点包括:代码可读性、可维护性和可扩展性增强。缺点包括:过度使用导致复杂性、性能开销以及学习曲线陡峭。实战案例:代理模式用于延迟加载对象。明智地使用设计模式可充分利用其优势并最小化缺点。

See all articles