c++ 设计模式--外观模式&建造者模式(11,12)

案例:睡觉前可以一次性关闭电视,电脑,点灯

外观模式

外观模式定义(FasadePattern)

外观模式为子系统的一组接口提供统一的入口,定义了一个高层接口,使得子系统更加容易使用。简化客户端和子系统之间的交互,方便客户端使用。

外观模式结构

  • Fasade(外观角色):外观角色知道多个相关子系统的功能,将所有从客户端发来的请求委派给相应的子系统作相应处理
  • SubSystem(子系统角色):子系统是一个类,或者由多个类组成的类的集合,实现外观角色要求的具体实现
    在这里插入图片描述

外观模式示例

https://gitee.com/NiMiKiss/design-pattern.git

#ifndef _FASADE_PATTERN_
#define _FASADE_PATTERN_
#include<iostream>
#include<memory>
class TV
{
public:
	void ON() { std::cout << "TV ON" << std::endl; }
	void OFF() { std::cout << "TV OFF" << std::endl; }
};

class Light
{
public:
	void ON() { std::cout << "Light ON" << std::endl; }
	void OFF() { std::cout << "Light OFF" << std::endl; }
};

class Computer
{
public:
	void ON() { std::cout << "Light ON" << std::endl; }
	void OFF() { std::cout << "Light OFF" << std::endl; }
};

class Fasade
{
public:
	Fasade()
	{
		m_spTV = std::shared_ptr<TV>(new TV());
		m_spLight = std::shared_ptr<Light>(new Light());
		m_spComputer = std::shared_ptr<Computer>(new Computer());
	}
	void ON() { m_spTV->ON(); m_spLight->ON(); m_spComputer->ON(); }
	void OFF() { m_spTV->OFF(); m_spLight->OFF(); m_spComputer->OFF(); }
private:
	std::shared_ptr<TV> m_spTV;
	std::shared_ptr<Light> m_spLight;
	std::shared_ptr<Computer> m_spComputer;
};
#endif // !_FASADE_PATTERN_

客户端调用

#include "Fasade_Pattern.h"
#include<iostream>
#include<memory>
int main()
{
	auto spFasade = std::shared_ptr<Fasade>(new Fasade());
	spFasade->ON();
	spFasade->OFF();
	return EXIT_SUCCESS;
}

案例: 民用飞机和军用飞机构造过程基本一致,只是使用的具体的材料不同

建造者模式(BuilderPattern)

建造者模式简介

建造者模式将客户端与包含多个部件的复杂对象的构建过程分离,客户端不必知道复杂对象的内部组成方式与装配方式,将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

外观模式和建造者模式

外观模式和建造者模式都是在基础层之上多了一层包装,开放简洁的接口给调用者。
外观模式是结构型的模式,建造者模式是创建型的模式

建造者模式结构

  • 抽象建造者(AbstractBuilder): 创建一个Product对象的各个部件指定的抽象接口
  • 具体建造者(ConcreteBuilder):实现AbstractBuilder的接口,实现各个部件的具体构造方法和装配方法,并返回创建结果
  • 产品(Product):具体的产品对象
  • 指挥者(Direct):构建一个使用Builder对象的接口,安排复杂对象的构建过程。
    在这里插入图片描述

建造者模式示例

https://gitee.com/NiMiKiss/design-pattern.git

#ifndef _BUILDER_PATTERN
#define _BUILDER_PATTERN
#include<iostream>
#include<memory>
class Aircraft
{
public:
	void SetEngine(const std::string& sEngine) { m_sEngine = sEngine; }
	void SetBody(const std::string& sBody) { m_sBody = sBody; }
	void SetWing(const std::string& sWing) { m_sWing = sWing; }
	void SetLandgear(const std::string& sLandgear) { m_sLandgear = sLandgear; }
	void DisplayAircraftInfo() const
	{
		std::cout << "Engine= " << m_sEngine << std::endl;
		std::cout << "Body= " << m_sBody << std::endl;
		std::cout << "Wing= " << m_sWing << std::endl;
		std::cout << "Landgear= " << m_sLandgear << std::endl;
	}
private:
	std::string m_sEngine;
	std::string m_sBody;
	std::string m_sWing;
	std::string m_sLandgear;
};

class AircraftBulider
{
public:
	AircraftBulider() { m_spAircraft = std::shared_ptr<Aircraft>(new Aircraft()); }
	virtual void AddEngine() = 0;
	virtual void AddBody() = 0;
	virtual void AddWing() = 0;
	virtual void AddLandgear() = 0;
	virtual std::shared_ptr<Aircraft> GetAircraft() { return m_spAircraft; };
protected:
	std::shared_ptr<Aircraft> m_spAircraft;
};

class MilitaryAircraftBulider:public AircraftBulider
{
public:
	void AddEngine() { m_spAircraft->SetEngine("MilitaryAircraftEngine"); }
	void AddBody() { m_spAircraft->SetBody("MilitaryAircraftBody"); }
	void AddWing() { m_spAircraft->SetWing("MilitaryAircraftWing"); }
	void AddLandgear() { m_spAircraft->SetLandgear("MilitaryAircraftEngine"); }
};

class CivilAircraftBulider :public AircraftBulider
{
public:
	void AddEngine() { m_spAircraft->SetEngine("CivilAircraftEngine"); }
	void AddBody() { m_spAircraft->SetBody("CivilAircraftBody"); }
	void AddWing() { m_spAircraft->SetWing("CivilAircraftWing"); }
	void AddLandgear() { m_spAircraft->SetLandgear("CivilAircraftEngine"); }
};

class BuilderDirector
{
public:
	void SetBuilder(std::shared_ptr<AircraftBulider> spAircraftBulider)
	{
		m_spAircraftBulider = spAircraftBulider;
	}
	std::shared_ptr<Aircraft> Builder()
	{
		m_spAircraftBulider->AddEngine();
		m_spAircraftBulider->AddBody();
		m_spAircraftBulider->AddWing();
		m_spAircraftBulider->AddLandgear();
		return m_spAircraftBulider->GetAircraft();
	}
private:
	std::shared_ptr<AircraftBulider> m_spAircraftBulider;
};
#endif // !_BUILDER_PATTERN

客户端调用

#include "Builder_Pattern.h"
#include<iostream>
#include<memory>
int main()
{
	auto spBuilderDirector = std::shared_ptr<BuilderDirector>(new BuilderDirector());
	auto spMilitaryAircraftBulider = std::shared_ptr<MilitaryAircraftBulider>(new MilitaryAircraftBulider());
	spBuilderDirector->SetBuilder(spMilitaryAircraftBulider);
	auto spAircraft=spBuilderDirector->Builder();
	spAircraft->DisplayAircraftInfo();

	auto spCivilAircraftBulider = std::shared_ptr<CivilAircraftBulider>(new CivilAircraftBulider());
	spBuilderDirector->SetBuilder(spCivilAircraftBulider);
	auto spCivilAircraft = spBuilderDirector->Builder();
	spCivilAircraft->DisplayAircraftInfo();
	return EXIT_SUCCESS;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值