适配器模式(结构型)
Posted 无名小厨
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了适配器模式(结构型)相关的知识,希望对你有一定的参考价值。
适配器模式:将一个类的方法接口转换成客户希望的另一个接口
它主要包括以下角色:
目标接口(Target):定义满足目前系统需求的接口,可以是抽象类或者接口。
适配器类(Adapter):实现目标抽象类或者接口和适配者类之间的转换。
适配者类(Adaptee):与目前系统需求不兼容的类,需要被适配的类。
客户类(Client):调用目标接口。
1、优点
- 可以让任何两个没有关联的类一起运行;
- 增加了类的透明性;
- 提高了类的复用度;
- 灵活性非常好;
2、缺点 - 过多使用适配器会使系统非常凌乱;
- 由于java是单继承的,所以只能适配一个适配器类,而且目标类必须是抽象的;
- 只有碰到无法改变原有设计和代码的情况下,才会考虑适配器模式;
适配器模式的使用场景
1、系统需要使用现有的类,从而类的接口不符合系统的需要。
2、想建立一个可以重复使用的类,用于一些彼此之间没有太大关联的一些类。
3、通过接口转换,将一个类插入另一个类中。
示例:
目标接口(Target):
public interface InterfaceSata
String installInterfaceSata();
适配器类(Adapter):
public class InterfaceAdapter extends HardDiskM2 implements InterfaceSata
public String installInterfaceSata()
String m2 = super.installInterfaceM2();
// 进行m2接口转换sata接口逻辑
// ......
return "sata";
适配者类(Adaptee):
public class HardDiskM2
public String installInterfaceM2()
System.out.println("m2硬盘安装接口是m2");
return "m2";
客户类(Client):
public class Client
public static void main(String[] args)
InterfaceSata interfaceSata = new InterfaceAdapter();
interfaceSata.installInterfaceSata();
设计模式 适配器模式
结构型模式
适配器模式
类适配器和对象适配器
结构型模式
结构型模式的重点在于如何通过灵活的体系组织不同的对象,并在此基础上完成更为复杂的类型(或者类型系统),而参与组合的各类型之间始终保持尽量松散的结构关系。
结构型模式包括以下几种:
适配器模式
桥接模式
组合模式
装饰模式
外观模式
享元模式
代理模式
适配器模式
GOF对适配器模式的描述为:
Specify the kinds of objects to create using a prototypical instance, and create new objects by copying this prototype..
— Design Patterns : Elements of Reusable Object-Oriented Software
使用适配器模式主要有两个方面的目的:
旧接口在新的环境下不兼容时,借助适配器模式完成从旧接口到新接口的转换。
将“既有系统”进行封装,逻辑上客户程序不知道“既有系统”的存在,将变化隔离在Adapter部分。如果客户程序需要迁移,仅需要在Adapter部分做修改。
类适配器和对象适配器
适配器的实现一般有两种方式:
类适配器,通过继承让适配器类具有既有类型的特点,同时也可以根据客户程序的需要,满足新接口的需要
对象适配器,在适配器里保存一个既有类型的引用,它自身按照客户程序的要求,实现新接口。
定义ITarget和Adaptee
public interface ITarget
{
void Request();
}
public class Adaptee
{
public void SpecifiedRequest() { }
}
类适配器
public class ObjectAdapter : Adaptee, ITarget
{
public void Request()
{
//其他处理
//...
base.SpecifiedRequest();
//...
}
}
对象适配器
public class ClassAdapter : ITarget
{
private Adaptee adaptee;
public void Request()
{
//其他处理
//...
adaptee.SpecifiedRequest();
//...
}
}
两者的区别有:
类适配器 | 对象适配器 |
---|---|
基于继承概念 | 基于对象组合的思路 |
适配器之前不能继承自其他类、 Target只能是接口形式的ITarget | Target可能是ITarget(接口), TargetRase(抽象类),甚至是实体类,只要Adapter满足不继承两个或两个以上类的限制即可 |
可以覆盖 Adaptee的某些方法 | 无法覆盖 Adaptee的方法 |
虽然不可以适配子类,但可以通过覆盖修改某些方法,部分情况下可以达到配子类同样的效果 | 不仅可以适配 Adaptee,还可以适配 Adaptee的任何子类 |
类适配器和对象适配器最大的区别在于对既有类型的使用上,在扩展新功能的时候,前者使用了继承,后者使用组合的方式。对象适配器相对而言是被推荐的方式,因为使用组合带来的耦合往往比继承更松散。
对象适配器的UML类图为:
所以适配器模式主要包括三个角色:
Target(ITarget):调用端所期待的接口;
Adaptee:需要被适配的类型;
Adapter:适配器,完成从Adaptee到Target的转换。
适配器模式是一种相对简单,而且使用广泛的模式,在需要实现接口间的兼容、隔离变化的时候,是一种很好的选择。
参考书籍:
王翔著 《设计模式——基于C#的工程化实现及扩展》
以上是关于适配器模式(结构型)的主要内容,如果未能解决你的问题,请参考以下文章