Java设计模式之适配器模式(类、对象、接口)

适配器模式简介

        1)适配器模式是将某个类的接口转换成客户期望的另外一个接口表示,其主要目的是兼容性,让原本因接口不匹配不能一起工作的两个类可以协同工作,其别名为包装类。

        2)适配器模式属于结构型模式。

        3)主要分为三类: 类适配器模式、 对象适配器模式、 接口适配器模式。

适配器模式的工作原理如下: 

        1)适配器模式:  将一个类的接口转换成另一个接口,让原本接口不兼容的类可以兼容。

        2) 从用户的角度看不到适配者,是解耦的。

        3) 用户调用适配器转换出来的的目标接口方法,适配器再调用被适配者的相关接口方法。

        4) 用户收到接口的反馈,感觉只是和目标接口交互。

类适配器模式介绍

        Adapter类,通过继承src类,实现dst类接口,实现src->dst的适配,uml图如下:

被适配器适配的类:

// 被适配的类
public class Voltage220V {
	
	
	//输出220V电压
	public int output220V() {
		int src = 220;
		System.out.println("电压:" + src + "V");
		return src;
	}
}

目标接口类:


// 适配接口,用户需要的接口,可以是一个抽象类或者是接口
public interface IVoltage5V {
	public int output5V();
}

适配器类继承被适配器类并实现目标接口:

// 适配器类
public class VoltageAdapter extends Voltage220V  implements IVoltage5V {

	
//	//可以改为对象适配器,持有被适配者的对象
//	private Voltage220V voltage220V;
	
	@Override
	public int output5V() {
		// TODO Auto-generated method stub
		//获取到220V电压
		int srcV = output220V();
		int dstV = srcV / 44 ; //转成 5v
		return dstV;
	}

}

测试类:

public class Client {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		System.out.println(" === 类适配器模式 ====");
		Phone phone = new Phone();
		//充电
		phone.charging(new VoltageAdapter());
	}

}

 客户使用电话,看不到被适配器的类,只能通过适配器来实现目标接口的行为。


public class Phone {

	// 充电
	public void charging(IVoltage5V iVoltage5V) {
		if(iVoltage5V.output5V() == 5) {
			System.out.println("电压为5V, 可以充电~~");
		} else if (iVoltage5V.output5V() > 5) {
			System.out.println("电压大于5V, 不能充电~~");
		}
	}
}

  对象适配器模式

        与上述介绍的类适配器模式不同的地方有,不再通过继承被适配者类来获取方法,对象适配器是通过对象来获取到方法,这是二者的区别。对象适配器通过构造器来初始化被适配者对象。

        被适配者类代码:

package com.atguigu.adapter.objectadapter;

//对象适配器
public class VoltageAdapter  implements IVoltage5V {

	private Voltage220V voltage220V; // 被适配者对象
	
	
	// 使用构造函数初始化对象
	public VoltageAdapter(Voltage220V voltage220v) {
		
		this.voltage220V = voltage220v;
	}



	@Override
	public int output5V() {
		
		int dst = 0;
		if(null != voltage220V) {
			int src = voltage220V.output220V();//��ȡ220V ��ѹ
			System.out.println("ʹ220V电压");
			dst = src / 44;
			System.out.println("适配后的电压:" + dst);
		}
		
		return dst;
		
	}

}

  客户端代码,在使用适配器的时候,传入被适配者实例,即可完成手机充电的逻辑:

package com.atguigu.adapter.objectadapter;

public class Client {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		System.out.println("对象适配器");
		Phone phone = new Phone();
		phone.charging(new VoltageAdapter(new Voltage220V()));
	}

}

接口适配器模式

        通过抽象类实现目标接口,然后用匿名内部类来对想要的接口方法进行改造,即可完成接口适配。代码如下:

目标接口

package com.atguigu.adapter.interfaceadapter;

public interface Interface4 {
	public void m1();
	public void m2();
	public void m3();
	public void m4();
}

抽象类

package com.atguigu.adapter.interfaceadapter;

//抽象类
public abstract class AbsAdapter implements Interface4 {

	//实现4接口
	public void m1() {

	}

	public void m2() {

	}

	public void m3() {

	}
	
	public void m4() {
		
	}

	
}

客户端

package com.atguigu.adapter.interfaceadapter;

public class Client {
	public static void main(String[] args) {
		
		AbsAdapter absAdapter = new AbsAdapter() {
			//ֻ只需要覆盖我们使用的接口方法
			@Override
			public void m1() {
				// TODO Auto-generated method stub
				System.out.println("覆盖后的m1方法");
			}

		};
		
		absAdapter.m1();
	}
}

参考博客: 设计模式 | 适配器模式及典型应用_小旋锋的博客-CSDN博客_适配器模式

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

乌托邦钢铁侠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值