适配器模式
Adapter模式有以下两种:
类适配器模式
(继承
适配器)
对象适配器模式
(使用委托
的适配器)
模型类比:
Adapter模式中的登场角色
电源的比喻 | 示例程序 | |
---|---|---|
实际情况(adaptee) | 交流100伏特 | Banner类 |
变换装置(adapter) | 适配器 | PrintBanner类 |
需求(target) | 直流12伏特 | Print接口 |
Target(对象)
该角色定义所需的方法。Print接口(使用继承时)和Print类(使用委托时)扮演此角色
Client(请求者)
该角色负责使用 Target角色所定义的方法进行具体处理,Main
扮演此类角色
Adaptee(被适配)
Adaptee是一个持有既定方法的角色, 即100伏特电源. 由Banner类扮演此角色
Adapter(适配)
Adapter模式的主人公,使用Adaptee角色的方法来满足Target角色的需求。
类适配器模式
Banner.java
public class Banner {
private String string;
public Banner(String string){
this.string = string;
}
public void showWithParen(){
System.out.println("("+string+")");
}
public void showWithAster(){
System.out.println("*"+string+"*");
}
}
Print.java
public interface Print {
public abstract void printWeak();
public abstract void printStrong();
}
PrintBanner.java
public class PrintBanner extends Banner implements Print {
public PrintBanner(String string) {
super(string);
}
@Override
public void printWeak() {
showWithParen();
}
@Override
public void printStrong() {
showWithAster();
}
}
Main.java
public class Main {
public static void main(String[] args) {
Print p = new PrintBanner("hello");
p.printWeak();
p.printStrong();
}
}
对象适配器模式
PrintBanner.java
public class PrintBanner extends Print {
private Banner banner;
public PrintBanner(String string) {
this.banner = new Banner(string);
}
@Override
public void printWeak() {
banner.showWithParen();
}
@Override
public void printStrong() { banner.showWithAster(); }
}
Print.java
public abstract class Print {
public abstract void printWeak();
public abstract void printStrong();
}
不是很理解新旧版本问题?
练习题:
设计思路: