定义
:桥接模式
(BridgePattern)
,将抽象部分与它的实现部分分离,使它们都可以独立地变化。
类型:结构型模式。
类图:
参与角色:
- Clinet,客户指定组装电脑,指定了最初的接口。
- Computer,电脑抽象类,指定了具体安装CPU的接口。
- DesktopComputer,具体的台式机电脑,根据主板型号具体实现如何安装CPU。
- CPU,抽象类,指定连接CPU针脚的接口。
- Pentium,Core,具体的CPU,具体实现如何连续CPU的针脚。
概述:
CPU每年都在更新,尤其是像Pentium和Core这样两代产品架构的更新,直接导致整个电脑产业链的更新。例如,Pentium和Core架构下的CPU针脚数不一样,这就要求匹配的主板也必须与CPU吻合。另外核心显卡也集成到了CPU当中云,这些都会影响到电脑的组装。
为了保证达到开闭原则,尽量不去修改原有代码,那么针对产品的升级,就必须通过继承来实现。但是电脑产品的升级会涉及到很多部件。如CPU升级了,就要派生一个新的类了。如果主板升级了,也要派生一个新的类。如果声卡升级了,也需要派生一个新的类。或者其中两个部件升级了,也需要派生新的电脑类。随着变化的部件越来越多,可能会产生非常多非常多的派生类,不便于管理。这个时候就需要用到桥接模式。
桥接模式,将每一个维度的变化都独立出来,并且做成抽象类,通过派生来实现单个维度的升级改变。这样,在客户看来,具体的产品组装接口是没有变,不影响客户端的使用。
这里的示例,主要是以CPU以及安装CPU这两个维度作一下模拟。
代码示例:
#include
"stdafx.h"
#include
<iostream>
using
namespace
std
;
class
CCPU
{
public
:
virtual
~
CCPU
(
)
{
}
virtual
void
Connect
(
)
=
0
;
}
;
class
CComputer
{
public
:
CComputer
(
CCPU
*
_pCPU
)
:
m_pCPU
(
_pCPU
)
{
}
virtual
~
CComputer
(
)
{
}
virtual
void
ConnectCPU
(
)
=
0
;
protected
:
CCPU
*
m_pCPU
;
}
;
class
CDesttopComputer
:
public
CComputer
{
public
:
CDesttopComputer
(
CCPU
*
_pCPU
)
:
CComputer
(
_pCPU
)
{
}
virtual
void
ConnectCPU
(
)
{
cout
<<
"正在安装CPU"
<<
endl
;
m_pCPU
->
Connect
(
)
;
}
}
;
class
CPentiun
:
public
CCPU
{
public
:
virtual
void
Connect
(
)
{
cout
<<
"正在安装奔腾CPU"
<<
endl
;
}
}
;
class
CCore
:
public
CCPU
{
public
:
virtual
void
Connect
(
)
{
cout
<<
"正在安装酷睿CPU"
<<
endl
;
}
}
;
int
_tmain
(
int
argc
,
_TCHAR
*
argv
[
])
{
// 组装奔腾台式机
CCPU
*
pCPU
=
new
CPentiun
(
)
;
CComputer
*
pComputer
=
new
CDesttopComputer
(
pCPU
)
;
pComputer
->
ConnectCPU
(
)
;
delete
pCPU
;
delete
pComputer
;
// 组装酷睿台式机
pCPU
=
new
CCore
(
)
;
pComputer
=
new
CDesttopComputer
(
pCPU
)
;
pComputer
->
ConnectCPU
(
)
;
delete
pCPU
;
delete
pComputer
;
return
0
;
}
注意:
抽象类的析构函数一定要设定为虚函数
,
否则在内存释放的时候可能会有问题
.
优缺点:
- 优点,将实现与抽象分离,具有更好的可扩展性。并且通过组合的方式可以大大提高代码的灵活性。
- 缺点,前期较好的识别出可变的维度有一定的困难。
参考资料:
- 《设计模式——可复用面向对象软件基础》
- 《Java与模式》
- 《大话设计模式》