ADAPTER(适配器模式)

来源:互联网 发布:网络主播年收入 编辑:程序博客网 时间:2024/06/01 08:01
1. 意图
将一个类的接口转换成客户希望的另外一个接口。 Adapter模式使得原本由于接口不兼容
而不能一起工作的那些类可以一起工作。
2. 别名
包装器 Wrapper。
3. 动机
有时,为复用而设计的工具箱类不能够被复用的原因仅仅是因为它的接口与专业应用领

域所需要的接口不匹配。

4. 适用性
以下情况使用Adapter模式
• 你想使用一个已经存在的类,而它的接口不符合你的需求。
• 你想创建一个可以复用的类,该类可以与其他不相关的类或不可预见的类(即那些接口
可能不一定兼容的类)协同工作。
• (仅适用于对象Adapter)你想使用一些已经存在的子类,但是不可能对每一个都进行
子类化以匹配它们的接口。对象适配器可以适配它的父类接口。
5. 结构
类适配器使用多重继承对一个接口与另一个接口进行匹配,如下图所示。


对象适配器依赖于对象组合,如下图所示。


6. 参与者
• Target(Shape)
— 定义C l i e n t使用的与特定领域相关的接口。
• Client(DrawingEditor )

— 与符合Target接口的对象协同。
• Adaptee(TextView)
— 定义一个已经存在的接口,这个接口需要适配。
• Adapter(TextShape)
— 对Adaptee的接口与Target接口进行适配
7. 协作
• Client在Adapter实例上调用一些操作。接着适配器调用 Adaptee的操作实现这个请求。
8. 效果
类适配器和对象适配器有不同的权衡。类适配器
• 用一个具体的Adapter类对Adaptee和Target进行匹配。结果是当我们想要匹配一个类以
及所有它的子类时,类Adapter将不能胜任工作。
• 使得Adapter可以重定义Adaptee的部分行为,因为Adapter是Adaptee的一个子类。
• 仅仅引入了一个对象,并不需要额外的指针以间接得到 Adaptee。
对象适配器则
• 允许一个Adapter与多个Adaptee— 即Adaptee本身以及它的所有子类 (如果有子类的话)
—同时工作。Adapter也可以一次给所有的Adaptee添加功能。
• 使得重定义Adaptee的行为比较困难。这就需要生成 Adaptee的子类并且使得Adaptee引用
这个子类而不是引用Adaptee本身。

9.案例分析

加入我们有一个画图的类Shape,现在我们要实现画矩形的功能DrawRectangle(Vector2 origin,int width,int height),参数要求是远点的位置,矩形宽度,矩形高度

现在有一个写好的类TextView中有一个已经实现画矩形的功能DrawRectangle(Vector2 leftTop, Vector2 rightBottom)参数要求矩形左上角的x,y坐标和左下角的x,y坐标

如果我们想用TextView类来实现Shape的画矩形功能,我们就要为TextView写个Shape能使用的适配器

9.代码实现

对象适配器实现代码

Shape

public class Shape{    /// <summary>    /// 画矩形    /// </summary>    /// <param name="origin">矩形原点x,y坐标</param>    /// <param name="width">矩形宽度</param>    /// <param name="height">矩形高度</param>    public virtual void DrawRectangle(Vector2 origin,int width,int height) {        //donging something    }}

TextView

public class TextView {    /// <summary>    /// 画矩形    /// </summary>    /// <param name="leftTop">矩形左上角x,y坐标</param>    /// <param name="rightBottom">矩形右下角x,y坐标</param>    public void DrawRectangle(Vector2 leftTop, Vector2 rightBottom) {        //donging something    }}

适配器类TextShapeAdapter

public class TextShapeAdapter:Shape {    TextView textView = new TextView();    public override void DrawRectangle(Vector2 origin, int width, int height) {        Vector2 leftTop = origin;        Vector2 rightBottom = new Vector2(origin.x+ width, origin.y+ height);        textView.DrawRectangle(leftTop, rightBottom);    }}

类象适配器实现代码

Shape和TextView代码一样

适配器类TextShapeAdapter

public class TextShapeAdapterEX : TextView, Shape {    /// <summary>    /// 这个是Shape类中的DrawRectangle    /// </summary>    /// <param name="origin"></param>    /// <param name="width"></param>    /// <param name="height"></param>    public override void DrawRectangle(Vector2 origin, int width, int height) {        Vector2 leftTop = origin;        Vector2 rightBottom = new Vector2(origin.x + width, origin.y + height);        //这个是TextView类中的DrawRectangle        DrawRectangle(leftTop, rightBottom);    }}
注意c#不可以继承多个类,但可以继承多个接口


0 0