定义是什么?
将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类能一起工作。适配器模式分为类结构型模式和对象结构型模式两种,前者类之间的耦合度比后者高,且要求程序员了解现有组件库中的相关组件的内部结构,所以应用相对较少些。
优点
该模式的主要优点如下。
● 客户端通过适配器可以透明地调用目标接口。
● 复用了现存的类,程序员不需要修改原有代码而重用现有的适配者类。
● 将目标类和适配者类解耦,解决了目标类和适配者类接口不一致的问题。
● 在很多业务场景中符合开闭原则。
构成
适配器模式(Adapter)包含以下主要角色。
- 目标(Target)接口:当前系统业务所期待的接口,它可以是抽象类或接口。
- 适配者(Adaptee)类:它是被访问和适配的现存组件库中的组件接口。
- 适配器(Adapter)类:它是一个转换器,通过继承或引用适配者的对象,把适配者接口转换成目标接口,让客户按目标接口的格式访问适配者。
结构图
类适配器模式的结构图如图 1 所示。
图1 类适配器模式的结构图
对象适配器模式的结构图如图 2 所示。
图2 对象适配器模式的结构图
代码
类适配器写法
static void Main(string[] args)
{
Console.WriteLine("类适配器模式测试");
Target target = new ClassAdapter();
target.request();
}
//目标接口
interface Target
{
public void request();
}
//适配器接口
class Adaptee
{
public void specificRequest()
{
Console.WriteLine("适配者中的业务代码被调用");
}
}
//继承类实现接口 然后再重写接口方法的时候调用咱们继承的方法
class ClassAdapter : Adaptee, Target
{
public void request()
{
specificRequest();
}
}
对象适配器
static void Main(string[] args)
{
Console.WriteLine("对象适配器模式测试:");
Adaptee adaptee = new Adaptee();
Target target = new ObjectAdapter(adaptee);
target.request();
}
interface Target
{
public void request();
}
//适配器接口
class Adaptee
{
public void specificRequest()
{
Console.WriteLine("适配者中的业务代码被调用");
}
}
class ObjectAdapter : Target
{
private Adaptee adaptee;
public ObjectAdapter(Adaptee adaptee)
{
this.adaptee = adaptee;
}
//实现接口
public void request()
{
adaptee.specificRequest();
}
}
、
总结:
适配器模式是一种结构型设计模式,它允许将一个类的接口转换成客户端所期望的另一个接口,从而使不兼容的接口能够协同工作。适配器模式在系统中起到“适配”两个不兼容接口之间的作用。以下是适配器模式的特点、优点、缺点以及其他维度的讨论:
特点:
接口转换: 适配器模式通过一个适配器类,将一个类的接口转换成另一个类的接口,以满足客户端的需求。
解耦: 适配器模式可以将客户端和被适配对象解耦,使它们可以独立演化,而不会相互影响。
兼容性提升: 适配器模式可以帮助现有的类与新的接口进行兼容,从而提升代码的重用性和可维护性。
优点:
接口兼容性: 适配器模式使得原本不兼容的接口能够协同工作,使得客户端可以无缝地使用新的接口。
重用性: 适配器模式可以将现有的类和组件进行重用,无需对其进行修改。
灵活性: 适配器模式允许您在已存在的类中添加适配器,从而在不影响现有代码的情况下引入新的功能。
缺点:
过多的适配器: 如果系统中存在大量不兼容的接口,可能会导致大量的适配器类,增加了代码的复杂性。
增加复杂性: 适配器模式引入了一个额外的层次,可能会增加系统的复杂性。
其他维度的点:
适用场景: 适配器模式适用于需要在不同接口间进行转换的场景,如系统升级或集成外部库时。
与桥接模式的区别: 适配器模式用于转换一个接口,使其能够与另一个接口兼容;而桥接模式用于将抽象部分和实现部分分离,以便独立变化。
适配器和装饰器的区别: 适配器模式着重于接口转换,使两个不同接口能够一起工作;而装饰器模式着重于动态地为对象添加功能,而不改变其接口。
对象适配器和类适配器: 对象适配器使用组合关系将适配器对象嵌入到被适配类中,而类适配器使用多重继承来适配接口。对象适配器更加灵活,避免了类适配器可能引起的类层次结构限制。
总之,适配器模式在处理不兼容的接口时具有重要作用。它通过适配器类,允许客户端与不同接口的类进行交互,从而增强了系统的灵活性和可维护性。在需要集成或协同使用不同接口的情况下,适配器模式可以为您提供一种有效的解决方案。
当涉及到适配器模式时,还有一些补充的信息可以帮助您更好地理解和应用该模式:
双向适配器: 在某些情况下,您可能需要双向适配器,即适配器可以将两个不兼容的接口互相转换。这在需要双向通信的场景中很有用。
适配器和中介者模式的区别: 适配器模式用于转换不兼容的接口,而中介者模式用于协调多个对象之间的交互,从而减少对象之间的耦合。
接口适配器: 有时,您可能不需要为所有方法都创建适配器。接口适配器模式允许您创建一个中间抽象类,它实现了目标接口的所有方法,然后您只需继承这个中间类并实现您所需要的方法。
使用现有类库: 适配器模式对于在不修改现有类库的情况下与其进行集成非常有用。例如,如果您使用第三方库中的类,而这些类的接口不适用于您的应用,您可以创建适配器来进行转换。
适配器的灵活性: 适配器模式可以提供一种扩展现有类的方式,使其具有额外的功能。适配器可以包含一些附加逻辑,而不仅仅是接口的转换。
适配器和单一职责原则: 在设计适配器时,尽量遵循单一职责原则,确保适配器只关注于接口转换,而不添加不相关的功能。
使用场景: 适配器模式适用于以下情况:a) 当您需要将一个类的接口转换成另一个类的接口时;b) 当您需要集成不兼容的类或接口时;c) 当您想要重用一些现有的类而无需修改其代码时。
总之,适配器模式是一个重要的设计模式,可以在处理不兼容的接口、集成外部类库以及提升代码的重用性和灵活性时发挥重要作用。了解适配器模式的应用场景和原则可以帮助您在设计和开发中做出更好的决策。