C++设计模式-- 2.代理模式 和 外观模式

这篇具有很好参考价值的文章主要介绍了C++设计模式-- 2.代理模式 和 外观模式。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

代理模式

代理模式的定义:为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合 或不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。

代理模式有以下三种角色:
Subject(抽象主题角色):真实主题与代理主题的共同接口。
RealSubject(真实主题角色):定义了代理角色所代表的真实对象。
Proxy(代理主题角色):含有对真实主题角色的引用,代理角色通常在将客户端调用传递给真实主题对象之前或者之后执行某些操作,而不是单纯返回真实的对象。

代码演示:

//抽象主题角色
//抽象的公共接口
class AbstractCommonInterface
{
public:
	virtual void run() = 0;
	virtual ~AbstractCommonInterface() {};
};
//真实主题角色
//真实的系统
class MySystem :public AbstractCommonInterface
{
public:
	void run() override
	{
		cout << "系统启动....." << endl;
	}
};
在这里插入代码片
//代理主题角色
//必须要有权限验证,不是所有人都能来启动我的系统,提供用户名和密码
class MySystemProxy :public AbstractCommonInterface
{
public:
	MySystemProxy(string mUserName, string mPassword) : mySystem(new MySystem){
		this->mUserName = mUserName;
		this->mPassword = mPassword;
	};

	~MySystemProxy(){ 
		if (mySystem != nullptr) {
			delete mySystem;
		}	
	};
	
	bool checkUserNameAndPassword() {
		if (mUserName == "admin" && mPassword == "123")
		{
			return true;
		}
		else {
			return false;
		}
	}

	void run() override
	{
		if (checkUserNameAndPassword())
		{
			this->mySystem->run();//调真实的服务系统
		}else {
			cout << "accout or password is error!" << endl;
		}
	}
private:
	MySystem* mySystem;//真实系统的指针
	string mUserName; //账号
	string mPassword; //密码
};

测试调用:

int main(int argc, char* argv[])
{
	AbstractCommonInterface* mySystemProxy = new MySystemProxy("admin","123");
	mySystemProxy->run();
	delete mySystemProxy;
	return 0;
}

输出结果:
C++设计模式-- 2.代理模式 和 外观模式,C and C++的笔记,c++,设计模式,代理模式
代理模式类的UML图如下:
C++设计模式-- 2.代理模式 和 外观模式,C and C++的笔记,c++,设计模式,代理模式

外观模式

根据迪米特法则,如果两个类不必彼此直接通信,那么这两个类就不应当发生直接的相互作用。
Facade模式也叫外观模式,是由GoF提供的23种设计模式中的一种。
Facade模式为一组有类似功能的类群,比如类库,子系统等待,提供一个一致的简单界面。这个一致的简单界面被称作Facade。
外观模式就是将复杂的子类系统抽象到同一个接口进行管理,外界只需要通过此接口与子类系统进行交互,而不必要直接与复杂的子类系统进行交互

角色和职责

Facade(外观角色):为调用方,定义简单的调用接口。
SubSystem(子系统角色):功能提供者。指提供功能的类群(模块或子系统)。

代码演示一:

子系统代码

//子系统 1
class SubSystem1
{
public:
	void run() {
		cout << "子系统一运行..." << endl;
	}
};

//子系统 2
class SubSystem2
{
public:
	void run() {
		cout << "子系统二运行..." << endl;
	}
};

//子系统 3
class SubSystem3
{
public:
	void run() {
		cout << "子系统三运行..." << endl;
	}
};

//子系统 4
class SubSystem4
{
public:
	void run() {
		cout << "子系统四运行..." << endl;
	}
};

外观类代码

class Facade
{
public:
	Facade() {
		pSystem1 = new SubSystem1;
		pSystem2 = new SubSystem2;
		pSystem3 = new SubSystem3;
		pSystem4 = new SubSystem4;
	}

	~Facade() {
		delete pSystem1;
		delete pSystem2;
		delete pSystem3;
		delete pSystem4;
	}

	void runSystem(){
		pSystem1->run();
		pSystem2->run();
		pSystem3->run();
		pSystem4->run();
	}

private:
	SubSystem1* pSystem1;
	SubSystem2* pSystem2;
	SubSystem3* pSystem3;
	SubSystem4* pSystem4;
};

