设计模式之适配器模式

来源:互联网 发布:自由贸易的利弊 知乎 编辑:程序博客网 时间:2024/06/16 13:04

作用:将一个类的接口转换成客户希望的另一个接口,使原本由于接口不兼容而不能一起工作的类可以一起工作。

举例:生活中电源插板就是一个很好说明适配器模式作用的例子,我经常需要把三相插座转换成二相插座,这时就可以通过一个带有三相插头的插板接到三相插座上,插板有二相插座,这样就可以将一个三相插座转换成一个二相插座,这里的插板就是适配器;旧式的台式电脑没有USB接口,只有一个PS2接口,这时可以通过一个PS2转USB的适配器将PS2接口适配为USB接口便于鼠标、键盘等使用。

适配器分类:

a)类适配器:继承的方式使用源


b)对象适配器:委托的方式使用源


优先选择使用对象适配器,因为面向对象的设计的原则是优先使用对象,而非继承。

c)双向适配器:同时实现了源接口和目标接口的适配器,在客户端方可以把双向适配器当作转换后的目标接口使用,而在源系统方可以把双向适配器当做实现了源接口的类使用。

类适配器天生就是双向适配器,因为类适配器继承了原系统中的源类,而源类实现了源类接口,所有类适配器即实现了源类接口有实现了目标接口;而对象适配器只实现了目标接口,因此不是双向适配器。

适用范围:系统需要使用现在的类,而此类的接口不符合系统需求,可以通过适配器解决。

代码:(手机充电器样例)

package com.adapter;/** * 源所实现的接口 */public interface NormalCharger {public void charger();}/* * 一个源接口的实现 */public class Cellphone implements NormalCharger{private String voltage=null;private String electricity=null;public Cellphone() {// TODO Auto-generated constructor stub//生活中的正常的电压和电流this.voltage="220V";this.electricity="10A";}@Overridepublic void charger() {// TODO Auto-generated method stubif(this.voltage.equals("5V")&&this.electricity.equals("500mA")){System.out.println("手机可以正常充电!");}else{System.out.println("电压或者电流过大,小心手机要充爆炸了哦!");}}public String getVoltage() {return voltage;}public void setVoltage(String voltage) {this.voltage = voltage;}public String getElectricity() {return electricity;}public void setElectricity(String electricity) {this.electricity = electricity;}}/* * 目标接口 */public interface PhoneCharger {public void charger();}/** * 对象适配器,可以将普通电压电流转换成手机充电器所需要的电压电流 */public class ChargerAdapter implements PhoneCharger{private Cellphone cp=null;//委托对象//构造方法传入一个源对象public ChargerAdapter(Cellphone cp){this.cp=cp;}//目标接口的方法实现@Overridepublic void charger() {// TODO Auto-generated method stub//手机充电所需要的电压和电流cp.setElectricity("500mA");cp.setVoltage("5V");cp.charger();}}/** * 客户端 */public class Client1 {public static void main(String[] args) {// TODO Auto-generated method stubPhoneCharger pc=new ChargerAdapter(new Cellphone());pc.charger();}}



0 0
原创粉丝点击