设计模式之适配器模式

适配器模式解决了下面的问题:比如我有220v的电源,可是我的手机需要的却是5v的电压,这种情况只能通过适配器的转化就能够将其转化。
直接上代码说明问题:

1.类适配器:(通过继承关系实现)

手机对象

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 adapter.classadapter;

//被适配的类
public class Voltage220V {

	public int output220V() {
		int src = 220;
		System.out.println("电压=" + src + "伏特");
		return src;
	}
}

目标方法:手机孔的电压

package adapter.classadapter;

public interface IVoltage5V {
	public int output5V();
}

适配器:将220v ---->5v

package adapter.classadapter;

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

	@Override
	public int output5V() {
		int srcV = output220V();
		int dstV = srcV / 44 ;
		return dstV;
	}

}

使用的测试代码:

package adapter.classadapter;

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

}

运行效果如下:
在这里插入图片描述
我们发现虽然上面的代码实现了转换,但是继承的代价太大了,毕竟java是单继承,于是我们可以用下面的对象适配器进行优化

对象适配器 (通过聚合来实现)

其实代码跟上面的区别主要在于适配器类的书写,其他类的代码还是参照上面的吧

package adapter.objectadapter;

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

    Voltage220V voltage220V;

	public VoltageAdapter(Voltage220V voltage220V) {
		this.voltage220V = voltage220V;
	}

	@Override
	public int output5V() {
		int dstV = 0 ;
		if (null != voltage220V){
			int srcV = voltage220V.output220V();
			dstV = srcV / 44 ;
		}
		return dstV;
	}

}

因为适配器改了,所以测试时,也需要做个小的改变:

package 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 IIIII;

public interface ILuzelong {
    void charging1();
    void charging2();
    void charging3();
    void charging4();
}

抽象类进行空实现

package IIIII;

public abstract class AbsAdapter implements ILuzelong{
    @Override
    public void charging1() {

    }

    @Override
    public void charging2() {

    }

    @Override
    public void charging3() {

    }

    @Override
    public void charging4() {

    }
}

使用时在选择性的重写抽象类的方法:

package IIIII;

public class Test {
    public static void main(String[] args) {
        AbsAdapter absAdapter = new AbsAdapter() {
            @Override
            public void charging1() {
                System.out.println("给你5v");
            }
        };
        absAdapter.charging1();
    }
}

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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

键盘歌唱家

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

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

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

打赏作者

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

抵扣说明:

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

余额充值