注意:因为Facade类的成员变量SubSystem1/2/3/4类型的指针,而不是SubSystem1类型的实例是其成员变量,
所以这里Facade类和SubSystem1/2/3/4都不能称为关联。又因为Facade类的构造函数中,用到了SubSystem1/2/3/4类。
所以Facade类依赖于SubSystem1/2/3/4类。Facade类和SubSystem1/2/3/4类是依赖关系。
拓展:关联是“HAS”关系,依赖是“USE”关系 。A类关联B类,指的是B类对象作为A类的属性存在,称为“has”关系。
A类依赖B类,指的是B的对象作为A类的方法参数或者在A类的方法内 存在,称为“use”关系 。
测试调用代码

void test(){
	
	Facade* facade = new Facade;
	facade->runSystem();
}

int main(int argc, char *argv[])
{
	test()
	
	return 0;
}

针对上例的外观模式UML类图:
C++设计模式-- 2.代理模式 和 外观模式,C and C++的笔记,c++,设计模式,代理模式

代码演示二:

根据类图,实现家庭影院外观模式
实现KTV模式:
开启时:电视打开,灯关掉,音响打开,麦克风打开,dvd打开。
关闭时:电视关掉,灯打开,音响关掉,麦克风关掉,dvd关掉。
实现游戏模式:
开启时:电视打开,音响打开,游戏机打开。
关闭时:电视关掉,音响关掉,游戏机关掉。

子系统角色:

//电视机
class Television
{
public:
	void On(){
		cout << "电视机打开...." << endl;
	}

	void Off(){
		cout << "电视机关闭...." << endl;
	}
};

//灯
class Light
{
public:
	void On(){
		cout << "灯打开...." << endl;
	}

	void Off(){
		cout << "灯关闭...." << endl;
	}
};

//音箱
class Audio
{
public:
	void On(){
		cout << "音箱打开...." << endl;
	}

	void Off(){
		cout << "音箱关闭...." << endl;
	}
};

//麦克风
class Microphone
{
public:
	void On(){
		cout << "麦克风打开...." << endl;
	}

	void Off(){
		cout << "麦克风关闭...." << endl;
	}
};

//DVD播放器
class DVDPlayer
{
public:
	void On(){
		cout << "DVD播放器打开...." << endl;
	}

	void Off(){
		cout << "DVD播放器关闭...." << endl;
	}
};

//游戏机
class Gamemachine
{
public:
	void On(){
		cout << "游戏机打开...." << endl;
	}

	void Off(){
		cout << "游戏机关闭...." << endl;
	}
};

外观角色:

//KTV模式
class KTVMode
{
public:
	KTVMode(){
		pTv = new Television;	
		pLight = new Light;	
		pAudio = new Audio;	
		pMicrophone = new Microphone;	
		pDvd = new DVDPlayer;	
	}
	
	~KTVMode(){
		delete pTv;	
		delete pLight;	
		delete pAudio;	
		delete pMicrophone;	
		delete pDvd;	
	}
	
	void OnKTV(){
		pTv->On();
		pLight->Off();
		pAudio->On();
		pMicrophone->On();
		pDvd->On();
	}

	void OffKTV(){
		pTv->Off();
		pLight->On();
		pAudio->Off();
		pMicrophone->Off();
		pDvd->Off();
	}

private:
	Television* pTv;
	Light* pLight;
	Audio* pAudio;
	Microphone* pMicrophone;
	DVDPlayer* pDvd;
};


//游戏模式
class GameMode
{
public:
	GameMode(){
		pTv = new Television;	
		pAudio = new Audio;	
		pGamemachine = new Gamemachine;	
	}
	
	~GameMode(){
		delete pTv;	
		delete pAudio;	
		delete pGamemachine;		
	}
	
	void OnGame(){
		pTv->On();
		pAudio->On();
		pGamemachine->On();
	}

	void OffGame(){
		pTv->Off();
		pAudio->Off();
		pGamemachine->Off();
	}

private:
	Television* pTv;
	Audio* pAudio;
	Gamemachine* pGamemachine;
};

测试调用:

//测试KTV模式
void testKTVMode()
{
	KTVMode* pKTVMode = new KTVMode;
	pKTVMode->OnKTV();//开启KTV模式
	//pKTVMode->OffKTV();//关闭KTV模式
}

//测试游戏模式
void testGameMode()
{
	GameMode* pGameMode = new GameMode;
	pGameMode->OnGame();//开启游戏模式
	//pGameMode->OffGame();//关闭游戏模式
}


int main(int argc, char *argv[])
{
	testKTVMode();
	//testGameMode();
	return 0;
}

针对上例的外观模式UML类图:
C++设计模式-- 2.代理模式 和 外观模式,C and C++的笔记,c++,设计模式,代理模式

外观模式适用场景

