• Welcome to the world's largest Chinese hacker forum

    Welcome to the world's largest Chinese hacker forum, our forum registration is open! You can now register for technical communication with us, this is a free and open to the world of the BBS, we founded the purpose for the study of network security, please don't release business of black/grey, or on the BBS posts, to seek help hacker if violations, we will permanently frozen your IP and account, thank you for your cooperation. Hacker attack and defense cracking or network Security

    business please click here: Creation Security  From CNHACKTEAM

Recommended Posts

1.目的

将一个类的接口转换成客户想要的另一个接口。适配器模式使那些由于接口不兼容而不能一起工作的类能够一起工作。

2.结构

类使用多重继承来匹配一个接口和另一个接口。

23sbq5gcyj44348.png

对象适配器依赖于对象组合。

s2dclyxeaa54349.png

3.参与者

目标:定义与客户端使用的特定域相关的接口;

客户端:与检查目标接口的对象协作;

Adaptee:定义一个已有的接口,需要进行适配;

适配器:使被适配器接口适应目标接口;

4.适应性

以下情况适用于适配器模式:

你想使用一个已有的类,但它的接口不符合你的需要;

您想要创建一个可重用的类,它可以与其他不相关的类或不可预见的类(即那些接口不一定兼容的类)一起工作;

(仅用于对象适配器)您想要使用一些现有的子类,但是不可能将每个子类化以匹配它们的接口。对象适配器可以适应其父类接口;

5.代码示例

场景:有一个绘图编辑器,允许用户绘制和排列基本图元(线、多边形、文本)以生成图片和图表。图形的界面是由抽象的形状类定义的。对于text原语的TextShape类,实现起来比较困难,涉及到复杂的屏幕刷新和缓冲区管理。同时,一个现成的用户界面工具库提供了一个用于显示和编辑文本的TextView类。因为TextView和Shape不可互换,所以需要适配和兼容。

类适配器的示例:

//形状采用由其对角定义的边框。

班级形状

{

公共:

shape();

虚拟void BoundingBox(点左下,点右上)const

虚拟操纵器* create Manipulator()const;

};

//Textview由原点、宽度和高度定义。

类文本视图

{

公共:

textview();

void Getorigin(坐标x,坐标y)const;

void GetExtent(坐标宽度,坐标高度)const

虚拟bool is empty()const;

};

//TextShape适配器实现,公共模式继承接口,私有模式继承接口实现

class Textshape : public Shape(),private: Textview

{

公共:

text shape();

虚拟void BoundingBox(点左下,点右上)const

虚拟bool is empty()const;

虚拟操纵器* create Manipulator()const;

};

//BoundingBox操作转换TextView的接口以匹配Shape的接口。

void text shape : bounding box(点左下,点右上)常量

{

坐标底部、左侧、宽度、高度。

Getorigin(左下);

GetExtent(宽度,高度);

bottomLeft=Point(底部,左侧);

topRight=Point(底部高度,左侧宽度);

}

//IsEmpty operation在适配器实现的过程中给出一个通用方法3360直接转发请求:

bool text shape : is empty()const

{

返回textview : isempty();

}

//最后我们定义CreateManipulator(TextView不支持TextView),假设我们已经实现了支持TextShape操作的TextManipulator类。

manipulator * text shape : create manipulator()常量

{

返回新的text manipulator(this);

}

对象适配器的示例:

//对象适配器,在Textshape中维护一个执行Textview的指针。

类Textshape :公共形状

{

pub11c:

text shape(Textview *);

虚拟void BoundingBox(点左下,点右上)const

虚拟bool is empty()const;

虚拟操纵器* create Manipulator()const;

private:

Textview * _ text

};

//TextShape必须在构造函数中初始化Textview实例的指针。

text shape : text shape(Textview * t)

{

_ text=t;

}

//使用Textview对象调用相应的操作

void text shape : bounding box(点左下,点右上)常量

{

坐标底部、左侧、宽度、高度。

_text-Getorigin(左下);

_text-GetExtent(宽度,高度);

bottomLeft=Point(底部,左侧);

topRight=Point(底部高度,左侧宽度);

}

bool text shape : is empty()const

{

return _ text-IsEmpty();

}

manipulator * text shape : create manipulator()常量

{

返回新的text manipulator(this);

}

6.摘要

适配器模式使接口不兼容的类能够一起工作。当一个类已经存在,但其接口与实际需求不一致时,可以考虑适配器。适配器模式分为对象适配器和类适配器,都通过继承模式适配器接口,都通过对象组合模式适配器接口。

通过使用类适配器,可以在适配器类中重新定义Adaptee的接口,但是当适配器类增加一个抽象接口时,适配器类就要做相应的改变,所以耦合度很高。此外,适配器不能调用由Adaptee的子类实现的接口。

使用对象适配器,当Adaptee增加一个新的抽象接口时,适配器类不需要改变,耦合度低。适配器类可以用多态的方式调用Adaptee子类实现的接口。

如果可以实现为对象适配器,就不要用类适配器。

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now