1、结构型模式
描述如何将类或者对象结合在一起行成更大的结构,就像搭积木,可以通过简单的积木的组合行成复杂的、功能更为强大的结构。
结构型模式可以分为:类结构型模式和对象结构型模式
- 类结构型模式关心类的组合,由多个类可以组成一个更大的系统,在类结构型模式中一般只存在继承关系和实现关系。
- 对象结构型模式关心类与对象的组合,通过关联关系使得在一个类中定义另一个类的实例对象,然后通过该对象调用其方法。
根据“合成复用原则”,在系统中尽量使用关联关系替代继承关系,因此大部分结构型模式都是对象结构型模式。
包含:
适配器模式(Adapter)
桥接模式(Bridge)
装饰模式(Decorator)
外观模式(Facade)
享元模式(Flyweight)
代理模式(Proxy)
2、适配器模式
2.1 定义
在现实生活总中,经常出现两个对象因接口不兼容不能一起工作的实例,这时需要第三者进行适配。如:翻译、电源适配器、读卡器。
在软件设计中也可能出现:需要开发具有某种业务功能的组件在现有的组件库中已经存在,但它们与当前系统的接口规范不兼容,如果重新开发这些组建成本又很高,这时用适配器模式能很好地解决这些问题。
适配器模式:将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类能一起工作。适配器模式分为类结构型模式和对象结构型模式两种,前者类之间的耦合度比后者高,且要求程序员了解现有组件库中相关组件的内部结构,所以应用相对较少些。
2.2 模式结构
- 目标接口:当前系统业务所期待的接口,它可以是抽象类或接口。
- 适配者类:它是被访问和适配的现存组件库中的组件接口。
- 适配器类:它是一个转换器,通过继承或则引用适配者的对象,把适配者接口转换成目标接口,让客户按目标接口的格式访问适配者。
类适配器:
对象适配器:
2.3 C++代码
#include <iostream>
#include <string>
using namespace std;
//目标接口
class Target
{
public:
virtual void request() = 0;
};
//适配者接口
class Adaptee
{
public:
void specificRequest()
{
cout << "适配者中的业务代码被调用!" << endl;
}
};
//类适配器
class ClassAdapter :public Target,private Adaptee
{
public:
void request()
{
specificRequest();
}
};
//客户端代码
class ClassAdapterTest
{
public:
static void main()
{
cout << "类适配器模式测试:";
Target *target = new ClassAdapter();
target->request();
}
};
//对象适配器
class ObjectAdapter:public Target
{
private:
Adaptee *adaptee;
public:
ObjectAdapter(Adaptee *adaptee)
{
this->adaptee = adaptee;
}
~ObjectAdapter(){
delete adaptee; }
void request()
{
adaptee->specificRequest();
}
};
//客户端代码
class ObjectAdapterTest
{
public:
static void main()
{
cout << "对象适配器模式测试:";
Adaptee *adaptee = new Adaptee();
Target *target = new ObjectAdapter(adaptee);
target->request();
delete adaptee, target;
}
};
int main()
{
ClassAdapterTest *cat = new ClassAdapterTest();
cat->main();
ObjectAdapterTest *oat = new ObjectAdapterTest();
oat->main();
return 0