泰国插座用的是两孔的(欧标),可以买个多功能转换插头 (适配器) ,这样就可以使用了。
基本介绍:Adapter 类,通过继承 src 类,实现 dst 类接口,完成 src->dst 的适配。
应用实例说明
以生活中充电器的例子来讲解适配器,充电器本身相当于 Adapter,220V 交流电相当于 src (即被适配者),我们的目 dst(即 目标)是 5V 直流电
思路分析(类图)
被适配的类:
package com.gjxaiou.adapter.classadapter;
//被适配的类
public class Voltage220V {
//输出220V的电压
public int output220V() {
int src = 220;
System.out.println("电压=" + src + "伏");
return src;
}
}
目标适配接口:
package com.gjxaiou.adapter.classadapter;
//适配接口
public interface IVoltage5V {
public int output5V();
}
适配器:
package com.gjxaiou.adapter.classadapter;
//适配器类
public class VoltageAdapter extends Voltage220V implements IVoltage5V {
@Override
public int output5V() {
//获取到220V电压【通过继承的方式】
int srcV = output220V();
//转成 5v
int dstV = srcV / 44 ;
return dstV;
}
}
使用:
package com.gjxaiou.adapter.classadapter;
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.gjxaiou.adapter.classadapter;
public class Client {
public static void main(String[] args) {
System.out.println(" === 类适配器模式 ====");
Phone phone = new Phone();
phone.charging(new VoltageAdapter());
}
}
应用实例说明
以生活中充电器的例子来讲解适配器,充电器本身相当于 Adapter,220V 交流电相当于 src (即被适配者),我们的目 dst(即目标)是 5V 直流电,使用对象适配器模式完成。
思路分析(类图):只需修改适配器即可, 如下:
代码实现:
适配接口和被适配的类:
package com.gjxaiou.adapter.objectadapter;
//适配接口
public interface IVoltage5V {
public int output5V();
}
// -------------------------------------------------
package com.gjxaiou.adapter.objectadapter;
//被适配的类
public class Voltage220V {
//输出220V的电压,不变
public int output220V() {
int src = 220;
System.out.println("电压=" + src + "伏");
return src;
}
}
程序里的匿名内部类就是 Listener 具体实现类
案例说明
? 首先提供一个接口:
package com.gjxaiou.adapter.interfaceadapter;
public interface Interface4 {
public void m1();
public void m2();
public void m3();
public void m4();
}
然后对接口中的方法进行默认实现:
package com.gjxaiou.adapter.interfaceadapter;
//在AbsAdapter 我们将 Interface4 的方法进行默认实现
public abstract class AbsAdapter implements Interface4 {
//默认实现
@Override
public void m1() {
}
@Override
public void m2() {
}
@Override
public void m3() {
}
@Override
public void m4() {
}
}
使用的时候,需要使用什么方法只要重写该方法即可:
package com.gjxaiou.adapter.interfaceadapter;
public class Client {
public static void main(String[] args) {
AbsAdapter absAdapter = new AbsAdapter() {
//只需要去覆盖我们 需要使用 接口方法
@Override
public void m1() {
System.out.println("使用了m1的方法");
}
};
absAdapter.m1();
}
}
可以看到处理器的类型不同,有多重实现方式,那么调用方式就不是确定的,如果需要直接调用 Controller 方法,需要调用的时候就得不断是使用 if else 来进行判断是哪一种子类然后执行。那么如果后面要扩展 Controller, 就得修改原来的代码,这样违背了 OCP 原则。
原文:https://www.cnblogs.com/qq438649499/p/12178294.html