重学设计模式(三设计模式-适配器模式)

Posted 穆瑾轩

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了重学设计模式(三设计模式-适配器模式)相关的知识,希望对你有一定的参考价值。

1、适配器模式

    接下来我们介绍结构型模式,它描述了如何将类或对象按某种布局组成更大的结构。它分为类结构型模式和对象结构型模式,前者采用继承机制来组织接口和类,后者釆用组合或聚合形式来组合对象。

1.1、什么是适配器模式

  • 定义:适配器模式,也称为包装器模式,是一种结构型设计模式,它允许具有不兼容接口的对象进行协作。适配器模式分为类适配器模式、对象适配器模式两种。

    技术源于生活,也服务于生活。现实生活中就有很多这样的例子,比如:用直流电的笔记本电脑接交流电源时需要一个电源适配器,安卓耳机接苹果手机时需要一个转接头等等,都是适配器的应用。

1.2、适配器模式的优缺点

  • 优点

    1)符合单一职责原则。将目标类和适配者类解耦,即把接口或数据转换代码与程序的主要业务逻辑分开。

    2)符合开闭原则。可以复用现存的类,在程序中引入新类型的适配器而不破坏现有的客户端代码。

  • 缺点

    1)适配器编写过程需要结合业务场景全面考虑,可能会增加系统的复杂性。有时只需更改服务类以使其与您的其余代码相匹配会更简单。

    2)增加代码阅读难度,降低代码可读性,过多使用适配器会使系统代码变得凌乱。

1.3、创建方式

    以生活中充电器的例子来讲解适配器模式。

1.3.1、类适配器案例

1)Voltage220V

/**
 * 被适配的类,通常是一些有用的服务或者第三方接口
 */
public class Voltage220V 

	private Integer voltage; //电压

	public Voltage220V()
		this.voltage = 220;  //默认电压220v
	
	public Integer getVoltage() 
		return voltage;
	
	

2)IPhoneVoltage接口和VoltageAdapter适配器类

public class VoltageAdapter extends Voltage220V implements IPhoneVoltage

	@Override
	public Integer output5V() 
		//手机并不能直接接220v电压,这里通过充电头进行适配转换
		return getVoltage()/44; 
	



//先声明一个手机适配器接口
interface IPhoneVoltage
	public Integer output5V();

3)Phone充电功能

public class Phone 

	public boolean charge(IPhoneVoltage voltage)
		if(voltage.output5V()==5)
			System.out.println("正常充电中......");
			return true;
		else
			System.out.println("充电异常或烧坏......");
			return false;
		
	

4)Client调用者

public class Client 
    public static void main(String[] args) 
    	Phone phone = new Phone();
    	//手机充电
    	phone.charge(new VoltageAdapter()); //输出:正常充电中......
	

此时的UML关系图:

1.3.2、对象适配器案例 

    我们在讲设计原则的时候就提到过java扩展方式有继承和组合,以及为什么优先推荐使用组合来扩展功能。对象适配器模式,只需要更改 Adapter,不使用继承,而使用组合方式(聚合、组合、关联等)来替代继承关系。

1)更改VoltageAdapter类

public class VoltageAdapter implements IPhoneVoltage
	
	private Voltage220V voltage220V;  //关联关系-聚合

	public VoltageAdapter(Voltage220V voltage220V)
		this.voltage220V = voltage220V;
	
	
	@Override
	public Integer output5V() 
		if(voltage220V!=null)
			//手机并不能直接接220v电压,这里通过充电头进行适配转换
			return voltage220V.getVoltage()/44; 
		
		return 0;
	

2)Client调用者

public class Client 
    public static void main(String[] args) 
    	Phone phone = new Phone();
    	//手机充电
    	phone.charge(new VoltageAdapter(new Voltage220V())); //输出:正常充电中......
	

1.4、总结及建议

    一般来说,适配器模式可以看作一种“补偿模式”,通过适配器来协调系统现有或第三方接口来达到适配或者接入的目的。

适用场景:

    1)以前开发的系统存在满足新系统功能需求的类,但其接口同新系统的接口不一致。

    2)使用第三方提供的组件,但组件接口定义和系统要求的接口定义不同。

JDK 中适配器模式的使用:

  • java.util.Arrays#asList()

  • java.io.InputStreamReader(InputStream) (返回一个阅读器)

  • java.io.OutputStreamWriter(OutputStream) (返回一个 Writer)

以上是关于重学设计模式(三设计模式-适配器模式)的主要内容,如果未能解决你的问题,请参考以下文章

重学设计模式(三设计模式-单例模式)

适配器案例

适配器案例

适配器案例

设计模式:适配器模式

设计模式——适配器(Adapter)模式