结构型模式

Last updated on 8 months ago

适配器模式

适配器是一种结构型设计模式,它能使接口不兼容的对象能够,相互合作。

举个例子国内是电源插座是220V,现在呢,我出国了,比如说印度,印度的电源是230的,国内的用的220v的充电头用不了,那怎么办,一种是去他们国家买个新的,另一种是搞个万能转接头,比如说230转220的,这样就可以使用了,这种转接头也就是 适配器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
namespace AdapteMethon {

// 正常speak
class SpeakCommon {
public:
virtual ~SpeakCommon() = default;
virtual std::string Result() const {
std::cout << " I say English balabala" << std::endl;
}
};

// 特殊 speak
class SpeakSpecial {
public:
virtual ~SpeakSpecial() = default;
virtual std::string Result() const {
std::cout << "olleh " << std::endl;
return "olleh";
}
};
//adapter 继承 SpeakCommon 并且从重写了Result
class Aadpter : public SpeakCommon {
private:
SpeakSpecial *special_;

public:
Aadpter(SpeakSpecial *special) : special_(special){};
std::string Result() const override {
std::string special_res = this->special_->Result();
std::reverse(special_res.begin(), special_res.end());
std::cout << special_res << std::endl;
return "Translate : " + special_res;
}
};
void Client(SpeakCommon *target) { target->Result(); }

}; // namespace AdapteMethon

桥接模式

桥接模式是将抽象部分与它的实现部分分离,使它们都可以独立地变化。它是一种对象结构型模式,又称为柄体(Handle and Body)模式或接口(Interfce)模式。

比如我要生产各种形状的球,有红色,蓝色,紫色等等,一种方式是一种球就一个类,比如说红色球类,蓝色球类等等,我要生产n种球就有n种类,另一种方式是我将颜色类抽象出来,每个颜色都做一种类,然后生产球类就继承颜色类即可,这样就会有 m * n 个组合方式,还有一种方式是颜色类我也是抽象出来,不过不是以继承的方式,而是以组合的方式来

优点

  • 分离抽象接口及其实现部分。

  • 桥接模式有时类似于多继承方案,但是多继承方案违背了类的单一职责原则(即一个类只有一个变化的原因),复用性比较差,而且多继承结构中类的个数非常庞大,桥接模式是比多继承方案更好的解决方法。

  • 桥接模式提高了系统的可扩充性,在两个变化维度中任意扩展一个维度,都不需要修改原有系统。

  • 实现细节对客户透明,可以对用户隐藏实现细节。

缺点

  • 桥接模式的引入会增加系统的理解与设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计与编程。
  • 桥接模式要求正确识别出系统中两个独立变化的维度,因此其使用范围具有一定的局限性。