1、命令模式简介

1.1>、定义

  命令模式的目的是解除命令发出者和接收者之间的紧密耦合关系,使二者相对独立,有利于程序的并行开发和代码的维护。命令模式的核心思想是将请求封装为一个对象,将其作为命令发起者和接收者的中介,而抽象出来的命令对象又使得能够对一系列请求进行操作,如对请求进行排队,记录请求日志以及支持可撤销的操作等。

1.2>、使用频率

   中高

2、命令模式结构

2.1>、结构图

2.2>、参与者

  命令模式参与者:

  ◊ Command:命令抽象类,声明一个执行操作的接口Execute,该抽象类并不实现这个接口,所有的具体命令都继承自命令抽象类。

  ◊ ConcreteCommand

    ° 定义一个接收者对象与动作之间的请求绑定

    ° 调用Receiver的操作,实现Execute方法

  ◊ Invoker:命令的接收者,将命令请求传递给相应的命令对象,每个ConcreteCommand都是一个Invoker的成员

  ◊ Receiver:命令的接收者,知道如何实施与执行一个请求相关的操作

  ◊ Client:客户端程序,创建一个具体命令对象并设定它的接收者

  Command对象作为Invoker的一个属性,当点击事件发生时,Invoker调用方法Invoke()将请求发送给ConcreteCommand,再由ConcreteCommand调用Execute()将请求发送给Receiver,Client负责创建所有的角色,并设定Command与Invoker和Receiver之间的绑定关系。

3、命令模式结构实现

  Receiver.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace DesignPatterns.CommandPattern.Structural
{
public class Receiver
{
public void Action()
{
Console.WriteLine("Called Receiver.Action()");
}
}
}

  Command.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace DesignPatterns.CommandPattern.Structural
{
public abstract class Command
{
protected Receiver receiver; public Command(Receiver receiver)
{
this.receiver = receiver;
} public abstract void Execute();
}
}

  ConcreteCommand.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace DesignPatterns.CommandPattern.Structural
{
public class ConcreteCommand : Command
{
public ConcreteCommand(Receiver receiver)
: base(receiver)
{
} public override void Execute()
{
receiver.Action();
}
}
}

  Invoker.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace DesignPatterns.CommandPattern.Structural
{
public class Invoker
{
private Command _command; public void SetCommand(Command command)
{
this._command = command;
} public void ExecuteCommand()
{
_command.Execute();
}
}
}

  Program.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; using DesignPatterns.CommandPattern.Structural; namespace DesignPatterns.CommandPattern
{
class Program
{
static void Main(string[] args)
{
Receiver receiver = new Receiver();
Command command = new ConcreteCommand(receiver);
Invoker invoker = new Invoker(); invoker.SetCommand(command);
invoker.ExecuteCommand();
}
}
}

  运行输出:

Called Receiver.Action()
请按任意键继续. . .

4、命令模式应用分析

  命令模式适用情形:

  1>、将用户界面和行为分离,使两者的开发可以并行不悖。

  2>、在需要指定、排列和执行一系列请求的情况下,适用命令模式。

  3>、支持修改日志。

  命令模式优点:

  1>、命令模式将调用操作对象和知道如何实现该操作对象的解耦。

  2>、在Command要增加新的处理操作对象很容易,可以通过创建新的继承自Command的子类来实现。

  3>、命令模式可以和Memento模式结合使用,支持取消的操作。

  4>、支持日志、请求队列和复合命令。

