场景
如图, 适配器将交流电100伏特电压转为直流12伏特供电脑使用。
在程序中,经常会存在现有的程序不能直接使用,需要适当的变换之后才能使用的情况,这种填补 现有程序和所需程序之间差异的设计模式就是适配器模式。
适配器类图
继承的形式
委托的形式
Client: 请求者
Target: 定义所需要的方法
Adaptee: 被适配者
Adapter: 适配器
代码实现
继承形式适配器代码实现
/**
* 被适配者
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Banner {
/**
* 字符串
*/
private String str;
/**
* 字符串加括号
*/
public void showWithParen() {
System.out.println("(" + str + ")");
}
/**
* 字符串加星
*/
public void showWithAster() {
System.out.println("*" + str + "*");
}
}
/**
* 需求的接口
*/
public interface Print {
/**
* 弱化
*/
void printWeak();
/**
* 强化
*/
void printStrong();
}
/**
* 扮演适配器的角色
*/
public class PrintBanner extends Banner implements Print {
public PrintBanner(String s) {
super(s);
}
@Override
public void printWeak() {
showWithParen();
}
@Override
public void printStrong() {
showWithAster();
}
}
public class Main {
public static void main(String[] args) {
Print p = new PrintBanner("Hello");
p.printStrong();
p.printWeak();
}
}
委托形式适配器代码实现
/**
* 被适配者
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Banner {
/**
* 字符串
*/
private String str;
/**
* 字符串加括号
*/
public void showWithParen() {
System.out.println("(" + str + ")");
}
/**
* 字符串加星
*/
public void showWithAster() {
System.out.println("*" + str + "*");
}
}
/**
* 需要的接口
*/
public abstract class Print2 {
/**
* 弱化
*/
public abstract void printWeak();
/**
* 强化
*/
public abstract void printStrong();
}
@Data
public class PrintBanner2 extends Print2 {
private Banner banner;
public PrintBanner2(String s) {
this.banner = new Banner(s);
}
@Override
public void printWeak() {
banner.showWithParen();
}
@Override
public void printStrong() {
banner.showWithAster();
}
}
public class Main {
public static void main(String[] args) {
Print2 p2 = new PrintBanner2("Hello");
p2.printStrong();
p2.printWeak();
}
}
什么时候使用适配器模式
代码版本升级和兼容性,假如我们以后只想维护新版本,可以让新版本扮演Adaptee角色,旧版本扮演Target角色,再编写一个Adapter角色,让它使用新版本的类来实现旧版本的类中的方法.