您的位置:首页 > 编程语言 > C#

C#设计模式(7)——适配器模式(Adapter Pattern)

2018-02-28 22:22 549 查看

1 适配器模式的定义

在设计模式中,适配器模式(英语:adapter pattern)有时候也称包装样式或者包装(wrapper)。将一个类的接口转接成用户所期待的。一个适配使得因接口不兼容而不能在一起工作的类工作在一起,做法是将类自己的接口包裹在一个已存在的类中。

2 实际应用中的例子

在生活中,我们买的手机充电器插头是2个孔的,但是我们买的插座只有三个孔的,此时我们就希望充电器的插头可以转换为三个孔的就好,这样我们就可以直接把它插在插座上,

此时三个孔插头就是客户端期待的另一种接口,自然两个孔的插头就是现有的接口,适配器模式就是用来完成这种转换的,具体实现代码如下:

类适配器模式实现

三角插座-现有的插头

/// <summary>
/// 三角插头接口-现有的插座
/// </summary>
public interface IThreeHole
{
/// <summary>
/// 输出
/// </summary>
void AdpatePrint();
}


双脚插头-用户期待的插头

1     /// <summary>
2     /// 两脚插头
3     /// </summary>
4     public abstract class TwoHole
5     {
6         public void Print()
7         {
8             Console.WriteLine("启用两脚插头...");
9         }
10     }


适配器:

/// <summary>
/// 适配器
/// </summary>
public class AdpateManage : TwoHole,IThreeHole
{
public void AdpatePrint()
{
this.Print();
}
}


测试:

1     class Program
2     {
3         static void Main(string[] args)
4         {
5             IThreeHole threeHole = new AdpateManage();
6             threeHole.AdpatePrint();
7             Console.ReadKey();
8         }
9     }


三角插头(接口)期待执行 双脚插头的 Print() 方法,可以通过适配器继承三角插头接口双脚插头类,从而实现调度。

执行Print() 方法。

对象的适配器模式

上面都是类的适配器模式的介绍,然而适配器模式还有另外一种形式——对象的适配器模式,

这里就具体讲解下它的实现思路:既然现在适配器类不能继承TwoHole抽象类了(因为用继承就属于类的适配器了),但是适配器类无论如何都要实现客户端期待的方法的,即 AdpatePrint() 方法,

所以一定是要继承ThreeHole抽象类或IThreeHole接口的,然而适配器类的 AdpatePrint() 方法又必须调用TwoHole的 Print() 方法,又不能用继承,这时候就想,不能继承,

但是我们可以在适配器类中创建TwoHole对象,然后在Requst中使用TwoHole的方法了。正如我们分析的那样,对象的适配器模式的实现正式如此。下面就让我看看具体实现代码:

三角插座-现有的插头

/// <summary>
/// 三角插头-现有的
/// </summary>
public abstract class _ThreeHole
{
public virtual void AdpatePrint()
{
Console.WriteLine("三角插头工作中。。。。");
}
}


[b]双脚插头-用户期待的插头[/b]

/// <summary>
/// 两脚插头-用户期待的
/// </summary>
public class _TwoHole
{
public void Print()
{
Console.WriteLine("启用两脚插头...");
}
}


适配器:

/// <summary>
/// 适配器
/// </summary>
public class _AdpateManage : _ThreeHole
{
/// <summary>
/// 获取两脚插头对象
/// </summary>
_TwoHole twoHole = new _TwoHole();

public override void AdpatePrint()
{
this.twoHole.Print();
}
}


测试:

class Program
{
static void Main(string[] args)
{
_ThreeHole threeHole = new _AdpateManage();
threeHole.AdpatePrint();
Console.ReadKey();
}
}


在以下情况下可以考虑使用适配器模式:

系统需要复用现有类,而该类的接口不符合系统的需求

想要建立一个可重复使用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作。

对于对象适配器模式,在设计里需要改变多个已有子类的接口,如果使用类的适配器模式,就要针对每一个子类做一个适配器,而这不太实际。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: