设计模式-命令模式(行为)、责任链模式(行为)

0 命令模式和责任链模式

命令模式和责任链模式是两种完全相反的模式。

命令模式是需要将请求排队处理。因此将请求封装成对象放入队列。

而责任链模式则是,可能同一对象需要多个函数只有一个函数能处理。或是多个函数都需要处理。

1 命令模式

1.0 需求

高并发情况下,将延迟并发执行的命令,于是将所提交的命令封装成对象存储在一个队列中,然后一个处理者顺序执行。

将请求封装为对象,也就是说要处理的资源处理的命令封装成对象。然后一个Command作为基类。

每种命令使用一个类封装,都继承Command。

然后一个处理的对象Process,有add的接口,将Command保存,一个do接口,开始执行所有的命令。

1.1 实现

当然为了效率,是可以传指针的,但是需要是智能指针,因为,多线程的问题。

// 封装命令实际类
class SubStr
{
public:
    Substr(string str):str(str){}
    void sub();
private:
    string str;
};

// 封装命令实际类
class CatStr
{
public:
    Catstr(string str):str(str){}
    void Cat();
private:
    string str;
};

// 为了实现多态的基类
class ABCommand
{
public:
    virtual void do() =0 ;
};

// 提供同一接口的类
class SubCommand :public ABCommand
{
public:
    SubCommand(SubStr obj):obj(obj){}
    void do(){obj->sub();}
private:
    SubStr obj;
};

// 另一个,省略了

//接受者,具体的执行者
class Process
{
public:
    void add();
    void do();
private:
    vector<Command> list;
}

  

1.2 扩展

消息队列也是将请求封装成对象,然后依次处理。

2 责任链模式

2.0 需求

当一个对象的处理过程需要经过多级的时候,也就是说,一个对象可能被不同的命令处理。

那么就需要责任链模式。

2.1 实现

责任链模式的实现,是这样的:

将处理请求的函数,封装为一个类。类继承自同一个基类。类中还有一个基类的指针用于保存下一级处理的类。

而处理请的函数应该判断是否能够处理该请求,如果不能处理,就向下一级转发。

//处理类的基类
class AbHandler
{
public:
  virtual bool exc(Req * req)=0;
private:
  AbHandler *_next; //这个用于保存责任链的下一个
};

//处理类,根据信息判断是否可以执行。
class Exc1Handler:AbHandler
{
public:
  Exc1Handler(AbHandler* handler):_next(handler);
  virtual bool exc(Req * req)
  {
    if(/*判断req信息和本类的其他数据成员是否能够处理该请求*/)
    {
      //do
      return true;
    }
    return _next->exc(req);
  }
};

//链的终端,确保一定可以执行。
class EndHandler:Abhandler
{
//其他不变,构造函数传入参数为空
public:
  virtual bool exc()
  {
    //提示信息
    return false;
  }
};

int main()
{
  EndHandler *endHandler=new EndHandler;
  Exc1Handler *exc1=new Exc1Handler(endHandler);
  //.....添加其他的。
  Exc9Handler *exc9=new Exc9Handler(exc8);
  //另外一个请求类。。。
  Req req;
  exc9->exc(req);
}

  

2.2 缺点

从上面的代码可以看出:责任链的创建过程还是比较复杂的。因为需要一级级的创建。

因此可以更改为使用vector封装函数对象,然后处理的时候使用for来处理

原文地址:https://www.cnblogs.com/perfy576/p/8550808.html

时间: 2024-11-03 12:05:48

设计模式-命令模式(行为)、责任链模式(行为)的相关文章

Java设计模式(九)责任链模式 命令模式

