0
点赞
收藏
分享

微信扫一扫

【设计模式学习笔记】外观模式和享元模式案例详解(C++实现)

目录

一、外观模式

1. 什么是外观模式

2. 外观模式案例

二、享元模式

1. 什么是享元模式

2. 享元模式案例


一、外观模式

1. 什么是外观模式

Facade Pattern,外观模式,结构型设计模式之一。外观模式为一个子系统集合提供了一个一致的简单界面,并且外观包含了对各个子系统的引用,客户端可以通过这个外观来访问各个子系统。

外观模式中的角色:

  • Facade:外观类,作为调用接口,提供所有子系统的一致访问界面;
  • Clients:通过外观角色来访问各个子系统;
  • Subsystem:子系统,实现子系统的功能;

2. 外观模式案例

首先创建子系统集合,假设为电脑系统,定义显示屏子系统、主机子系统、键盘子系统

class Screen //子系统1
{
public:
	void get_attr()
	{
		cout << "显示屏子系统" << endl;
	}
};

class Host //子系统2
{
public:
	void get_attr()
	{
		cout << "主机子系统" << endl;
	}
};

class Keyboard //子系统3
{
public:
	void get_attr()
	{
		cout << "键盘子系统" << endl;
	}
};

 如果客户不适应外观类,而是直接访问这个子系统,那么操作将会比较繁琐

void Func1()
{
	Screen* mScreen;
	Host* mHost;
	Keyboard* mKeyboard;

	mScreen = new Screen;
	mHost = new Host;
	mKeyboard = new Keyboard;

	mScreen->get_attr();
	mHost->get_attr();
	mKeyboard->get_attr();
}

要创建每个子系统对象,并逐个调用其方法来访问子系统。

创建一个外观类,它包含对所有子系统的引用

class Facade
{
private:
	Screen* mScreen;
	Host* mHost;
	Keyboard* mKeyboard;
public:
	Facade()
	{
		mScreen = new Screen;
		mHost = new Host;
		mKeyboard = new Keyboard;
	}
	~Facade()
	{
		if (mScreen != NULL)
		{
			delete mScreen;
		}
		if (mHost != NULL)
		{
			delete mHost;
		}
		if (mKeyboard != NULL)
		{
			delete mKeyboard;
		}
	}
	void get_attr()
	{
		this->mScreen->get_attr();
		this->mHost->get_attr();
		this->mKeyboard->get_attr();
	}
};

通过外观来访问所有子系统

void Func2()
{
	Facade* f = new Facade;
	f->get_attr();
	delete f;
}

二、享元模式

1. 什么是享元模式

Flyweight Pattern,享元模式,结构型设计模式。

享元模式的角色:

  • Flyweight:抽象享元角色,定义了所有具体享元类的接口,通过这个接口可以传入外部状态并作用于外部状态;
  •  FlyweightFactory:享元工厂,创建并管理享元对象;
  • ConcreteFlyweight:可共享的内部状态;
  • UnsharedConcreteFlyweight:可以不共享的享元子类;

2. 享元模式案例

假设一个字符串和一个标志作为一对,可以通过标志来确定字符串,比如只要传入标志1就得到字符串hello,也就是说,通过flag可以确定一个字符串。

 

class MyStr
{
protected:
	string str;
public:
	MyStr(string str)
	{
		this->str = str;
	}
	virtual void get_str() = 0;
};

class Hello : public MyStr
{
private:
	int id;
public:
	Hello(string str, int id) : MyStr(str)
	{
		this->id = id;
	}
	virtual void get_str()
	{
		cout << "id: " << id << "  对应的str:  " << str << endl;
	}
};

创建一个工厂

class Factory
{
private:
	map<int, Hello*> m;
public:
	~Factory()
	{
		while (!m.empty())
		{
			Hello* tmp = NULL;
			map<int, Hello*>::iterator it = m.begin();
			tmp = it->second;
			m.erase(it);
			delete tmp;
		}
	}
	Hello* get_str(int id)
	{
		Hello* mtemp;
		map<int, Hello*>::iterator it;
		it = m.find(id);
		if (it == m.end())
		{
			string temp;
			cout << "该字符串未找到,请输入字符串:";
			cin >> temp;
			mtemp = new Hello(temp, id);
			m.insert(make_pair(id, mtemp));
			return mtemp;
		}
		else
		{
			return it->second;
		}
	}
};

客户端通过工厂获取享元对象,并传入一个标志

int main()
{
	Hello* h1 = NULL, * h2 = NULL;
	Factory* f = NULL;

	f = new Factory;

	h1 = f->get_str(1);
	h1->get_str();

	h2 = f->get_str(1);
	h2->get_str();

	delete h2;
	delete h1;
	delete f;

	system("pause");
	return 0;
}

举报

相关推荐

0 条评论