适配器模式
一、适配器模式
- 1、 定义:把一个类的接口变换成客户端所期待的另一种接口,使得原本接口不匹配而无法在一起工作的两个类能够在一起工作。
- 2、 理解:把N个不相关的类匹配同一个接口,客户端通过引用接口,使得形成一个公共常用的类接口。
- 3、 适配器模式分为:①类的适配器模式。②对象的适配器模式
二、类的适配器模式
实例:使用银行卡支付的时候,客户可以选择工商银行卡支付或者建设银行卡支付,但两个银行提供不同的支付接口。
1、 类的适配器模式UML类图
2、 类的适配器模式代码实例
① 支付类代码
//工商支付类
public class ICBC
{
public void icbcPay()
{
Console.WriteLine("工商银行付款接口~~~~");
}
}
//建设支付类
public class CCB
{
public void ccbPay()
{
Console.WriteLine("建设银行付款接口~~~~");
}
}
② 转换代码(插销转换器)
//适配器 插销转换代码
public interface Ipay
{
void Pay();
}
③ 对应各种情况的转换代码
//工商银行的插销转换
public class ICBCApter : ICBC, Ipay
{
public void Pay()
{
base.icbcPay();
}
}
//建设银行的插销转换
public class CCBApter : CCB, Ipay
{
public void Pay()
{
base.ccbPay();
}
}
④ 客户端引用接口代码
namespace 适配器模式One
{
class Program
{
static void Main(string[] args)
{
Ipay ipay = new ICBCApter();//Adapter适配器
ipay.Pay();//输出工商银行
Console.WriteLine("----------------------------");
Ipay cpay = new CCBApter();
cpay.Pay();//输出建设银行
Console.Read();
}
}
}
3、实例UML类图(此类图由VS2012自动生成)
三、对象的适配器模式
1、 对象的适配器模式代码实例
① 支付类代码
//工商支付类
public class ICBC
{
public void icbcPay()
{
Console.WriteLine("工商银行接口付款~~~~");
}
}
//建设支付类
public class CCB
{
public void ccbPay()
{
Console.WriteLine("建设银行接口付款~~~~");
}
}
② 适配器代码
//适配器 插销转换代码
public interface Ipay
{
void Pay();
}
③ 对应各种情况,通过适配器使用的代码
//工商银行的插销转换
//适配器类,这里适配器类没有ICBC类,
//而是引用了ICBC对象,所以是对象的适配器模式的实现
public class ICBCApter : Ipay
{
ICBC icbc = new ICBC();
public void Pay()
{
icbc.icbcPay();
}
}
//建设银行的插销转换
public class CCBApter : CCB, Ipay
{
CCB ccb = new CCB();
public void Pay()
{
ccb.ccbPay();
}
}
④ 客户端代码
namespace 适配器模式_对象的适配器模式
{
class Program
{
static void Main(string[] args)
{
Ipay pay = new ICBCApter();
pay.Pay();
Console.WriteLine("-------------------------");
Ipay payT = new CCBApter();
payT.Pay();
Console.Read();
}
}
}
2、 实例UML类图(此类图由VS2012自动生成)
四、优缺点
1、 类的适配器模式
优点:
① 在不修改原代码的基础上复用现有类
缺点:
① 采用了“多继承”,使得耦合度较高
2、 对象的适配器模式
优点:
① 采用“对象组合”方式,降低了耦合度
② 在不修改原代码的基础上复用现有类
缺点:(暂不清楚)
五、使用场景
1、 系统需要复用现有类
2、 想要建立一个可重复使用的类