IronMan之命令

在本篇中还是围绕着“IronMan”来讲,在上一篇“外观”中我们说到过“控制中心”。它是负责IronMan的核心,所有能想象到的功能都跟它有关系,
就在使用它的时候,发现了一些问题,比如使用它来命令部件做一些操作:

     /// <summary>
/// 控制中心
/// </summary>
public class CenterController
{
public void Attact()
{
ComponteCase comCase = new ComponteCase();
comCase.Attact();
}
}
/// <summary>
/// 部件
/// </summary>
public class ComponteCase
{
public void Attact()
{
Console.WriteLine("示例部件攻击1");
}
}

从上面的“控制中心”中可以看出,它是直接使用的部件,如果这时候要添加、修改或者删除部件的攻击方式,那么“控制中心”也要跟着做出修改。 耦合度很大,那怎么样要使“控制中心”和“部件”之间变得是松耦合呢?

命令模式的定义:将一组行为抽象为对象实现二者之间的松耦合

     /// <summary>
/// 抽象命令
/// </summary>
public abstract class Command
{
public abstract void Execute();
}
/// <summary>
/// 具体命令类(示例部件攻击命令)
/// </summary>
public class RealizeCommand : Command
{
private ComponteCase compontecase = new ComponteCase();
public override void Execute()
{
//业务操作等等
compontecase.Attact();
}
}

添加了抽象命令类和具体命令类,具体命令类已经代表了一个命令,就是示例部件攻击:

     /// <summary>
/// 控制中心
/// </summary>
public class CenterController
{
private Command command;
public CenterController(Command command)
{
this.command = command;
}
public void Attact()
{
command.Execute();
}
}

稍作修改的控制中心,
现在再来看一下,使用”控制中心”去使用攻击手段。

 CenterController centercontroller = new CenterController(new RealizeCommand());
centercontroller.Attact();

也可以再新建其它的具体命令类,引用其它部件,使用其攻击方法,这样便实现了动态注入,把控制中心和部件
从紧耦合状态改变到了松耦合。
这里会有人有疑问了,如果要执行多个命令怎么办?

     /// <summary>
/// 命令板
/// </summary>
public class CommandList
{
private List<Command> commands = new List<Command>();
public CommandList() { }
public CommandList(Command command)//动态注入
{
commands.Add(command);
}
public void AddCommand(Command command)
{
commands.Add(command);
}
public void RemoveCommand(Command command)
{
commands.Remove(command);
}
public void Execute()
{
foreach (Command command in commands)
{
command.Execute();
}
}
}

添加一个命令板类,再修改一下控制中心,使得“控制中心”和“抽象命令”间都进行消耦,下面再看一下修改后的“控制中心”:

     /// <summary>
/// 控制中心
/// </summary>
public class CenterController
{
private CommandList commands;
public CenterController(CommandList commands)
{
this.commands = commands;
}
public void Attact()
{
commands.Execute();
}
}

使用的方式还是和上一个方式相同,只是上个方式是把命令动态注入,现在修改成了把命令板动态注入。

命令模式就到这里了。。END

下一篇实现更佳的可扩展的命令模式

作者:金源

出处:http://www.cnblogs.com/jin-yuan/

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面

