适配器模式详解
来源:互联网 发布:数据泄漏 编辑:程序博客网 时间:2024/05/17 02:14
定义: 将一个类的接口,转换成客户期望的另一个接口。适配器让原本不兼容的类可以合作无间。
模式的角色:
- 目标接口(Target):客户所期待的接口。目标可以是具体的或抽象的类,也可以是接口。
- 需要适配的类(Adaptee):需要适配的类或适配者类。
- 适配器(Adapter):通过包装一个需要适配的对象,把元接口转换成目标接口。
实现方式
1. 类的适配器模式(采用继承实现)
- UML
- 使用对象集成的方式,是静态的定义方式;
- 由于适配器直接继承了Adaptee,使得适配器不能和Adaptee的子类一起工作,因为继承是静态的关系,当适配器继承了Adaptee后,就不可能再去处理Adaptee的子类了。
- 适配器可以重定义Adaptee的部分行为,相当于子类覆盖父类的部分实现方法。
- 仅仅引入了一个对象,并不需要额外的引用来间接得到Adaptee。
2. 对象适配器模式(采用对象组合方式实)
- UML
- 使用对象组合的方式,是动态组合的方式。
- 一个适配器可以把多种不同的源适配到同一个目标。换言之,同一个适配器可以把源类和它的子类都适配到目标接口。因为对象适配器采用的是对象组合的关系,只要对象类型正确,是不是子类都无所谓。
- 要重定义Adaptee的行为比较困难,这种情况下,需要定义Adaptee的子类来实现重定义,然后让适配器组合子类。虽然重定义Adaptee的行为比较困难,但是想要增加一些新的行为则方便的很,而且新增加的行为可同时适用于所有的源。
- 需要额外的引用来间接得到Adaptee。
代码: 这里给出的是对象适配器的java代码
Cient 类最终面对的是 Target 接口(或抽象类),它只能够使用符合这一目标标准的子类;而 Adaptee 类则是被适配的对象(也称 源角色),因为它包含specific (特殊的)操作、功能等,所以我们想要在自己的系统中使用它,将其转换成符合我们标准的类,使得 Client 类可以在透明的情况下任意选择使用 ConcreteTarget 类或是具有特殊功能的 Adatee 类。
// 目标接口,或称为标准接口public interface Target { public void request();}// 具体目标类,只提供普通功能public class ConcreteTarget implements Target { @Override public void request() { System.out.println("普通类具有普通功能"); }}// 已存在的、具有特殊功能、但不符合我们既有的标准接口的类public class Adaptee { public void specificRequest(){ System.out.println("被适配类具有特殊功能"); }}// 适配器类,直接关联被适配类,同时实现标准接口public class Adapter implements Target { // 直接关联被适配类 private Adaptee adaptee; // 可以通过构造函数传入具体需要适配的被适配类对象 public Adapter(Adaptee adaptee){ this.adaptee = adaptee; } @Override public void request() { // 这里是使用委托的方式完成特殊功能 adaptee.specificRequest(); }}public class Client { public static void main(String[] args) { // 使用普通功能类 Target concreteTarget = new ConcreteTarget(); concreteTarget.request(); // 使用特殊功能类,即适配类, // 需要先创建一个被适配类的对象作为参数 Target adapter = new Adapter(new Adaptee()); adapter.request(); }}
类适配器
类适配器用的多继承的方式,Adapter继承Adaptee,也实现了 Target 接口(因为 Java 不支持多继承,所以这样来实现)
// 适配器类,继承了被适配类,同时实现标准接口class Adapter extends Adaptee implements Target{ public void request() { super.specificRequest(); }}public class Client { public static void main(String[] args) { // 使用普通功能类 Target concreteTarget = new ConcreteTarget(); concreteTarget.request(); // 使用特殊功能类,即适配类 Target adapter = new Adapter(); adapter.request(); }}
- 适配器模式详解
- 适配器模式 详解
- 适配器模式详解
- 适配器模式详解
- 适配器模式详解
- 适配器模式详解
- (八)适配器模式详解
- (八)适配器模式详解
- (八)适配器模式详解
- (八)适配器模式详解
- (八)适配器模式详解
- (八)适配器模式详解
- 设计模式详解之适配器模式
- 设计模式 - 适配器模式(adapter pattern) 详解
- 设计模式——适配器模式详解
- 详解设计模式——适配器模式
- 设计模式详解——适配器模式
- 设计模式(八)适配器模式详解
- 云时代大数据管理引擎HAWQ++
- 备忘录模式
- php获取当前月份的第一天与最后一天
- 驼峰式大小写
- 腾讯云服务器配置LNMP环境并安装wordpress
- 适配器模式详解
- mac下递归创建ctags报错: "illegal option -- R"
- mesos cpu configuration
- 31. Next Permutation
- HashMap
- Java继承中子类与父类的关系
- 根据class不能获取到类上的注解
- webstorm快捷键
- 破解微信本地数据库,无法找回删除的聊天记录