期刊网站源码,昌邑网站建设公司,seo接单一个月能赚多少钱,阳泉市建设局网站文章目录 基本介绍一、类的适配器二、对象适配器三、接口适配器总结 基本介绍
生活中有很多例子#xff1a;
不同国家的插座接口不同#xff0c;需要转换器#xff1b;家用电源220V#xff0c;手机只接受5V充电#xff0c;需要转换器#xff1b;读卡器#xff0c;拓展… 文章目录 基本介绍一、类的适配器二、对象适配器三、接口适配器总结 基本介绍
生活中有很多例子
不同国家的插座接口不同需要转换器家用电源220V手机只接受5V充电需要转换器读卡器拓展坞。。。 定义
适配器模式的主要作用是将一个类的接口转换成客户希望的另外一个接口使得原本由于接口不兼容而不能一起工作的那些类能一起工作。
适配器模式分为类适配器模式和对象适配器模式前者类之间的耦合度比后者高且要求程序员了解现有组件库中的相关组件的内部结构所以应用相对较少些。
结构
适配器模式Adapter包含以下主要角色
目标Target接口 当前系统业务所期待的接口它可以是抽象类或接口适配者Adaptee类 它是被访问和适配的现存组件库中的组件接口适配器Adapter类 它是一个转换器通过继承或引用适配者的对象把适配者接口转换成目标接口让客户按目标接口的格式访问适配者。 一、类的适配器
实现方式定义一个适配器类来实现当前系统的业务接口同时又继承现有组件库中已经存在的组件。
【例】手机充电器
家用电源220V手机只接受5V充电要想给手机充电我们得需要一个转换器。 家用电源【适配者类】
public class Voltage220V {public Integer output22V() {return 220;}
}目标接口
//充电器接口
public interface IVoltage5V {Integer output5V();
}//给个实现类
public class Voltage5V implements IVoltage5V {Overridepublic Integer output5V() {return 5;}
}适配器类
public class VoltageAdapter extends Voltage220V implements IVoltage5V {Overridepublic Integer output5V() {return 5;}
}手机类
public class Phone {public void charging(IVoltage5V iVoltage5V) {if(iVoltage5V.output5V() 5) {System.out.println(电压5V, 正在充电。。。);} else {System.out.println(只能使用5V电压充电。。。);}}
}测试
public class Client {public static void main(String[] args) {Phone phone new Phone();System.out.println(直接使用5V电源充电);phone.charging(new Voltage5V());System.out.println(使用类适配器充电);phone.charging(new VoltageAdapter());}
}小结
Java 是单继承机制所以类适配器需要继承src一个缺点因为这要求dst必须是接口有一定局限性src类的方法在 Adapter 中都会暴露出来也增加了使用的成本由于其继承了 src 类所以它可以根据需求重写 src 类的方法使得 Adapter 的灵活性增强了。 二、对象适配器
对象适配器模式可釆用将现有组件库中已经实现的组件引入适配器类中该类同时实现当前系统的业务接口基本思路和类的适配器模式相同只是将 Adapter 类作修改不是继承 src 类而是持有 src 类的实例以解兼容性的问题。 即:持有 src 类实现 dst 类接口完成 src - dst 的适配根据“合成复用原则”在系统中尽量使用关联关系(聚合)来替代继承关系对象适配器模式是适配器模式常用的一种。
使用对象适配器将上述案例做以修改后UML类图为 家用电源【适配者类】
public class Voltage220V {public Integer output220V() {return 220;}
}目标接口
public interface IVoltage5V {Integer output5V();
}public class Voltage5V implements IVoltage5V {Overridepublic Integer output5V() {return 5;}
}适配器类
public class VoltageAdapter implements IVoltage5V {private Voltage220V voltage220V;public VoltageAdapter(Voltage220V voltage220V) {this.voltage220V voltage220V;}Overridepublic Integer output5V() {//适配规则Integer v220 voltage220V.output220V();return v220 / 44;}
}public class Phone {public void charging(IVoltage5V iVoltage5V) {System.out.println(正在充电, 电压 iVoltage5V.output5V() V);}
}测试
public class Demo2 {public static void main(String[] args) {Phone phone new Phone();System.out.println(直接使用5V电源充电);phone.charging(new Voltage5V());System.out.println(使用对象适配器充电);phone.charging(new VoltageAdapter(new Voltage220V()));}
}对象适配器和类适配器其实算是同一种思想只不过实现方式不同。根据合成复用原则使用组合替代继承所以它解决了类适配器必须继承src的局限性问题也不再要求 dst必须是接口使用成本更低更灵活。 三、接口适配器
适配器又叫缺省适配器模式核心思路:当不需要全部实现接口提供的方法时可先设计一个抽象类实现接口并为该接口中每个方法提供一个默认实现(空方法)那么该抽象类的子类可有选择地覆盖父类的某些方法来实现需求适用于一个接口不想使用其所有的方法的情况。 总结
结构
类适配器以类给到适配器在 Adapter 里就是将 src 当做类继承对象适配器以对象给到适配器在 Adapter 里将 src 作为一个对象持有接口适配器以接口给到适配器在 Adapter 里将 src 作为一个接口实现。
优点 适配器模式最大的作用还是将原本不兼容的接口融合在一起工作 将目标类和适配者类解耦通过引入一个适配器类来重用现有的适配者类无须修改原有结构 增加了类的透明性和复用性将具体的业务实现过程封装在适配者类中对于客户端类而言是透明的而且提高了适配者的复用性同一个适配者类可以在多个不同的系统中复用 灵活性和扩展性都非常好通过使用配置文件可以很方便地更换适配器也可以在不修改原有代码的基础上增加新的适配器类完全符合“开闭原则” 对象适配器避免了但继承的缺点可以把多个不同的适配者适配到同一个目标。