适配器模式目录
一、适配器模式的定义与类型
- 一、适配器模式的定义与类型
- 二、适配器模式的适用场景
- 三、适配器模式的优点
- 四、适配器模式的缺点
- 五、适配器模式的扩展
- 六、适配器模式相关的设计模式
- 七、类适配器示例
- 八、对象适配器示例
- 九、适配器模式具体实例演示
1、定义
- 将一个类的接口转换成客户期望的另一个接口
- 使原本接口不兼容的类可以一起工作
2、类型
- 结构型
- 已经存在的类,它的方法和需求不匹配时(方法结果相同或相似)
- 不是软件设计阶段考虑的设计模式,是随着软件维护,由于不同产品,不同厂家造成功能类似而接口不相同情况下的解决方案
- 能提高类的透明性和复用,现有的类复用但不需要改变
- 目标类和适配器类解耦,提高程序扩展性
- 符合开闭原则
- 适配器编写过程需要全面考虑,可能会增加系统的复杂性
- 增加系统代码可读的难度
1、对象适配器
- 通过直接关联,或者委托机制实现。
2、类适配器
- 通过类继承实现
- 适配器模式和外观模式
1、代码如下:
// 创建一个被适配者类,已存在的、具有特殊功能、但不符合我们既有的标准接口的类
public class ByAdaptee {
public void byAdapteeMethod(){
System.out.println("被适配类方法 具有特殊功能...");
}
}
//创建一个目标接口,或称为标准接口
public interface Target {
public void method();
}
//创建一个目标的实现类,只提供普通功能
public class TargetImpl implements Target{
@Override
public void method() {
System.out.println("目标的实现类方法,具有普通功能...");
}
}
//创建一个适配者类,继承被适配者类并且实现目标接口
public class Adaptee extends ByAdaptee implements Target {
//适配者类通过调用父类(ByAdaptee)的被适配者类的方法,从而实现了目标类(Target)
@Override
public void method() {
super.byAdapteeMethod();
}
}
//类适配器模式的测试类,类适配器模式强调的是继承,通过继承获取被适配者的方法
public class Test {
public static void main(String[] args) {
/**
* 直接调用目标类的具体实现类的方法,使用普通功能类
*/
Target target = new TargetImpl();
target.method();
/**
* 因为适配器类(Adaptee)实现类目标类(Target),
* 所以目标类(Target)的具体实现,通过适配器类(Adaptee)移交给了被适配者类(ByAdaptee)
*/
Target target1 = new Adaptee();
target1.method();
}
}
2、输出结果如下:
3、类图如下:
1、代码如下:
//创建一个被适配者类,已存在的、具有特殊功能、但不符合我们既有的标准接口的类
public class ByAdaptee {
public void byAdapteeMethod(){
System.out.println("被适配类方法 具有特殊功能...");
}
}
//创建一个目标接口,或称为标准接口
public interface Target {
public void method();
}
//创建一个目标的实现类,只提供普通功能
public class TargetImpl implements Target{
@Override
public void method() {
System.out.println("目标的实现类方法,具有普通功能...");
}
}
//创建一个适配者类,实现目标接口
public class Adaptee implements Target{
/**
* 因为没有继承,无法调用父类被适配者类(ByAdaptee)的方法
* 把被适配者类(ByAdaptee)组合到适配者类(Adaptee)中,即直接关联的方式或委托机制的方式
*/
private ByAdaptee byAdaptee=new ByAdaptee();
@Override
public void method() {
byAdaptee.byAdapteeMethod();
}
}
package com.rf.designPatterns.structural.adapter.objectAdapter;
//对象适配器模式的测试类,对象适配器模式强调的是组合,通过组合获取被适配者的方法
public class Test {
public static void main(String[] args) {
/**
* 直接调用目标类的具体实现类的方法
*/
Target target = new TargetImpl();
target.method();
/**
* 因为适配器类(Adaptee)实现类目标类(Target),
* 所以目标类(Target)的具体实现,通过适配器类(Adaptee)移交给了被适配者(ByAdaptee)
*/
Target target1 = new Adaptee();
target1.method();
}
}
2、输出结果如下:
3、类图如下:
实例描述:把220V交流电通过适配器转换成5V的直流电
1、代码如下:
// 创建被适配者 220伏交流电类
public class AC220 {
public int outputAC220(){
int output=220;
System.out.println("输出交流电"+output+"V");
return output;
}
}
//创建目标类 5伏直流电接口
public interface DC5 {
//输出5伏直流电方法
public int outputDC5();
}
//创建电源适配器类
public class PowerAdapter implements DC5{
private AC220 ac220=new AC220();
@Override
public int outputDC5() {
//获取输入的220伏交流电
int adapterInput =ac220.outputAC220();
//模拟变压器逻辑
int adapterOutput=adapterInput/44;
System.out.println("通过电源适配器(PowerAdapter)类输入交流电:"+adapterInput+"V,"+"输出直流电:"+adapterOutput+"V");
return adapterOutput;
}
}
//测试类
public class Test {
public static void main(String[] args) {
DC5 dc5 = new PowerAdapter();
dc5.outputDC5();
}
}
2、输出结果如下: 3、类图如下: