IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C++设计模式(二)单例模式、代理模式、外观模式、模板方法模式 -> 正文阅读

[C++知识库]C++设计模式(二)单例模式、代理模式、外观模式、模板方法模式

C++设计模式之单例模式
有某些场景需要保证类只能有一个对象,那如何实现单例模式?

大概需要如下三个步骤
1、私有化构造函数
2、private& static 静态数据: 指向对象的指针
3、提供public访问权限的方法返回指向唯一对象的指针 (该方法一定是static方法,因为构造函数是private私有的)

class SingleInstance {
public:
	//提供静态接口
	static SingleInstance* getInstance()
	{
		if(instance == NULL)
			instance = new SingleInstance;
		return instance;
	}
private:
	SingleInstance()
	{
		cout << "私有构造函数被调用" << endl;
	}
private:
	static SingleInstance* instance;
};

//static静态成员初始化
SingleInstance* SingleInstance::instance = NULL;
int main()
{
	SingleInstance* singleInstance = SingleInstance::getInstance();
}

C++设计模式之代理模式

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

//抽象类
class AbstractInterface {
public:
	virtual void run() = 0;
};

//普通对象
class MySystem:public AbstractInterface {
public:
	virtual void run()
	{
		cout << "系统启动" << endl;
	}
};

//代理类就等于对象
class ProxySystem : public AbstractInterface
{
public:
	ProxySystem(string name, string password) :userName(name), userPassword(password) 
	{
		pSystem = new MySystem;
	}

	virtual void run()
	{
		if (checkPermission())
		{
			cout << "用户名和密码验证通过!!!" << endl;
			if (pSystem != NULL)
				pSystem->run();
		}
		else {
			cout << "用户名和密码验证不通过!!!" << endl;
		}
	}

private:
    //验证用户名和密码
	bool checkPermission()
	{
		if (this->userName == "admin" && this->userPassword == "admin")
		{
			return true;
		}
		else {
			return false;
		}
	}
private:
	MySystem* pSystem;
	string userName;
	string userPassword;
};

int main()
{
	ProxySystem* proxySystem = new ProxySystem("admin", "admin");
	proxySystem->run();
}

C++设计模式之外观模式

外观模式就是将复杂的子系统抽象到同一个的接口进行管理。外观只需要通过此接口与子系统进行交互,而不需要和复杂的子系统进行交互。

例子1

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

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

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

class Faced {
public:
	Faced()
	{
		pSystem1 = new System1;
		pSystem2 = new System2;
		pSystem3 = new System3;
	}

	void runSystem()
	{
		pSystem1->run();
		pSystem2->run();
		pSystem3->run();
	}
private:
	System1* pSystem1;
	System2* pSystem2;
	System3* pSystem3;
};

int main()
{
	Faced faced;
	faced.runSystem();
}

例子2:
实现KTV模式:打开tv 打开music
实现静音模式: 打开tv 关闭music

class Tv {
public:
	void on()
	{
		cout << "电视打开" << endl;
	}

	void off()
	{
		cout << "电视关闭" << endl;
	}
};

class Music {
public:
	void on()
	{
		cout << "音乐打开" << endl;
	}

	void off()
	{
		cout << "音乐关闭" << endl;
	}
};
//ktv模式
class KtvMode {
public:
	KtvMode()
	{
		tv = new Tv;
		music = new Music;
	}
	void run()
	{
		tv->on();
		music->on();
	}
	~KtvMode()
	{
		if (tv != NULL)
			delete tv;
		if (music != NULL)
			delete music;
	}
private:
	Tv* tv;
	Music* music;
};

//静音模式
class NoSoundMode {
public:
	NoSoundMode()
	{
		tv = new Tv;
		music = new Music;
	}
	void run()
	{
		tv->on();
		music->off();
	}
	~NoSoundMode()
	{
		if (tv != NULL)
			delete tv;
		if (music != NULL)
			delete music;
	}
private:
	Tv* tv;
	Music* music;
};
int main()
{
	KtvMode* ktv = new KtvMode;
	ktv->run();
	delete ktv;

	NoSoundMode* mode = new NoSoundMode;
	mode->run();
	delete mode;
}

C++设计模式之模板方法模式

定义:定义一个操作中算法的框架,而将一些步骤延迟到子类中。模板方法模式使得子类可以不改变一个算法的结构儿科重定义该算法的某些特定步骤。

场景:冲咖啡的过程 1、烧水 2、冲咖啡 3、倒入杯中 4、加料
同样冲茶叶过程 1、烧水 2、冲茶叶3、倒入杯中 4、加料

class DrinkTemplate {
public:
	virtual void boilWater() = 0;
	virtual void brew() = 0;
	virtual void pourInCup() = 0;
	virtual void addSomething() = 0;
	//模板方法
	void make()
	{
		this->boilWater();
		this->brew();
		this->pourInCup();
		this->addSomething();
	}
};

class Tea : public DrinkTemplate {
public:
	virtual void boilWater()
	{
		cout << "烧水" << endl;
	}
	virtual void brew()
	{
		cout << "冲泡茶叶" << endl;
	}
	virtual void pourInCup() {
		cout << "倒入杯中" << endl;
	}
	virtual void addSomething()
	{
		cout << "加入物料" << endl;
	}
};

class Coffee : public DrinkTemplate {
public:
	virtual void boilWater()
	{
		cout << "烧水" << endl;
	}
	virtual void brew()
	{
		cout << "冲泡咖啡" << endl;
	}
	virtual void pourInCup() {
		cout << "倒入杯中" << endl;
	}
	virtual void addSomething()
	{
		cout << "加入物料" << endl;
	}
};

int main()
{
	DrinkTemplate* drink = new Tea;
	drink->make();
	delete drink;

	drink = new Coffee;
	drink->make();
	delete drink;
}

总结:
优点:

  1. 在父类形式化地定义一个算法,而由它的子类来实现它的细节处理,在子类实现具体细节时并不会改变算法中的步骤的执行顺序。
  2. 模板方式模式是一种代码复用技术,它在类库设计中尤为重要。它提取了类库中的公共行为,将公共行为放在父类中,而通过其子类来实现不同的行为,它鼓励我们恰当使用继承来实现代码复用。
  3. 在模板方式模式中可以通过子类来覆盖父类的方法,不同的子类可以提供基本方法的不同实现,更换和增加新的子类很方便,符合单一职责原则和开闭原则。
  4. 可实现一种方向控制结构,通过子类覆盖父类的钩子方法来决定某一特定步骤是否需要执行。
  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-05-24 17:55:54  更:2022-05-24 17:57:12 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/13 8:47:53-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码