C#设计模式之命令的更多相关文章

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

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

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

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

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

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

  4. 折腾Java设计模式之命令模式

    博客原文地址 折腾Java设计模式之命令模式 命令模式 wiki上的描述 Encapsulate a request as an object, thereby allowing for the pa ...

  5. 设计模式:命令(Command)模式

    设计模式:命令(Command)模式 一.前言 命令也是类,将命令作为一个类来保存,当要使用的时候可以直接拿来使用,比如脚本语言写出的脚本,只需要一个命令就能执行得到我们想要的需要操作很长时间才能得到 ...

  6. 用Java 8 Lambda表达式实现设计模式:命令模式

    在这篇博客里,我将说明如何在使用 Java 8 Lambda表达式 的函数式编程方式 时实现 命令 设计模式 .命令模式的目标是将请求封装成一个对象,从对客户端的不同类型请求,例如队列或日志请求参数化 ...

  7. python设计模式之命令模式

    python设计模式之命令模式 现在多数应用都有撤销操作.虽然难以想象,但在很多年里,任何软件中确实都不存在撤销操作.撤销操作是在1974年引入的,但Fortran和Lisp分别早在1957年和195 ...

  8. Head First 设计模式 --6 命令模式

    命令模式:将"请求"封装成对象,以便使用不同的请求,队列或者日志来参数化其他对象.命令模式也支持可撤销的操作.用到的原则:1.封装变化2.组合优于继承3.针对接口编程,不能针对实现 ...

  9. C#设计模式(15)——命令模式(Command Pattern)

    一.前言 之前一直在忙于工作上的事情,关于设计模式系列一直没更新,最近项目中发现,对于设计模式的了解是必不可少的,当然对于设计模式的应用那更是重要,可以说是否懂得应用设计模式在项目中是衡量一个程序员的 ...

  10. 【GOF23设计模式】命令模式

    来源:http://www.bjsxt.com/ 一.[GOF23设计模式]_命令模式.数据库事务机制底层架构实现.撤销和回复 package com.test.command; public cla ...

随机推荐

  1. 个人总结深入.NET平台和C#编程

    前言:学习C#编程应该有几个月了,作为一个菜鸟,没有资格来评论什么.只有对自己所学进行一个总结,可能有不严谨的地方,万望谅解.          一·深入.NET框架 .NET框架(.NET Fram ...

  2. JavaOO面向对象中的注意点(三)

    1.接口 a.关键字:interface public interface Serviceable{ //TODO } b.属性:只能是 公共 静态 常量 属性--就算不写这三个关键字,也是默认这种情 ...

  3. SpringMVC(二) SpringMVC Hello World

    准备条件: STS(集成了Spring相关工具的Eclipse) Spring软件包 spring-framework-4.3.3.RELEASE-dist.zip. 步骤: 加入jar包. Ecli ...

  4. [leetcode] 提醒整理之进制

    12. Integer to Roman Given an integer, convert it to a roman numeral. Input is guaranteed to be with ...

  5. nodejs复习02

    process 这个模块是单线程的,无法完全利用多核CPU 基本信息 //程序目录 process.cwd(); //应用程序当前目录 process.chdir('/home'); //改变应用程序 ...

  6. 解决autolt上传图片报错cannot open system clipboard

    今天调试代码,发现本地可以上传图片,但是集成环境无法上传报错cannot open system clipboard: 百度查了下,我的系统没有剪切板程序,才报错. 验证方法如下: win+r,输入c ...

  7. iOS Hit-Test应用

    最近又看了遍苹果的官方文档<Event Handling Guide for iOS>,对事件响应链中的hit-test view 又多了些理解,个人觉的官方文档对这块讲的非常简单,很多东 ...

  8. 栈的JS实现

    栈,是一种特殊的线性表,其插入及删除的操作都在线性表的同一端进行.这一端称为栈顶,另一端称为栈底.就类似于餐厅里的一摞盘子,后放的盘子在上方,也会先被人拿走.栈具有"后进先出"的逻 ...

  9. win10家庭版在线升级到win10专业版

    首先在win10自带的搜索框中输入"控制面板",在搜索结果的界面中单击"控制面板",进入控制面板界面. 在控制面板中点击"系统和安全",进入 ...

  10. hdu3068马拉车

    其实马拉车还真是最好理解的算法(感觉初中的时候好像讲过类似的,但是当时就没有认真听) 没想到一个简单的优化能变成O(n),感觉碉堡 不说了,马拉车裸题,我在写的时候只保留了id,没保留mx,希望能形成 ...