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();
	}
}

参考博客: https://blog.csdn.net/wwwdc1012/article/details/82780560

发布了53 篇原创文章 · 获赞 45 · 访问量 8849

猜你喜欢

转载自blog.csdn.net/qq_33036061/article/details/104195531