(十七)责任链模式 责任链模式的目的是通过给予多个对象处理请求的机会,已解除请求发送者与接受者之间的耦合关系.面对对象的开发力求对象之前保持松散耦合,确保对象各自的责任最小化,这样的设计可以使得系统更加容易修改,同时降低产生缺陷的风险. public class ChainTest { public static void main(String[] args) { String pass1="123456"; String pass2="123456"; Stri

PHP设计模式学习笔记: 责任链模式(Chain of Responsibility)

// 抽象书本类 abstract class AbstractBookTopic { abstract function getTopic(); abstract function getTitle(); abstract function setTitle($title_in); } // 书本类,继承自抽象书本类 class BookTopic extends AbstractBookTopic { private $topic; private $title; function __co

Delphi 设计模式:《HeadFirst设计模式》---行为模式之责任链模式

模式解说 责任链模式是一种对象的行为模式,它将处理客户端请求的那些对象联成一条链,并沿着这条链传递请求,直到有一个对象处理它为止. 通常使用在以下场合 1 有多个对象可以处理一个请求,哪个对象处理该请求事先并不知道,而是在运行时自动确定: 2 希望在不明确制定接收者的情况下,向多个对象中的一个提交请求: 3 处理一个请求的对象集合需要动态指定时: 16.2 结构和用法 1.抽象处理者(THandler)-定义了一个处理请求的接口.如果需要,则声明一个方法,实现对后续对象的链接: 2.具体处理者(

行为型模式:责任链模式

文章首发:行为型模式:责任链模式 十一大行为型模式之四:责任链模式. 简介 姓名 :责任链模式 英文名 :Chain of Responsibility Pattern 价值观 :责任归我 个人介绍 :Avoid coupling the sender of a request to its receiver by giving more than one object a chance to handle the request.Chain the receiving objects and

5 行为型模式之- 责任链模式

责任链模式介绍: 责任链模式是行为模式之一,什么是"链"?我们将多个节点首尾相连,就形成了链,对于链式结构,每个节点都可以拆开再重新连接,因此链式结构也具有很好的灵活性.将这样一种结构应用于编程领域,将每一个节点看作是一个对象,每一个对象拥有不同的处理逻辑,将一个请求从一个链的首端发出,沿着链的路径依次传递给每一个节点对象,直至有对象处理这个请求为止,我们将这样的一种模式称为责任链模式. 责任链模式的定义: 使多个对象都有机会处理请求,从而避免了请求的发送者和接收者之间的耦合关系,将这

命令模式、状态模式、责任链模式区别(转)

命令模式:一次设定,统一执行.状态模式:    相当于If else if else:    设计路线:各个State类的内部实现(相当于If,else If内的条件)    执行时通过State调用Context方法来执行.职责链模式:    相当于Swich case    设计路线:客户设定,每个子类(case)的参数是下一个子类(case).    使用时,向链的第一个子类的执行方法传递参数就可以. ———————————————————————————————————— 命令模式:将多

设计模式学习笔记之责任链模式

责任链模式 使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系.将这些对象连成一条链,并沿着这条链检查该请求,并对其进行处理,或者将它传递给下一个对象. 责任链模式有两个角色组成: 抽象处理者角色:它定义了一个处理请求的接口.当然对于链子的不同实现,也可以在这个角色中实现后继链. 具体处理者角色:实现抽象处理者定义的接口,并处理它所负责的请求. 下面是<设计模式>中给出的适用范围:    1) 有多个的对象可以处理一个请求,哪个对象处理该请求运行时刻自动确定.    2)

设计模式-行为型模式,责任链模式(10)

顾名思义,责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链.这种模式给予请求的类型,对请求的发送者和接收者进行解耦.这种类型的设计模式属于行为型模式. 在这种模式中,通常每个接收者都包含对另一个接收者的引用.如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推. class Event: def __init__(self, name): self.name = name def __str__(self): ret

设计模式-(15)责任链模式 (swift版)

一,概念: 责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链.这种模式给予请求的类型,对请求的发送者和接收者进行解耦.这种类型的设计模式属于行为型模式.在这种模式中,通常每个接收者都包含对另一个接收者的引用.如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推. 主要解决职责链上的处理者负责处理请求,客户只需要将请求发送到职责链上即可,无须关心请求的处理细节和请求的传递,所以职责链将请求的发送者和请求的处理者解耦了.

大话设计模式读书笔记--19.责任链模式

定义 责任链模式定义: 使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系,将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它 比如: 员工小张向组长申请加薪, 组长没这个权利并将请求告诉部长,部长同意了小张的加薪请求 模式结构 代码实现 场景: 经理可以批准请假, 经理的上级是总监, 总监可以批准加薪 代码实现:点击下载 优点 1.客户端不知道哪一个对象最终处理请求,在不影响客户端的情况下可以动态的重新组织和分配责任 2.链中的对象并不知道链的结构,只需保持