Java 设计模式之适配器学习与掌握
Posted 邹奇
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java 设计模式之适配器学习与掌握相关的知识,希望对你有一定的参考价值。
定义与特点
- 将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类能一起工作。
适配器模式分为类结构型模式和对象结构型模式两种,前者类之间的耦合度比后者高
优点
- 在很多业务场景中符合开闭原则。
- 客户端通过适配器可以透明地调用目标接口。
- 复用了现存的类,程序员不需要修改原有代码而重用现有的适配者类。
- 将目标类和适配者类解耦,解决了目标类和适配者类接口不一致的问题。
缺点
- 适配器编写过程需要结合业务场景全面考虑,可能会增加系统的复杂性。
- 增加代码阅读难度,降低代码可读性,过多使用适配器会使系统代码变得凌乱。
模式的结构与实现
模式的结构
适配器模式(Adapter
)包含以下主要角色:
- 目标(
Target
)接口:当前系统业务所期待的接口,它可以是抽象类或接口。 - 适配者(
Adaptee
)类:它是被访问和适配的现存组件库中的组件接口。 - 适配器(
Adapter
)类:它是一个转换器,通过继承或引用适配者的对象,把适配者接口转换成目标接口,让客户按目标接口的格式访问适配者。
类适配器模式实现
目标接口,如下:
package com.example.designmodedemo.principle.adapter;
/**
* 目标接口
*/
public interface Target {
void show();
}
适配者,如下:
package com.example.designmodedemo.principle.adapter;
/**
* 适配者
*/
public class MyAdaptee {
public void doBusiness(){
System.out.println(":> 适配者业务调用");
}
}
类适配器类,如下:
package com.example.designmodedemo.principle.adapter;
/**
* 类适配器类
*/
public class ClassAdapter extends MyAdaptee implements Target{
@Override
public void show() {
doBusiness();
}
}
客户端,调用如下:
Target target = new ClassAdapter();
target.show();
对象适配器模式实现
这里的目标接口和适配者类同类适配器的一样,这里不再给出。
对象适配器,如下:
package com.example.designmodedemo.principle.adapter;
/**
* 对象适配类
*/
public class ObjectAdapter implements Target{
private MyAdaptee adapter;
public ObjectAdapter(MyAdaptee adapter) {
this.adapter = adapter;
}
@Override
public void show() {
if (adapter != null){
adapter.doBusiness();
}
}
}
客户端,调用代码如下:
Adaptee adaptee = new Adaptee();
Target target = new ObjectAdapter(adaptee);
target.show();
模式应用场景
适配器模式(Adapter
)通常适用于以下场景:
- 使用第三方提供的组件,但组件接口定义和自己要求的接口定义不同。
- 以前开发的系统存在满足新系统功能需求的类,但其接口同新系统的接口不一致。
模式的扩展
- 适配器模式(Adapter)可扩展为双向适配器模式,双向适配器类既可以把适配者接口转换成目标接口,也可以把目标接口转换成适配者接口。
代码如下:
package com.example.designmodedemo.principle.adapter;
/**
* 双向适配器模式
*/
public class Both {
// 目标者接口
public interface Target{
void targetBusiness();
}
// 适配者接口
public interface Adaptee{
void adapteeBusiness();
}
// 目标实现
public static class TargetIml implements Target{
@Override
public void targetBusiness() {
System.out.println(":> 目标代码调用");
}
}
// 适配者实现
public static class AdapteeIml implements Adaptee{
@Override
public void adapteeBusiness() {
System.out.println(":> 适配者代码调用");
}
}
// 双向适配器
public static class BothAdapter implements Target, Adaptee{
private Target target;
private Adaptee adaptee;
public BothAdapter(Target target) {
this.target = target;
}
public BothAdapter(Adaptee adaptee) {
this.adaptee = adaptee;
}
@Override
public void targetBusiness() {
if (adaptee != null){
adaptee.adapteeBusiness();
}
}
@Override
public void adapteeBusiness() {
if (target != null){
target.targetBusiness();
}
}
}
}
客户端,调用代码如下:
// 目标通过双向适配器访问适配者
Both.Adaptee adaptee = new Both.AdapteeIml();
Both.BothAdapter target = new Both.BothAdapter(adaptee);
target.targetBusiness();
// 适配者通过双向适配器访问目标
Both.Target target1 = new Both.TargetIml();
Both.BothAdapter adaptee1 = new Both.BothAdapter(target1);
adaptee1.adapteeBusiness();
技术永不眠!我们下期见!
以上是关于Java 设计模式之适配器学习与掌握的主要内容,如果未能解决你的问题,请参考以下文章