设计模式-适配器(Adaper)模式

适配器模式中分为类适配器和对象适配器。

类适配器

继承手头现在有的类,通过调用父类(现有类)的方法来实现客户端需要的接口。

客户端想要的接口:

package com.oozinoz.simulation;

/**
 * 火箭模拟
 * 这是一个客户端已经使用的接口
 */
public interface RocketSim {

	double getMass();
	double getThrust();
	void setSimTime(double t);
}
手头现有的实现:

package com.oozinoz.physical;

/**
 * 手头上已经有的火箭实现
 */
public class PhysicalRocket {
	double burnArea;
	double burnRate;
	double fuelMass;
	double totalMass;
	public PhysicalRocket(double burnArea, double burnRate, double fuelMass,double totalMass) {
		this.burnArea = burnArea;
		this.burnRate = burnRate;
		this.fuelMass = fuelMass;
		this.totalMass = totalMass;
	}

	public double getBurnTime(){
		//一些具体实现...
		return 0d;
	}
	
	public double getMass(double t){
		//...
		return 0d;
	}
	
	public double getThrust(double t){
		//...
		return 0d;
	}
	
}

通过继承的方式来适配:

package com.oozinoz.firework;

import com.oozinoz.physical.PhysicalRocket;
import com.oozinoz.simulation.RocketSim;

/**
 * 适配器
 * 继承现有类,实现客户端接口,将现有实现包装(适配)成客户端想要调用的接口
 */
public class OozinozRocket extends PhysicalRocket implements RocketSim {

	private double time;
	
	public OozinozRocket(double burnArea, double burnRate, double fuelMass,double totalMass) {
		super(burnArea,burnRate,fuelMass,totalMass);
	}

	@Override
	public double getMass() {
		return getMass(time);
	}

	@Override
	public double getThrust() {
		return getThrust(time);
	}

	@Override
	public void setSimTime(double t) {
		this.time = t;
	}

}

对象适配器

对象适配器和类适配器不同的是,不通过继承的方式来调用现有的实现,而是通过包装一个现有类对象,调用这个对象的方法来使用现有的实现。

package com.oozinoz.simulation;
import com.oozinoz.physical.PhysicalRocket;

public class OozinozRocket implements RocketSim{

	private double time;
	private PhysicalRocket rocket;
	
	public OozinozRocket(double burnArea, double burnRate, double fuelMass,double totalMass) {
		rocket = new PhysicalRocket(burnArea, burnRate, fuelMass, totalMass);
	}
	
	@Override
	public double getMass() {
		return rocket.getMass(time);
	}
	@Override
	public double getThrust() {
		return rocket.getThrust(time);
	}
	@Override
	public void setSimTime(double t) {
		this.time = t;
	}
}


Java的IO流API是最好的适配器实现,适配器模式和装饰模式比较相似。适配器模式侧重于适配新的接口,而装饰模式则侧重于对已有对象的扩展。

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