C#设计模式系列:命令模式(Command)的更多相关文章

  1. 设计模式 ( 十三 ) 命令模式Command(对象行为型)

    设计模式 ( 十三 ) 命令模式Command(对象行为型) 1.概述         在软件设计中,我们经常需要向某些对象发送请求,但是并不知道请求的接收者是谁,也不知道被请求的操作是哪个,我们只需 ...

  2. 乐在其中设计模式(C#) - 命令模式(Command Pattern)

    原文:乐在其中设计模式(C#) - 命令模式(Command Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 命令模式(Command Pattern) 作者:webabcd ...

  3. 面向对象设计模式_命令模式(Command)解读

    在.Net框架中很多对象的方法中都会有Invoke方法,这种方法的设计实际是用了设计模式的命令模式, 模式图如下 其核心思路是将Client 向Receiver发送的命令行为进行抽象(ICommand ...

  4. 二十四种设计模式:命令模式(Command Pattern)

    命令模式(Command Pattern) 介绍将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化:对请求排队或记录请求日志,以及支持可取消的操作. 示例有一个Message实体类,某个 ...

  5. 设计模式-15命令模式(Command Pattern)

    1.模式动机 在软件设计中,我们经常需要向某些对象发送请求,但是并不知道请求的接收者是谁,也不知道被请求的操作是哪个,我们只需在程序运行时指定具体的请求接收者即可,此时,可以使用命令模式来进行设计,使 ...

  6. [设计模式] 14 命令模式 Command

    Command 模式通过将请求封装到一个对象(Command)中,并将请求的接受者存放到具体的 ConcreteCommand 类中(Receiver)中,从而实现调用操作的对象和操作的具体实现者之间 ...

  7. 设计模式之命令模式(Command)摘录

    23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于怎样创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...

  8. 大熊君说说JS与设计模式之------命令模式Command

    一,总体概要 1,笔者浅谈 日常生活中,我们在看电视的时候,通过遥控器选择我们喜欢的频道时,此时我们就是客户端的角色,遥控器的按钮相当于客户请求,而具体执行的对象就是命令对象, 命令模式把一个请求或者 ...

  9. 设计模式 笔记 命令模式 Command

    //---------------------------15/04/25---------------------------- //Conmmand  命令模式----对象行为型模式 /* 1:意 ...

  10. 行为型设计模式之命令模式(Command)

    结构 意图 将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化:对请求排队或记录请求日志,以及支持可撤消的操作. 适用性 抽象出待执行的动作以参数化某对象,你可用过程语言中的回调(c a ...

随机推荐

  1. Codeforces Round #260 (Div. 2)

    A. Laptops 题目意思: 给定n台电脑,第i台电脑的价格是ai ,质量是bi ,问是否存在一台电脑价格比某台电脑价格底,但质量确比某台电脑的质量高,即是否存在ai < aj 且 bi & ...

  2. BZOJ4488: [Jsoi2015]最大公约数

    Description 给定一个长度为 N 的正整数序列Ai对于其任意一个连续的子序列{Al,Al+1...Ar},我们定义其权值W(L,R )为其长度与序列中所有元素的最大公约数的乘积,即W(L,R ...

  3. Linux上Tomcat部署JavaWeb项目

    一.安装JDK 配置java的环境变量,修改/etc/profile文件:vi /etc/profile 然后按下字母i进入插入模式, shift+insert粘贴; esc退出编辑; :wq保存退出 ...

  4. router路由去掉#!的踩坑记

    项目中在研究去掉router#!的过程中的踩坑过程.

  5. ubuntu环境下vmware取消自动启动服务

    概述其实vmware这个服务取不取消,影响不大,主要是我有强迫症,在不用虚拟机的时候,看着vmware占着进程真心不爽,想要解决这个问题,在用虚拟机的时候启动服务,反之,则停.接下来,我说一下实现吧. ...

  6. java 连接数据库

    1.获取服务器端数据库blog中记录数 package dataprocess; import java.io.BufferedWriter; import java.io.FileWriter; i ...

  7. Proxy

    Proxy: Script: http://apgutmg01:8080/array.dll?Get.Routing.Script Server: apgutmg01 Port: 8080

  8. 用itextsharp打印pdf示例

    学习了用itextsharp输出PDF文档,支持用XML定义文档,可定义多个数据源,简单的表达式,用于项目中效果还不错,其中PdfPageEvent类由包大人提供. 示例程序定义了一个简单的xml文件 ...

  9. .NET Core 跨平台发布(dotnet publish)

    .NET Core 跨平台发布(dotnet publish) ,无需安装.NET Core SDK,就可以运行. 前面讲解了.NET Core 的VSCode 开发.现在来讲讲发布(dotnet p ...

  10. 一小时包教会 —— webpack 入门指南

    什么是 webpack? webpack是近期最火的一款模块加载器兼打包工具,它能把各种资源,例如JS(含JSX).coffee.样式(含less/sass).图片等都作为模块来使用和处理. 我们可以 ...