参考:head first 设计模式
应用场景
有个第三方的接口,我们需要用,并要加入一些我们自己的功能。不想重新开发,或再开发难度大。
比如笔记本的电源适配器,三头转到电脑上的一个头;手机上的充电器;家里的烧水壶,三个插头,
通过一个三转二的适配器,插到家里的二孔插头上;板子等,都是适配器模式。
结构
目标接口:可以是抽象类或接口,我们需要的
适配者类:原有的接口或类,旧有的功能
适配器类:它是个转换器,通过继承接口(抽象类)或接口,来调用原有的东西
图例
特点
优点:
将原有对象加入到新环境中,无需重复再做原有的工作。使两个无法在一起工作的类能够一起工作。
不用改原有的代码,可利用原有类或接口。
仅引用了对象,即是优点也是缺点。
缺点:
类适配器更换麻烦,要改的东西要多些。
如果要适配一个类及它的子类的时候,类的适配器就不好搞了。
系统自带
.net调用com里面的东西
还有AbstractFactory中涉及的DbDataProviderFactory,它里面涉及到DbDataAdapter。
ADO.NET统一访问数据源,
代码
using System;
namespace DesignPattern
{
public class AdapterPatternClient
{
public static void main()
{
//类的适配器
IThreePlugin classAdapter = new PowerAdapter();
classAdapter.Request();
//对象的适配器
ThreePlgin1 objectAdapter = new PowerAdapter1();
objectAdapter.Request();
}
}
//1接口适配器
/// <summary>
/// 三个孔的插头,就是适配器中的目标角色
/// </summary>
public interface IThreePlugin
{
void Request();
}
/// <summary>
/// 原有的功能 两个孔的插头,源角色-需要适配的类
/// </summary>
public abstract class TwoPlugin
{
public void RequestOld()
{
Console.WriteLine("原有功能 2孔插头");
}
}
/// <summary>
/// 适配器类提供了三个孔插头的行为,本质是调用两个孔插头的方法
/// </summary>
public class PowerAdapter : TwoPlugin, IThreePlugin
{
public void Request()
{
//调用两个孔插头头方法
this.RequestOld();
}
}
//客户想用三孔插头,但不能直接调用,所以通过一个接口的转换重写来实现调用三孔插头的功能。
//它就是一个壳子
//2对象适配器
/// <summary>
/// 对象适配器 new一个对象,来引用它,从而调用它内部的东西
/// </summary>
//三个孔的插头,适配器模式中的Target目标角色
public class ThreePlgin1
{
//客户端需要的方法
public virtual void Request()
{
//这里放实现
}
}
/// <summary>
/// 两个孔的插头 源角色需要适配的类
/// </summary>
public class TwoPlugin1
{
public void RequestOld()
{
Console.WriteLine("原有功能 2孔插头");
}
}
//适配器类 这里只引用TwoPlugin对象
public class PowerAdapter1 : ThreePlgin1
{
//引用两个孔插头的实例,从而将客户端与TwoHole联系起来
public TwoPlugin1 twoPluginAdapter = new TwoPlugin1();
//实现三个孔插头接口的方法
public override void Request()
{
twoPluginAdapter.RequestOld();
}
}
}