Adapter模式——设计模式学习笔记
Adapter模式
一 意图
将一个类的接口转换成客户希望的另外一个接口。
Adapter模式使得原本由于接口不兼容而不能在一起工作的那些类可以在一起工作。
二 动机
为复用而设计的通用的类,总是存在一些特殊的情况,使其不能够使用或者完成相应的扩展性的功能。
看文中所给的例子:绘图编辑器中新增加文本图形编辑
TextView是呈现文本的,并不支持图形编辑的方式,新增加TextShape,是无法直接使用TextView中的方法,
但同时还要存在Shape的操作,或许还要新增加特性或者操作,这些都要求必须要新增加一个类来完成这些功能。
为了能够使用到TextView中已经存在对于文本的处理方法,就需要继承TextView或者组合TextView对象。
三 适用性和结构
使用一个已经存在的类,但是接口不符合要求
创建一个可以复用的类,与其他不相关的类协同工作
对象适配器适配父类接口
继承方式——类适配器:
组合方式——对象适配器:
继承和组合这两种方式还是有些区别的,需要权衡:
1 类适配器
只能保证Adapter所匹配的基类Adaptee是能够胜任的,对于Adaptee基类所派生下来的子类并一定能够完全胜任。
Adapter能够重新定义基类的方法和扩展自己的方法
仅仅引入一个对象,并不需要额外指针以间接得到Adaptee。
2 对象适配器
一个Adapter可以对应Adaptee本身及其子类
能够进行扩展,但如果对于基类本身及其子类修改该比较麻烦的
3 深度探索
Adapter的匹配程度工作量,取决于Target和Adaptee相似程度
可插入的适配器:能将适配器运用到系统中
双向匹配器:与被匹配的类都兼容,都可以工作。
四 代码实现
1实现颜色亮度可变灯:
有一盏灯其颜色可变,但是现在要求其明亮度也可变,明亮度是由电压和颜色共同决定的。需要一个适配器来完成这个工作。
//电压转换器
class VoltageConveter
{
public:
VoltageConveter(){cout<<" VoltageConveter constructor "<<endl;}
void bindInputVoltage(int voltage){}
void adjustVoltage(int rate){}
private:
int m_voltage;
};
//彩色灯
class ColourLight
{
public:
ColourLight(){cout<<" ColourLight constructor "<<endl;}
void setColorType(int color){}
private:
int m_colorType;
};
//类适配器
class BrightAdapter: public ColourLight,public VoltageConveter
{
public:
BrightAdapter(){cout<<" BrightAdapter constructor "<<endl;}
void setLightness(){}
int getLightness(){}
private:
int m_lightness;
};
2 手机上的文本编辑框控件实现
其中包括两个部分:文本显示和输入法。文本显示不是专为编辑框服务,输入法也并不为编辑框。
所以要将文本显示和输入法结合起来才能实现文本编辑框。同时文本编辑框又需要添加自己的特性,以及配合输入法的使用。
大概的结构图如下: