重学java23种设计模式(6)适配器模式

跟着《软件秘笈---设计模式那点事》学习


定义:

适配器模式(Adapter Pattern),把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法一起工作的两个类能够在一起工作。

(1)对象适配器模式

(2)类适配器模式


角色:

(1)目标接口(Target):客户所期待的接口。目标可以是具体类抽象类,也可以是接口

(2)需要适配的类(Adaptee):

(3)适配器,通过包装一个需要适配的对象,把原接口转换目标接口。


类图:

重学java23种设计模式(6)适配器模式_第1张图片


实例:

/**
 * 抽象电源基类
 */
public abstract class AbsBasePower {
	// 电压值
	private double power;
	// 单位
	private String unit = "V";
	public AbsBasePower(double power) {
		this.power = power;
	}
	public double getPower() {
		return power;
	}
	public void setPower(double power) {
		this.power = power;
	}
	public String getUnit() {
		return unit;
	}
	public void setUnit(String unit) {
		this.unit = unit;
	}

}

/*
 * 220V电源接口
 * */
public interface IPower220 {
	// 220V交流电打印
	public void output220v();
}

/**
 * 220V电源
 */
public class Power220 extends AbsBasePower  implements IPower220 {

	public Power220() {
		super(220);
	}

	/* 
	 * 220V输出
	 */
	@Override
	public void output220v() {
		System.out.println("----这是["  + this.getPower() + this.getUnit() + "]电源。。。。");
	}

}

/*
 * 12V电源接口
 * */
public interface IPower12 {
	// 12V交流电打印
	public void output12v();
}

/**
 * 12V电源
 */
public class Power12 extends AbsBasePower  implements IPower12 {

	public Power12() {
		super(12);
	}

	/* 
	 * 220V输出
	 */
	@Override
	public void output12v() {
		System.out.println("----这是["  + this.getPower() + this.getUnit() + "]电源。。。。");
	}

}

客户端

public class Client {

	public static void main(String[] args) {
		//首先生成一个220V对象
		Power220 power220 = new Power220();
		power220.output220v();
		
		//接下来生成一个12V对象
		Power12 power12 = new Power12();
		power12.output12v();
	}

}

/**
 * 12V电源适配器(实现目标对象接口,即12V电源接口)
 */
public class AdapterPower12 implements IPower12 {
	// 待转换对象
	private final AbsBasePower absBasePower;

	// 适配器构造方法,将待转换对象传入
	public AdapterPower12(AbsBasePower absBasePower) {
		this.absBasePower = absBasePower;
	}

	// 实现目标对象方法
	@Override
	public void output12v() {
		// 获得外部电源值
		double powerFloat = this.absBasePower.getPower();
		// 进行电源转换
		if (powerFloat == 380) {
			powerFloat = powerFloat / 31.67D;
		} else if (powerFloat == 220) {
			powerFloat = powerFloat / 18.33D;
		} else if (powerFloat == 110) {
			powerFloat = powerFloat / 9.17D;
		} else {
			System.out.println("-----不能适配电源。。。。。");
		}

		// 处理结果转换
		powerFloat = (int) (powerFloat * 10) / 10.0D;
		System.out.println("这是[" + powerFloat + this.absBasePower.getUnit() + "]电源。。。。。");
	}

}

public class Client {

	public static void main(String[] args) {
		//首先生成一个220V对象
		Power220 power220 = new Power220();
		power220.output220v();
		
		//接下来生成一个12V对象
		Power12 power12 = new Power12();
		power12.output12v();
		
		//使用适配器把220V转换成12V
		System.out.println("\n----电源适配器转接中。。。。");
		IPower12 adapterPower12 = new AdapterPower12(power220);
		adapterPower12.output12v();
		System.out.println("----电源适配器转换结束。。。。");
	}

}

分析:

适配器模式体现了两个设计原则,一是使用对象组合,面向接口和抽象编程,二是开闭原则,不赘述。

产品继承一个接口,实现一个抽象类,接口作为产品标识,抽象类作为实体,实体是可以转化的,实现接口的适配器来负责这种转换。


使用场合:

(1)软件系统结构需要升级或扩展,又不想影响原油系统的稳定运行的时候;

(2)转换类之间差别不是太大的时候;

(3)想创建一个可以服用的类,改类可以与其他的不相关的类或不可预见的类协同工作的时候。


一句话总结:

以目标接口包装被适配者。


Java SDK中的原型模式:

重学java23种设计模式(6)适配器模式_第2张图片

参考资料:

《软件秘笈---设计模式那点事》


你可能感兴趣的:(设计模式)