1.复杂系统需要简单入口使用。
2.客户端程序与多个子系统之间存在很大的依赖性。
3.在层次化结构中,可以使用外观模式定义系统中每一层的入口,
层与层之间不直接产生联系,而通过外观类建立联系,降低层之间的耦合度。文章来源地址https://www.toymoban.com/news/detail-796418.html

到了这里,关于C++设计模式-- 2.代理模式 和 外观模式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 《设计模式的艺术》笔记 - 外观模式

            外观模式中外部与一个子系统的通信通过一个统一的外观角色进行,为子系统中的一组接口提供一个一致的入口。外观模式定义了一个高层接口,这个接口使得子系统更加容易使用。外观模式又称为门面模式,它是一种对象结构型模式。 myclass.h myclass.cpp main.cpp    

    2024年01月19日
    浏览(52)
  • 【Java面试题】设计模式之七种结构性模式——代理模式、适配器模式、桥接模式、装饰模式、外观模式、享元模式、组合模式

    目录 一、代理模式 二、适配器模式 三、桥接模式 四、装饰模式 五、外观模式 六、享元模式 七、组合模式 概念: 代理模式是为其他对象提供一种以代理控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对

    2023年04月09日
    浏览(50)
  • Visual C++中的虚函数和纯虚函数(以外观设计模式为例)

    我是荔园微风,作为一名在IT界整整25年的老兵,今天来说说Visual C++中的虚函数和纯虚函数。该系列帖子全部使用我本人自创的对比学习法。也就是当C++学不下去的时候,就用JAVA实现同样的代码,然后再用对比的方法把C++学会。 直接说虚函数和纯虚函数有很多人会直接晕,但

    2024年02月15日
    浏览(34)
  • C++ 设计模式之代理模式

    【提示:如果不想看文字介绍,可以直接跳转到C++编码部分】 【简介】什么是代理模式         代理模式  Proxy Pattern  是⼀种 结构型设计模式 ,⽤于控制对其他对象的访问。在代理模式中,允许⼀个对象(代理)充当另⼀个对象(真实对象)的接⼝,以控制对这个对象

    2024年01月16日
    浏览(36)
  • 设计模式之代理模式笔记

    记录下学习设计模式-代理模式的写法。JDK使用版本为1.8版本。 意图 :为其他对象提供一种代理以控制对这个对象的访问。 结构 : 其中: Proxy保存一个引用使得代理可以访问实体;提供一个与Subject的接口相同的接口,使代理可以用来代替实体;控制对实体的存取,并可能负责

    2024年02月11日
    浏览(29)
  • 《设计模式的艺术》笔记 - 代理模式

            代理模式是给某一个对象提供一个代理,并由代理对象控制对原对象的引用。代理模式是一种对象结构型模式。 myclass.h myclass.cpp main.cpp         1. 代理模式能够协调调用者和被调用者,在一定程度上降低了系统的耦合度,满足迪米特法则。         2. 客户端可以

    2024年01月19日
    浏览(55)
  • C++设计模式结构型之代理模式

    一、概述     代理模式是一种结构型模式,在很多不同的场合具有广泛的分类和应用。其主要实现的思想是在客户端和真正要访问的对象之间引入一个 代理对象(间接层),于是,以往客户端对真正对象的访问现在变成了通过代理对象进行访问,代理对象在这里起到了一个

    2024年02月13日
    浏览(42)
  • 设计模式之代理模式(Proxy),以C++为例,实现远程代理、虚拟代理、保护代理等。

            兄弟姐妹们好,又是好久没有更新了,今天给大家简单介绍代理模式,一个很简单的设计模式,旨在不改变原对象的情况下通过代理对象来控制对原对象的访问。代理模式根据具体情况还可以分为远程代理、虚拟代理、保护代理等,下面来介绍一下。 目录  一、代理

    2023年04月09日
    浏览(40)
  • 设计模式之代理模式(Proxy)的C++实现

    在组件的开发过程中,有些对象由于某种原因(比如对象创建的开销很大,或者对象的一些操作需要做安全控制,或者需要进程外的访问等),会使Client使用者在操作这类对象时可能会存在问题:(1)使用者直接访问这种对象会使系统带来很多麻烦。(2)或者使用者使不能

    2024年02月12日
    浏览(40)
  • 设计模式-外观模式

         外观模式(Facade Pattern)是属于结构型的设计模式,它的主要目的是为子系统中的一组接口提供一个统一且更简单的接口,还简化了客户端调用子系统功能的过程。 1 Facade(外观类) : Facade 类提供了对子系统的简洁、一致的接口。它包含了子系统中的多个模块或组件的

    2024年01月19日
    浏览(68)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包