适配器模式(包含对象适配器,类适配器)
定义:
将一个类的接口转换成客户期望的另一个接口
特点:
使原本接口不兼容的类可以一起工作
类型 : 结构型
适用场景
- 已存在的类,它的方法和需求不匹配时(结果相同或者相似)
- 非软件设计阶段考虑的设计模式,而是随着软件维护,由于不同产品、不同厂家造成功能类似而接口不同情况下的解决方案。
优点
- 能够提高类的透明性和复用,现有的类可以复用并且不需要改变。解决了现有类和目标类不匹配的问题。
- 目标类和适配器类
- 符合开闭原则(只需要扩展适配器的类,原有的类不需要改变 )
缺点
- 需要对过程全面考虑,因为是亡羊补牢的做法,因此对认知程度要求比较高。并且可能会增加系统的复杂性
- 系统代码的可读性会降低。比如我调用的是第一个,但是后面被适配成了第二个。
相关设计模式
- 适配器 和 外观模式
都是对现有的类进行封装。外观模式是定义一个新的接口,而适配器则是复用一个原有的接口。适配器是两个已有的接口协同工作,而外观
则是在现有的系统中提供一个更为方便的访问入口。如果强行将外观模式也称为适配器模式的话,外观模式强调的是适配整个子系统,也就
说外观所针对的力度更大。 - 装饰者 和 适配器
类适配器
/**
* 被适配者
* @author jiahaowei
*/
public class Adaptee {
public void adapterRequest() {
System.out.println("被适配者的方法");
}
}
/**
* 适配者
* @author jiahaowei
*/
public class Adapter extends Adaptee implements Target {
@Override
public void request() {
//增加逻辑代码
super.adapterRequest();
//增加逻辑代码
}
}
//目标
public interface Target {
void request();
}
//具体修改的目标
public class ConcreteTarget implements Target {
@Override
public void request() {
System.out.println("ConcreteTarget的目标方法");
}
}
对应的uml类图
对象适配器
通过上面的代码可以看出来比较适配器模式比较简单,我认为比之前的设计模式容易理解。对象适也只是把继承换成了对象的声明。
/**
* 被适配者
* @author jiahaowei
*/
public class Adaptee {
public void adapterRequest() {
System.out.println("被适配者的方法");
}
}
public class Adapter implements Target {
private Adaptee adaptee = new Adaptee();
@Override
public void request() {
//增加逻辑代码
adaptee.adapterRequest();
//增加逻辑代码
}
}
public class ConcreteTarget implements Target {
@Override
public void request() {
System.out.println("ConcreteTarget的目标方法");
}
}
public interface Target {
void request();
}
对应的uml类图
下面举例一个生活中的简单例子,220v交流点变为5v直流电。
public class AC220 {
public int outputAC220V() {
int output = 220;
System.out.println("输出交流电" + output + "V");
return output;
}
}
public interface DC5 {
int outputD5V();
}
public class PowerAdapter implements DC5 {
private AC220 ac220 = new AC220();
@Override
public int outputD5V() {
int adapterInput = ac220.outputAC220V();
//变压器 ***
//为了方便直接除44
int adapterOutput = adapterInput / 44;
System.out.println("使用powerrAdapter输入AC:" + adapterInput + "v" + "输出Dc:" + adapterOutput + "v");
return adapterOutput;
}
}
public class test {
public static void main(String[] args) {
DC5 dc5 = new PowerAdapter();
dc5.outputD5V();
}
}
//输出
输出交流电220V
使用powerrAdapter输入AC220v输出Dc:5v
点击查看更多内容
为 TA 点赞
评论
共同学习,写下你的评论
评论加载中...
作者其他优质文章
正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