【设计模式】中介者模式、命令模式、访问者模式

行为型设计模式(二) 行为型设计模式(二)命令模式(Command)核心示例一:自由化创建视图示例二:绘图命令访问者模式(Visitor)核心示例一:IE 兼容示例二:操作类数组对象中介者(Mediator)核心示例一:导航设置功能备忘录模式(Memento)核心示例一:网络请求数据的缓存迭代器模式(Iterator)核心示例一:简化循环遍历示例二:数组/对象迭代器示例三:同步变量迭代器示例四:分支循环嵌套问题解释器模式(Iterpreter)核心示例一:统计元素路径 用于不同 对象间 职责划分或算法抽象 命令模式(Comm 阅读详情

1、中介者模式

介绍

在面向对象程序设计时,对象之间的交互和通信是常见的情况,当系统比较小时,对象之间的交互比较少,可以直接将对象之间的交互硬编码到对象中,可是当系统比较大时,对象的通信变得复杂,需要一个专门处理对象交互和通信的类,中介者模式就是将colleague对象之间的通信封装到一个中介者类中单独处理。

何时使用:多个类相互耦合,形成了网状结构,需要将上述网状结构分离为星型结构的时候。

中介者承担了较多的责任,一旦中介者出现问题,整个系统都会收到影响。

请添加图片描述

角色

  • 一个抽象的同事类,拥有一个中介者类的指针,提供对这个指针的设置操作, 提供一个被通知的操作
  • 一个抽象的中介者类,定义了同事对象到中介者对象的接口。
  • 若干个具体的同事类,重写其父类中的函数,每个同事只知道自己的行为,而不了解其他同事的行为,它们都依赖中介者对象。
  • 一个具体的中介者类,重写其父类中的函数,他需要知道所有的具体的同事类,用一个集合来管理它们,并接收某个同事的消息,完成相应的任务。

代码实现

#include<string>
#include<iostream>
#include<vector>
using namespace std;
class Mediator;
class Colleague{
public:
	Mediator* getMediator();
	void setMediator(Mediator* const mediator);
	Colleague(Mediator* mediator);
	virtual void Notify(string message)=0;
private:
	Mediator* m_mediator;
};

class Mediator{
public:
	virtual void send(string message,Colleague* colleague)=0;
	virtual void add(Colleague* colleague)=0;
};

Mediator* Colleague::getMediator(){
	return m_mediator;
}
void Colleague::setMediator(Mediator* mediator){
	m_mediator = mediator;
}
Colleague::Colleague(Mediator* mediator):m_mediator(mediator){

}


class ConcreteColleague1:public Colleague{
public:
	ConcreteColleague1(Mediator* mediator):Colleague(mediator){

	}
	void send(string message){
		getMediator()->send(message,this);
	}
	void Notify(string message){
		cout<<"colleague1 received :"<<message<<endl;
	}
};
class ConcreteColleague2:public Colleague{
public:
	ConcreteColleague2(Mediator* mediator):Colleague(mediator){

	}
	void send(string message){
		getMediator()->send(message,this);
	}
	void Notify(string message){
		cout<<"colleague2 received :"<<message<<endl;
	}
};
 
class ConcreteMediator:public Mediator{
public:
	void add(Colleague* colleague){
		colleagueList.push_back(colleague);
	}
	void send(string message,Colleague* colleague){
		for(auto val:colleagueList){
			val->Notify(message);
		}
	}
private:
	vector<Colleague*> colleagueList;
};


int main(){
	Mediator* m=new ConcreteMediator();
	ConcreteColleague1* colleague1=new ConcreteColleague1(m);
	ConcreteColleague2* colleague2=new ConcreteColleague2(m);
	m->add(colleague1);
	m->add(colleague2);
	colleague1->send("good morning!");
	colleague2->send("good night");
	return 0;
}

2、命令模式

介绍

命令模式将请求以命令的形式封装如一个对象中,并传递给调用对象,使得可以用不同的请求来对调用客户参数化。

请添加图片描述

角色

  • 一个客户端协议类,其中定义了不同命令的具体实现方式。
  • 一个抽象的命令类,声明了一个命令启动函数
  • 若干个具体的命令类,拥有一个协议类的指针,根据自己的类型,在各自的命令启动函数中调用协议类中相应的函数
  • 一个服务者对象,拥有一个存储命令的容器,和一个添加命令的接口,一个处理命令的接口。

代码实现

模拟一个游戏商店的功能,商店可以有加钱、加钻石、加装备等功能,于是定义一个商店里的协议,有这三种功能的具体实现。然后定义这三种命令的类,分别根据自己的类型去调用协议中规定的功能。商店(server)可以接收命令,再去一个个处理。

#include<iostream>
#include<queue>
#include<windows.h>
using namespace std;

class HandleClientProtocal{
public:
	void AddMoney(){
		cout<<"AddMoney()"<<endl;
	}
	void AddDiamond(){
		cout<<"addDiamond()"<<endl;
	}
	void AddEquipment(){
		cout<<"AddEquipment()"<<endl;
	}
};

class AbstructCommand{
public:
	virtual void handle()=0;
};


class AddMoneyCommand:public AbstructCommand{
public:
	AddMoneyCommand(HandleClientProtocal* protocal){
		this->pProtocal=protocal;
	}
	virtual void handle(){
		this->pProtocal->AddMoney();
	}
private:
	HandleClientProtocal* pProtocal;
};

class AddDiamondCommand:public AbstructCommand{
public:
	AddDiamondCommand(HandleClientProtocal* protocal){
		this->pProtocal=protocal;
	}
	virtual void handle(){
		this->pProtocal->AddDiamond();
	}
private:
	HandleClientProtocal* pProtocal;
};

class AddEquipmentCommand:public AbstructCommand{
public:
	AddEquipmentCommand(HandleClientProtocal* protocal){
		this->pProtocal=protocal;
	}
	virtual void handle(){
		this->pProtocal->AddEquipment();
	}
private:
	HandleClientProtocal* pProtocal;
};

class Server{
public:
	void addRequest(AbstructCommand* command){
		m_commands.push(command);
	}
	void startHandle(){
		while(!m_commands.empty()){
			Sleep(2000);
			AbstructCommand* command=m_commands.front();
			command->handle();
			m_commands.pop();
		}
	}
private:
	queue<AbstructCommand*> m_commands;
};

int main(){
	HandleClientProtocal* protocal=new HandleClientProtocal;
	AbstructCommand* addmoney=new AddMoneyCommand(protocal);
	AbstructCommand* adddiamond=new AddDiamondCommand(protocal);
	AbstructCommand* addequipment=new AddEquipmentCommand(protocal);

	Server* server=new Server;
	server->addRequest(addmoney);
	server->addRequest(adddiamond);
	server->addRequest(addequipment);

	server->startHandle();
	return 0;
}

3、访问者模式

简介

访问者模式封装一些对于某些数据结构各元素的操作,在不改变数据结构元素的前提下定义作用于这些元素的新操作,将操作与数据结构分离。原理是在被访问的类中添加一个对外提供接待访问者的接口。

应用于当需要对某些数据结构元素进行一些操作,同时避免这些操作污染这些元素的场景。

请添加图片描述

角色

  • 一个抽象的行动类,提供对数据结构中元素的非污染的操作。
  • 若干个具体的行动类
  • 一个抽象的封装被访问数据结构元素的类,提供一个参数为抽象行动类指针的接口
  • 若干个具体的封装被访问数据结构元素的类,实现父类中提供的接口
  • 一个封装被访问数据结构的类,提供对数据结构中元素的修改接口,提供一个参数为抽象的行动类指针的接口。

代码实现

模拟观众对一组歌手的评价(歌手有男人和女人)。先定义评价操作的抽象类,再实现具体的评价(成功或失败)。定义人的抽象类,再定义男人女人的具体类,提供接收评价的接口。定义一个歌手的集合类,提供对歌手的添加操作,和一个批量对歌手进行评价的接口,其中遍历集合中的歌手并传递此评价。

#include<iostream>
#include<list>
using namespace std;

class Man;
class Woman;

class Action{
public:
	virtual void getManResult(Man* man)=0;
	virtual void getWomanResult(Woman* woman)=0;


};

class Success:public Action{
public:
	void getManResult(Man* man) ;
	void getWomanResult(Woman* woman);
};

class Fail:public Action{
public:
	void getManResult(Man* man) ;
	void getWomanResult(Woman* woman);
};

class Person{
public:
	Person(string name):name(name){}
	virtual void accept(Action* action)=0;
	string name;
};

class Man:public Person{
public:
	Man(string name):Person(name){}
	void accept(Action* action){
		action->getManResult(this);
	}
};

class Woman:public Person{
public:
	Woman(string name):Person(name){}
	void accept(Action* action){
		action->getWomanResult(this);
	}
};

void Success:: getManResult(Man* man) {
	cout<<"A man "<<man->name<<" said success!"<<endl;
}
void Success::getWomanResult(Woman* woman){
	cout<<"A woman "<<woman->name<<" said success"<<endl;
}
void Fail::getManResult(Man* man) {
	cout<<"A man "<<man->name<<" said fail"<<endl;
}
void Fail::getWomanResult(Woman* woman){
	cout<<"A woman"<<woman->name<<" said fail"<<endl;
}
class Singer{
public:
	void attach(Person* p){
		persons.push_back(p);
	}
	void detach(Person* p){
		persons.remove(p);
		delete p;
	}

	void display(Action* action){
		for(auto val:persons){
			val->accept(action);
		}
	}
private:
	list<Person*> persons;
};

int main(){
	Singer* obj=new Singer;
	obj->attach(new Man("jack"));
	obj->attach(new Woman("ammy"));
	Success* success=new Success;
	obj->display(success);
	Fail* fail=new Fail;
	obj->display(fail);
	return 0;
}


  • 后记:2023农历新年快乐,学习不能停止,变得更强。
23种设计模式之C++实践(三) 23种设计模式之C++实践(三):职责链模式、命令模式、解释器模式、迭代器模式、中介者模式、备忘录模式、观察者模式、状态模式、策略模式、模板方法模式、访问者模式 阅读详情

相关推荐

前端设计模式总结4|桥接模式,组合模式,享元模式,策略模式,模板方法模式,职责链模式,命令模式,访问者模式,解释器模式,中介者模式,备忘录模式

用于把抽象化和实现化解耦使得二者可以独立变化(没有找到js当中的经典应用)设计原则验证抽象和实现分离解耦符合开放封闭原则。

VAN 428

我所知道设计模式之命令者模式

前言介绍接下里介绍的是Java 的设计模式之一:命令模式我们还是以一个问题进行展开,引入命令模式我们买了一套智能家电,有照明灯、风扇、冰箱、洗衣机,我们只要在手机上安装 app 就可以控制对这些家电工作这些智能家电来自不同的厂家,我们不想针对每一种家电都安装一个 App进行控制,我们希望只要一个app就可以控制全部智能家电要实现一个 app 控制所有智能家电的需要,则每个智能家电厂家都要提供一个统...

我吃西红柿 527

opencv实践项目-图片拼接之缝合线算法

opencv 图片缝合线算法

wyw0000的博客 2624

C++行为型模式-实现命令者模式

参考文献: 【】

灰太狼的小秘密 468

Hadoop生态系统-新手快速入门(含HDFS、HBase系统架构)

Hadoop简介 Hadoop是一个由Apache基金会所开发的分布式系统基础架构。 用户可以在不了解分布式底层细节的情况下,开发分布式程序。充分利用集群的威力进行高速运算和存储。 Hadoop实现了一个分布式文件系统(Hadoop Distributed File System),简称HDFS。HDFS有高容错性的特点,并且设计用来部署在低廉的(low-cost)硬件上;而且它提供高吞吐量...

Hadoop环境搭建教程 472

MicroPython跨平台移植实战:从源码解析到STM32+FreeRTOS部署

本文详细解析了MicroPython的跨平台移植实战,重点介绍了如何将其从源码开始,成功部署到STM32微控制器并运行于FreeRTOS实时操作系统。内容涵盖源码结构解析、编译环境搭建、内存管理协调、FreeRTOS任务集成、数学库(math)启用与优化,以及自定义模块开发等核心步骤,为开发者提供了一套完整的、可操作的嵌入式Python移植方案。

vodka的博客 1014

设计模式之命令模式和中介者模式

定义:将“请求”封装成对象,以便使用不同的请求 特点: ● 命令模式解决了应用程序中对象的职责以及它们之间的通信方式问题 ● 能够实现命令发送者和接受者之间的解耦 类型:行为型 适用场景: ● 请求调用者和请求接收者需要解耦,使得调用者和接收者不直接交互 ● 需要抽象出等待执行的行为 优点: ● 降低耦合 ● 容易扩展新命令或者一组命令 缺点: ● 命令的无限扩展会增加类的数量,提高系统实现复杂度。命令接口 实体类 具体命令实现类一 具体命令实现类二 员工类(命令的执行者) 测试类 Coding体会:命令模

长林攻城狮的博客 853

【车间调度】车间调度问题的分类

本系列为自己学习调度相关知识的记录,如有误请指出,也欢迎调度方向的小伙伴加我好友共同交流。 车间调度问题的分类 根据工件和车间构成不同,车间调度问题可分为以下几种 1.单机调度问题 在单机调度问题(S,SMP)中,加工系统只有一台机床,待加工的工件有且仅有一道工序,所有工件都在该机床上进行加工。此问题是最简单的调度问题,当生产车间出现瓶颈机床时的调度就可视为此调度问题。 ...

weixin_51656605的博客 7429

命令模式(设计模式详解)

命令模式是一种行为设计模式,其目的是将请求封装为一个对象,从而允许您将请求参数化、将请求队列化或记录请求日志,以及支持可撤销操作。在命令模式中,请求者和接收者之间的关系被剥离,这使得命令对象成为一个独立的组件,可在需要时轻松添加、删除或替换。命令模式提供了一种解耦的方式,使得请求者和接收者之间的耦合度降低,从而使代码更加灵活和可维护。

qq_46624276的博客 642

PSIM仿真实战:反激电源从设计到调试的完整流程(附短路保护配置)

本文详细介绍了使用PSIM仿真工具进行反激电源从设计到调试的完整流程,包括变压器参数设计、功率器件选型、动态特性调试以及短路保护配置。通过实战案例和仿真技巧,帮助工程师提前暴露并解决设计中的常见问题,如负载突变、输入电压波动和短路保护失效等,显著降低硬件试错成本。

weixin_29216353的博客 243

VS2022编译xlnt库

xlnt是一个用于读写Excel文件的C++库,本文介绍如何用源代码编译静态或动态xlnt库

QQVQQ的博客 7288

Java 设计模式——命令模式

本文介绍了迭代器模式的相关知识。

代码星辰的博客 990

Qemu开发ARM篇-5、buildroot制作根文件系统并挂载启动

在上一篇中,我们编译了kernel,并在qemu上进行了运行,但到最后,在挂载根文件系统时候,挂载失败,这是因为我们还没有根文件系统,在本章中,我们将制作根文件系统。rootfs制作方式有很多方式,如busyBoxbuildrootYocto等,在该篇章中,我们使用buildroot来制作根文件系统,主要考虑到busyBox制作完还需要手动首改一些启动配置比较繁琐,而Yocto如果电脑配置不是很好,编译时间过长,比较麻烦。

sinat_33909696的博客 2465

行为型设计模式(职责链模式,命令模式,中介者模式,观察者模式,访问者模式)

职责链模式 主要用于使多个对象都有机会处理请求,避免请求的的发送者和接受者之间的耦合关系。在现实生活中我们多数遇到的是不纯的责任链模式即每个对象都处理请求的一部分后再交给下家。而纯的职责链模式则要求对于一个请求,要不处理要不就交给下家。具体理解呢。我们可以想一下“击鼓传花”的游戏。或则是你帮你的同学传一个纸条。如果传给你你就看,否则就传给下一个同学(嘻嘻)。比较容易理解,主要看一下类图:

l_z_w99的博客 874

JEDEC JESD51-14 瞬态双界面测试方法详解

(瞬态双界面测试方法,用于测量具有单路径热流的半导体器件的结到壳热阻 RθJC,包括结到壳顶部 RθJCT 和结到壳底部 RθJCB)。该标准于 2010 年发布(版本 JESD51-14.1),旨在提供一种准确、可重复的瞬态方法来测量功率半导体器件(如 MOSFET、IGBT)的结到壳热阻(RthJC),取代传统的稳态测量方法(如 MIL-STD-883E METHOD 1012.1)。方法,通过比较两种不同热界面材料(TIM)下的瞬态温度响应曲线,提取 RthJC,而无需直接测量壳温(Tc)。

专注于前沿技术的探索与实践,热衷于从代码逻辑、架构设计到行业应用等多维度深挖技术本质。期待在技术之路上与你共同成长~ 605

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

设计模式(四):行为型模式之模板方法模式、策略模式、命令模式、状态模式、观察者模式、中介者模式、迭代器模式、访问者模式、备忘录模式和解释器模式

设计模式之行为型模式 一、概述 行为型模式用于描述程序在运行时复杂的流程控制,即描述多个类或对象之间怎样相互协作共同完成单个对象都无法单独完成的任务,它涉及算法与对象间职责的分配。 行为型模式分为类行为模式和对象行为模式,前者采用继承机制来在类间分派行为,后者采用组合或聚合在对象间分配行为。由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则”,所以对象行为模式比类行为模式具有更大的灵活性。 行为型模式是 GoF 设计模式中最为庞大的一类,它包含以下11 种模式。 模板方法(Template Me

HX_2021 1317

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

c++ 23种设计模式_设计模式:全面通晓23种设计模式(典藏查阅)-第四部分

来源:https://www.cnblogs.com/geek6/p/3951677.html说明:代码没有测设过,仅供参考 ^_^18、命令模式(Command)命令模式很好理解,举个例子,司令员下令让士兵去干件事情,从整个事情的角度来考虑,司令员的作用是,发出口令,口令经过传递,传到了士兵耳朵里,士兵去执行。这个过程好在,三者相互解耦,任何一方都不用去依赖其他人,只需要做好自己的事儿就行,司令...

weixin_32022555的博客 172

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

[19/04/30-星期二] GOF23_行为型模式(中介者模式、命令模式、解释器模式、访问者模式)...

一、中介者模式(meditor) 【中介】 /*** * 抽象中介者接口和其具体实现类"经理"类 */ package cn.sxt.meditor; import java.util.HashMap; import java.util.Map; public interface Mediator { void register(Str...

weixin_30670925的博客 81

设计模式全详解——11种行为型模式(上)

设计模式是程序员必修课之一,本文对行为型设计模式中的七种进行了大白话的解析,学习设计模式必读!

Nimrod__的博客 2359

设计模式GOF23之-----------行为型模式(责任链模式、迭代器模式、中介者模式、命令模式、解释器模式、访问者模式、模版方法模式、状态模式、观察者模式、备忘录模式)

一 责任链模式        任链模式是一种对象的行为模式。在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织和分配责任。 责任链模式的结构   下面使用了一个责任链模式的最简单的实现。   责任链...

金州饿霸吃不饱的博客 871

Java面试知识点(全)-设计模式三

Java面试知识点(全)-设计模式三

北巷东东的专栏 891

设计模式(五)行为型模式介绍及实例(下)

中介者模式、迭代器模式、解释器模式、命令模式、责任链模式、访问者模式

HK的博客 2748

设计模式之行为型模式二

1、命令模式 顾名思义“命令”行为是该模式的重点,调用者发送命令,然后接收者执行 显然调用者要持有命令对象,根据依赖倒置原则,命令模式是一个接口,通过命令模式让接收者执行,故而命令对象要持有接收者。 2、中介者模式 中介这个词大家应该都熟悉,比如 房子的中介,买房、卖房者通过中介完成交易 那么显然卖房与中介、买房与中介要相互持有 常见的框架如MVP 3、迭代器模式 提供了一种遍历集合对象的接口,它将集合功能实现与遍历分离开来。 比如LinkedHashMap与HashMap,前者继承了后者

pydlxh的博客 117

命令模式的优点?_一篇目录复习完设计模式

设计模式分类:创建型设计模式创建型设计模式的主要关注点是“怎样创建对象?”,它的主要特点是“将对象的创建与使用分离”。这样可以降低系统的耦合度,使用者不需要关注对象的创建细节,对象的创建由相关的工厂来完成。就像我们去商场购买商品时,不需要知道商品是怎么生产出来一样,因为它们由专门的厂商生产。工厂方法模式:定义一个用于创建产品的接口,由子类决定生产什么产品。抽象工厂模式:提供一个创建产品族...

weixin_30499091的博客 450

行为型设计模式

行为型设计模式 1、命令模式 2、责任链模式 3、模板方法模式 4、策略模式 5、迭代器模式 6、中介者模式 7、观察者模式 8、备忘录模式 9、解释器模式 10、状态模式 11、访问者模式

游海东的技术专栏 1527

设计模式:行为类

文章目录1. 模版方法模式2. 中介者模式3. 命令模式3.1 实例-电视遥控器4. 责任链模式5. 策略模式6. 观察者模式7. 备忘录模式8. 访问者模式9. 状态模式10. 解释器模式 本文介绍Java开发中的行为类设计模式。 1. 模版方法模式 图1: 模板方法模式 AbstractClass:抽象模板,它的方法分为两类,基本方法和模板方法。 基本方法:是由子类实现的方法,并且在模板方...

foureyes 341
上一篇: 【设计模式】模板模式、策略模式、观察者模式、备忘录模式
下一篇: 【设计模式】状态模式、责任链模式、迭代器模式、解释器模式
Sweler*19
博客等级 码龄7年 65粉丝 56原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值