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

无论是在现实生活中还是在软件开发过程中,人们经常会遇到这样一类情况:需要和多个对象打交道,例如用户在自行组装计算机时需要购买显示器、主板、硬盘、内存、CPU 等硬件设备,组装过程麻烦而且可能还会存在设备不兼容,而直接购买已由专业人士组装好的计算机则可以省去这些麻烦。我们无须购置设备,通过专业计算机组装人员可以获得一台完整的计算机。由于计算机组装人员的出现,简化了用户与多个设备之间的交互,使得用户不需要关心设备的组装细节即可使用它们,在这里,计算机组装人员充当了一个我们称之为“外观类”的角色,通过它可以简化用户与多个对象之间的交互过程。基于这种设计思想的模式称为“外观者模式

思想定义:为子系统中的一组接口提供统一的入口,外观者模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。外部与子系统的通信可以通过一个统一的外观对象进行

优点

  1. 对客户屏蔽子系统组件,减少了客户处理的对象数目并使得子系统使用起来更加容易
  2. 实现了子系统和客户之间的松耦合关系

缺点

  1. 不能很好地限制客户使用子系统类,如果限制过多则减少了可变性和灵活性
  2. 增加新的子系统可能需要修改外观类或者客户端的代码,违背了“开闭原则”

适用场景

  1. 当要为一个复杂的子系统提供一个简单的接口时可以使用外观者模式

案例:实现家庭影院外观模式应用(每个产品都提供开和关的操作)
实现KTV模式:电视打开、灯关掉、音响打开、麦克风打开、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 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;
	}

	//打开ktv
	void OnKty()
	{
    
    
		pTv->On();
		pLight->Off();
		pAudio->On();
		pMicrophone->On();
		pDvd->On();
	}
	//关闭ktv
	void OffKty()
	{
    
    
		pTv->Off();
		pLight->On();
		pAudio->Off();
		pMicrophone->Off();
		pDvd->Off();
	}

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

运行截图:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_44443986/article/details/117528092