在程序世界中,经常存在现有的程序无法直接使用,需要适当的变化才能使用.这种用于填补俩个程序之间差异的设计模式就是适配器模式。
适配器模式分为以下俩种:
Banner类
/**
* @author Jay
* @date 2019/5/23 22:52
* @description
*/
public class Banner {
private String string;
public Banner(String string) {
super();
this.string = string;
}
/**
* 括号方式
*/
public void showWithParen() {
System.out.println("(" + string + ")");
}
/**
* 星号方式
*/
public void showWithAster() {
System.out.println("*" + string + "*");
}
}
Print接口
/**
* @author Jay
* @date 2019/5/23 22:54
* @description 定义打印接口
*/
public interface Print {
/**
* 定义打印方式
*/
void printWeak();
/**
* 不同的打印方式
*/
void printStrong();
}
PrintBanner类:适配器,实现接口又继承类,可以使用俩者的方法.
/**
* @author Jay
* @date 2019/5/23 22:55
* @description 适配器,实现接口又继承类,可以使用俩者的方法.
*/
public class PrintBanner extends Banner implements Print {
/**
* 适配器对象
*/
public PrintBanner(String string) {
super(string);
// 父类只有一个构造器则子类只能调用父类唯一构造器
// 需把值传入
}
@Override
public void printWeak() {
//有个隐式的super可以调用父类方法
super.showWithParen();
}
@Override
public void printStrong() {
showWithAster();
}
}
Main
/**
* @author Jay
* @date 2019/5/23 23:01
* @description
*/
public class Main {
/**
* 测试类
*/
public static void main(String[] args) {
//接口引用接收其实现类对象
Print p = new PrintBanner("Hello");
//只能调用从接口实现的方法以及子类自己的方法,无法调用父类.
p.printStrong();
p.printWeak();
}
}
Banner类中具体方法实现细节对Main完全隐藏,Main不知道PrintBanner中如何实现,这样就可以在不对Main类修改的情况下改变PrintBanner的具体实现细节。
/**
* @author Jay
* @date 2019/5/23 22:52
* @description
*/
public class Banner {
private String string;
public Banner(String string) {
super();
this.string = string;
}
/**
* 括号方式
*/
public void showWithParen() {
System.out.println("(" + string + ")");
}
/**
* 星号方式
*/
public void showWithAster() {
System.out.println("*" + string + "*");
}
}
Print类
/**
* @author Jay
* @date 2019/5/23 23:13
* @description
*/
public abstract class Print {
public abstract void printWeak();
public abstract void printStrong();
}
PrintBanner类
/**
* @author Jay
* @date 2019/5/23 23:13
* @description
*/
public class PrintBanner extends Print {
/**
* 使用组合将俩个类方法都可以调用
*/
private Banner banner;
public PrintBanner(String string) {
// 构造函数创建Banner对象
this.banner = new Banner(string);
}
@Override
public void printWeak() {
banner.showWithParen();
}
@Override
public void printStrong() {
banner.showWithAster();
}
}
Main
public class Main {
//测试类
public static void main(String[] args) {
Print p = new PrintBanner("Hello");//接口引用接收其实现类对象
//只能调用从接口实现的方法以及子类自己的方法,无法调用父类.
p.printStrong();
p.printWeak();
}
}
Target(对象)
该角色负责定义所需的方法.示例中Print接口(被实现)和Print类(被委托)
ex:笔记本电脑工作所需12v电源
Clint(请求者)
该角色负责将Target所定义的方法具体实现.示例中的Main类.
ex:笔记本电脑
Adaptee(被适配)
持有既定方法的角色 ,Banner类
ex:220v电源
Adapter(适配器)
使用Adaptee角色的方法来满足Target角色的需求.PrintBanner类
ex:电源适配器
适配器实现的俩种模式:
使用继承:
使用委托:
可以将稳定代码,封装好的代码重复利用,用适配器进行组装,从而生成新的类,方便代码的排查.
To GitHub