适配器模式(结构型模式)
1.类结构型模式
关心类的组合 由多个类组合成一个更大的系统 一般只存在继承关系与实现关系
2.对象结构型模式
关心类与对象的组合 通过关联关系 在一个类中定义另一个类的实例对象
合成复用原则:系统中应尽量使用关联关系替代继承关系
适配器模式
定义:将一个类的接口转换成客户希望的另一个接口,让接口不兼容的类可以一起工作。
组成:Target Adapter Adaptee
目标抽象类:定义客户所需的接口
适配器类:实现Target接口并继承Adaptee类
适配者类:被适配的角色 定义一个已存在的接口 包含客户希望使用的业务方法
类适配器模式
提供一个中间类Adapter,实现抽象目标类接口Target,继承适配者类
class Adapter:Adaptee,Target
{
public void Request()
{
base.SpecificRequest();
}
}
对象适配器模式
适配器类与适配者类是关联关系(委派关系)
class Adapter:Target
{
private Adaptee adaptee; //维持一个对适配者对象的引用
public Adapter(Adaptee adaptee)
{
this.adaptee = adaptee;
}
public void Request()
{
adaptee.SpecificRequest();//转发调用
}
}
适配器模式强调对代码的组织,而不是功能的实现。
缺省适配器模式(单接口适配器模式)
定义:不需要实现一个接口所提供的所有方法时,可先设计一个抽象类实现该接口,并为接口中的每个方法提供一个默认实现(空方法),抽象类的子类可有选择的覆盖父类的某些方法实现需求。
ServiceIntelface:适配者接口,声明大量方法
AbstractServiceClass:缺省适配器抽象类,使用空方法实现形式
ConcreteServiceClass:具体业务类,继承适配器类,根据需要选择需要使用的方法
双向适配器模式
适配器中同时包含对目标类和适配者类的引用,适配者可调用目标类中的方法,目标类可调用适配者类的方法
class Adapter:Target,Adaptee
{
private Target target; //维持一个对抽象目标类的引用
private Adaptee adaptee; //维持一个对适配者对象的引用
public Adapter(Target target)
{
this.target = target;
}
public Adapter(Adaptee adaptee)
{
this.adaptee = adaptee;
}
public void Request()
{
adaptee.SpecificRequest();
}
public void SpecificRequest()
{
target.Request();
}
}