1. Adapter模式
也有称为Wrapper模式。将一个类的接口适配成用户所期待的。一个适配允许通常因为接口不兼容而不能在一起工作的类工作在一起
Adapter模式可以在完全不改变现有代码的前提下使现有代码适配于新的接口(API)。Adapter模式可用于版本升级和兼容性等方面。
2 UML类图
Adapter模式有以下两种:
- 类适配器模式(使用继承的适配器)
- 对象适配器模式(使用委托的适配器)
2.1 类适配器模式
2.1 对象适配器模式
2.3 登场角色
-
Target(对象)
负责定义所需的方法。目标类 -
Client(请求者)
使用Target角色所定义的方法进行具体操作,使用Target中的方法。 -
Adaptee(被适配)
Adaptee拥有既定的方法,需要适配到Target角色方法。 -
Adpater(适配)
使用Adaptee角色的方法来满足Target的需求
3. 示例程序
类和接口一览表
名字 | 说明 |
---|---|
表示目标类的接口或类 | |
Client | 表示使用目标对象方法的类 |
Banner | 需要被适配的类 |
PrintBanner | 适配类 |
3.1 使用继承的示例程序
uml类图(只显示继承和实现关系)
uml类图
代码实现
Print接口
package xin.ajay.adapter1;
//目标类接口
public interface Print {
void printWeak();
void printStrong();
}
Banner类
package xin.ajay;
//广告横幅(adaptee)
public class Banner {
private String msg;
public Banner(String msg){
this.msg = msg;
}
//Banner个性的方法1
public void showWithParen(){
System.out.println("("+ msg +")");
}
//Banner个性的方法2
public void showWithAster(){
System.out.println("*" + msg + "*");
}
}
PrintBanner类
package xin.ajay.adapter1;
import xin.ajay.Banner;
public PrintBanner(String msg) {
super(msg);
}
//适配到目标类
@Override
public void printWeak() {
showWithParen();
}
//适配到目标类
@Override
public void printStrong() {
showWithAster();
}
}
Client类
package xin.ajay.adapter1;
import xin.ajay.adapter1.Print;
import xin.ajay.adapter1.PrintBanner;
//使用者
public class Client {
public static void main(String[] args) {
//使用Print,被适配的对象在这儿是被
Print p = new PrintBanner("Hello");
p.printWeak();
p.printStrong();
}
}
3.2 使用委托的示例程序
uml类图(只显示继承和实现关系)
uml类图
Print类
package xin.ajay.adapter2;
public abstract class Print {
public abstract void printWeak();
public abstract void printStrong();
}
Banner类
与上面一样
PrintBanner类
package xin.ajay.adapter2;
import xin.ajay.Banner;
public class PrintBanner extends Print{
private Banner banner;
public PrintBanner(Banner banner) {
this.banner = banner;
}
@Override
public void printWeak() {
banner.showWithParen();
}
@Override
public void printStrong() {
banner.showWithAster();
}
}
Client类
package xin.ajay.adapter2;
import xin.ajay.Banner;
public class Client {
public static void main(String[] args) {
Print p = new PrintBanner(new Banner("Hi"));
p.printWeak();
p.printStrong();
}
}
鸣谢:
GoF《设计模式》和结城浩的《图解设计模式》