java 适配器 设计模式 详解

3 篇文章 0 订阅
1 篇文章 0 订阅
适配器模式在Java开发中用于解决接口不兼容问题,允许不同接口的类协同工作。通过创建一个适配器类,将不兼容的接口转换为客户期望的接口。在案例中,通过创建抽象类实现动物接口并提供默认实现,然后让具体动物类如狗继承该抽象类,只需重写所需方法,实现了接口的灵活扩展,遵循面向接口编程和开闭原则。
摘要由CSDN通过智能技术生成

java 适配器 设计模式

在这里插入图片描述

  适配器模式:将一个类的接口换成客户希望的另外一个借口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。

oo设计原则:

  1. 面向接口编程(面向抽象编程)
  2. 封装变化
  3. 多用组合,少用继承
  4. 对修改关闭,对扩展开放

  在我们日常开发中,设计某项需求的时候没有考虑周全,在扩展新的需求的时候,原来的接口就不能用了,如果我们一定要用原来的接口,这时候就需要适配器了,就如上图中的C。

代码案例:
1.首先需要定义一个电源A接口
  有一个连接的功能

package adapter;

public interface PowerA {
	public void insert();
}

2.定义一个类来实现这个接口

package adapter;

public class PowerAImpl implements PowerA{
	public void insert() {
		System.out.println("电源开始工作");
	}
}

3.定义一个测试类,其中有一个静态的方法,让电源A开始工作,必须传入一个PowerA类型的实现。

package adapter;

public class Test {
	public static void main(String[] args) {
		PowerA powerA = new PowerAImpl();
		work(powerA);
	}
	public static void work(PowerA a) {
		System.out.println("正在连接...");
		a.insert();
		System.out.println("工作完成");
	}
}

在这里插入图片描述

4.此时我有拓展了一个PowerB接口的业务,想用测试类A的方法,使电源B工作。我不可能从新写一个方法,假如业务拓展的非常多咋办,代码都重复了,再说设计原则是对修改关闭的。

package adapter;

public interface PowerB {
	public void insert();
}

class PowerBImpl implements PowerB{
	public void insert() {
		System.out.println("电源B开始工作");
	}
}

5.我想在测试类中使用原有的方法,但是原有的方法只接受A类型的接口,这是我们需要一个适配器,如图的C,来使A兼容B。
通过适配器把B类型转换成A类型

package adapter;
/**
 *  定义一个PowerA类型的适配器 类
 *  定义一个 PowerB 的属性
 *  传入一个 PowerB 类型的对象,来执行连接这个功能
 */
public class Adapter implements PowerA{
	private PowerB powerB;
	
	//构造方法
	public Adapter(PowerB powerB) {
		this.powerB = powerB;
	}
	public void insert(){
		powerB.insert();
	}
}

6.最后的测试类 如下:

package adapter;

public class Test {
	public static void main(String[] args) {
		PowerA powerA = new PowerAImpl();
		work(powerA);
		
		PowerB powerB = new PowerBImpl();
		//work(powerB);
		PowerA adapter = new Adapter(powerB);
		work(adapter);
	}
	
	
	public static void work(PowerA a) {
		System.out.println("正在连接...");
		a.insert();
		System.out.println("工作完成");
	}
}

结果如下:
在这里插入图片描述

即完成兼容的问题


适配器还有另外的用法:

假如有一个动物接口,里面有 跑、吃、说话、游泳的方法

package adapter;

public interface Animal {
	public void run();
	public void eat();
	public void sing();
	public void swim();
}

  当我想实现一个狗的类,我只住注重跑这个方法,其他的方法我不在意,但是,一个类想要实现一个接口,必须实现接口中的所有方法,你可以写空实现,,假如想要实现各种各样的动物,如果都要写的话,估计我们会哭晕在厕所。
 这时 适配就可以起到意想不到的功能

定义一个抽象类,去实现动物这个接口,其中的方法都进行空实现。让狗类去继承这个抽象类,只重写跑这个方法就可以了。

package adapter;

public abstract class AnimalFunction implements Animal{
	public void run() {}
	public void eat() {}
	public void sing() {}
	public void swim() {}
}

最后用狗这个类去继承上面的那个抽象类,
  狗类中只重写跑这个方法即可。

package adapter;

public class Dog extends AnimalFunction{
	public void run() {
		System.out.println("我是一条狼狗,捉羊轻而易举");
	}
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值