【设计模式】桥接模式

来源:爱编程的大丙

定义:将抽象部分和它的实现部分实现部分分离,使它们可以独立变化,这种处理模式就是桥接模式。

cpp 复制代码
#include<iostream>
#include<map>
#include<string>
using namespace std;

//人员信息
struct Person {
	//使用 string biezhu=string()
	// 可以让 Person 类的构造函数更灵活,调用者可以选择是否提供 biezhu 参数。
	Person(string name, string job, string ablity, string reward, string biezhu = string())
	{
		this->name = name;
		this->job = job;
		this->ability = ability;
		this->reward = reward;
		this->beiZhu = biezhu;
	}
	~Person() {
		cout << name << "被析构..." << endl;
	}
	string name;    // 名字
	string job;     // 职责
	string ability; // 能力
	string reward;  // 赏金
	string beiZhu;  // 备注
};

//抽象船队
class AbstractTeam {
public:
	AbstractTeam(string name) :m_teamName(name) {}
	string getTeamName(){
		return m_teamName;
	}
	void addMember(Person* p) {
		m_infoMap.insert(make_pair(p->name, p));
	}
	void show() {
		cout << m_teamName << endl;
		for (const auto& item : m_infoMap) {
			cout << "【Name: " << item.second->name
				<< ", Job: " << item.second->job
				<< ", Ability: " << item.second->ability
				<< ", MoneyReward: " << item.second->reward
				<< ", BeiZhu: " << item.second->beiZhu
				<< "】" << endl;
		}
	}
	virtual void executeTask() = 0;
	virtual ~AbstractTeam() {
		for (const auto& item : m_infoMap) {
			delete item.second;
		}
	}
protected:
	string m_teamName;
	map<string, Person*>m_infoMap;
};

class CaoMaoTeam :public AbstractTeam {
public:
	using AbstractTeam::AbstractTeam;
	void executeTask() override {
		cout << "在海上冒险,找到 ONE PIECE 成为海贼王!" << endl;
	}
};

class SmokerTeam :public AbstractTeam {
public:
	using AbstractTeam::AbstractTeam;
	void executeTask() override {
		cout << "为了正义, 先将草帽一伙一网打尽!!!" << endl;
	}
};

class AbstractShip {
public:
	AbstractShip(AbstractTeam* team) :m_team(team) {}//桥梁,聚合关系
	void showTeam() {
		m_team->show();
		m_team->executeTask();
	}

	virtual string getName() = 0;
	virtual void feature() = 0;
	virtual ~AbstractShip() {}
protected:
	AbstractTeam* m_team = nullptr;
};

class MerryShip :public AbstractShip {
public:
	using AbstractShip::AbstractShip;
	string getName() override {
		return string("前进·梅利号");
	}
	void feature()override {
		cout<<getName()<<" -- 船首为羊头, 在司法岛化身船精灵舍己救下了草帽一伙!" << endl;
	}
};

class HaiJunShip :public AbstractShip {
public:
	using AbstractShip::AbstractShip;
	string getName() override {
		return string("无敌号");
	}
	void feature()override {
		cout << getName() << " -- 船底由海楼石建造, 可以穿过无风带的巨大炮舰!" << endl;
	}
};

int main() {
	//草帽海贼团
	CaoMaoTeam* caomao = new CaoMaoTeam("草帽海贼团");
	Person* luffy=new Person("路飞", "船长", "橡胶果实能力者", "30亿贝里", "爱吃肉");
	Person* zoro = new Person("索隆", "剑士", "三刀流", "11亿1100万贝里", "路痴");
	Person* sanji = new Person("山治", "厨师", "隐形黑", "10亿3200万贝里", "好色");
	Person* nami = new Person("娜美", "航海士", "天候棒+宙斯", "3亿6600万贝里", "喜欢钱");
	caomao->addMember(luffy);
	caomao->addMember(luffy);
	caomao->addMember(zoro);
	caomao->addMember(sanji);
	caomao->addMember(nami);
	MerryShip* sunny = new MerryShip(caomao);
	sunny->feature();
	sunny->showTeam();

	// 斯摩格的船队
	SmokerTeam* team = new SmokerTeam("斯摩格的海军部队");
	Person* smoker = new Person("斯摩格", "中将", "冒烟果实能力者", "", "爱吃烟熏鸡肉");
	Person* dasiqi = new Person("达斯琪", "大佐", "一刀流", "", "近视");
	team->addMember(smoker);
	team->addMember(dasiqi);
	HaiJunShip* ship = new HaiJunShip(team);
	ship->feature();
	ship->showTeam();

	delete caomao;
	delete sunny;
	delete team;
	delete ship;
	return 0;
}
相关推荐
暗黑起源喵2 小时前
设计模式-工厂设计模式
java·开发语言·设计模式
wrx繁星点点9 小时前
状态模式(State Pattern)详解
java·开发语言·ui·设计模式·状态模式
金池尽干11 小时前
设计模式之——观察者模式
观察者模式·设计模式
也无晴也无风雨11 小时前
代码中的设计模式-策略模式
设计模式·bash·策略模式
捕鲸叉20 小时前
MVC(Model-View-Controller)模式概述
开发语言·c++·设计模式
wrx繁星点点21 小时前
享元模式:高效管理共享对象的设计模式
java·开发语言·spring·设计模式·maven·intellij-idea·享元模式
凉辰21 小时前
设计模式 策略模式 场景Vue (技术提升)
vue.js·设计模式·策略模式
菜菜-plus21 小时前
java设计模式之策略模式
java·设计模式·策略模式
暗黑起源喵21 小时前
设计模式-迭代器
设计模式
lexusv8ls600h1 天前
微服务设计模式 - 网关路由模式(Gateway Routing Pattern)
spring boot·微服务·设计模式