c++设计模式之桥接模式 学习笔记

因为之前学了策略模式,所以初次学桥接模式的时候有点懵逼的感觉—这两种模式怎么是一样的?
后来仔细想了一下,发现二者的实现原理确实相同,但是用法和意图其实区别很大。想来这也是为什么书上将策略模式归类为行为模式,将策略模式归类为结构型模式的原因。

遥想当初学习策略模式的时候,书中用鸭子的扩展列举了实例——不同的鸭子有不同的行为,如果用鸭子类直接继承行为类的话,那你后续扩展的鸭子如果拥有和你目前继承的行为类不同的行为时,那就很无奈了。于是,书中在鸭子类中定义了行为方法接口,并添加了行为类对象指针在鸭子类中,通过这种方式实现了代码的解耦和灵活复用。

桥接模式实现的原理也是这样。以手机为例,比如手机类型有:华为,小米,Vivo和Oppo。手机处理器有:骁龙410,骁龙610,骁龙855,麒麟620,麒麟920,麒麟980。那么,手机和处理器的搭配肯定也不能用继承来实现,这是显而易见的。所以这里采取的实现方法和策略模式是极其相似的。
直接上代码。

#include<iostream>

//处理器
class Processor
{

public:
	std::string m_name;
};
//骁龙处理器
class XiaoLong:public Processor
{


};
//麒麟处理器
class QiLin :public Processor
{


};
class XiaoLong410 :public XiaoLong
{
public:
	XiaoLong410(std::string name) { m_name = name; }

};
class XiaoLong610 :public XiaoLong
{
public:
	XiaoLong610(std::string name) { m_name = name; }

};
class XiaoLong855 :public XiaoLong
{
public:
	XiaoLong855(std::string name) { m_name = name; }

};
class QiLin620 :public QiLin
{
public:
	QiLin620(std::string name) { m_name = name; }

};
class QiLin920 :public QiLin
{
public:
	QiLin920(std::string name) { m_name = name; }

};
class QiLin980 :public QiLin
{
public:
	QiLin980(std::string name) { m_name = name; }

};
//手机
class Phone
{
public:
	virtual void display() = 0;
protected:
	Processor *m_processor;
};
//华为手机
class HuaWei :public Phone
{
public:
	HuaWei(Processor *processor) {m_processor = processor;}
	virtual void display()
	{
		std::cout << "我是搭配了" << m_processor->m_name.c_str() << "的华为手机" << std::endl;
	}
};
//小米手机
class XiaoMi :public Phone
{
public:
	XiaoMi(Processor *processor) { m_processor = processor; }
	virtual void display()
	{
		std::cout << "我是搭配了" << m_processor->m_name.c_str() << "的小米手机" << std::endl;
	}
};
//Vivo手机
class Vivo :public Phone
{
public:
	Vivo(Processor *processor) { m_processor = processor; }
	virtual void display()
	{
		std::cout << "我是搭配了" << m_processor->m_name.c_str() << "的vivo手机" << std::endl;
	}
};
//Oppo手机
class Oppo :public Phone
{
public:
	Oppo(Processor *processor) { m_processor = processor; }
	virtual void display()
	{
		std::cout << "我是搭配了" << m_processor->m_name.c_str() << "的oppo手机" << std::endl;
	}
};
void main()
{
	Phone *MyPhone = new HuaWei(new QiLin980("麒麟980"));
	Phone *YourPhone = new XiaoMi(new XiaoLong410("骁龙410"));
	MyPhone->display();
	YourPhone->display();
	//不delete了
	system("pause");
	return;
}

在这里插入图片描述
上述就是桥接模式的一个简单实例。
至于它和策略模式的区别,我觉得主要在用途方面:
比如上述鸭子的扩展,之所以应用策略模式,是为了给你扩展的新的鸭子灵活的指定行为,是为了行为类代码的灵活复用。这里面的关键点:[新]扩展的鸭子,它的[指定]行为,灵活复用。即你新加了一个类,这个类有固定的行为,你可以方便的给这个类加上它的行为(如果有这个行为,那你直接拿过来用,没有就再扩展一个新的行为,总之很方便)。
而手机搭配处理器呢,之所以应用桥接模式,是为了让不同手机和不同处理器可以灵活的自由组合搭配。偏重自由组合搭配。就像珍珠奶茶一样,不同种类的珍珠和奶茶我都分别准备好了,你喜欢什么口味自己搭配着选,我直接给你组合起来就行了。
当然,桥接也可以扩展新的子类,然后再用来自由组合。所以是不是感觉桥接比策略要更加高级😂

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值