以下是我现阶段对适配器模式的认识:
先谈一下什么是适配器
拿我一直想买但是又没钱买的苹果笔记本举例,苹果笔记本据说没有USB接口,但是我又有一个超级牛的机械键盘cherry 8.0是USB接口的。
但是,我既想用苹果笔记本,又想用我的cherry 8.0,这时候我就需要买一个适配器,也就是说,我本来有一个类(苹果笔记本),但是这个类我直接拿来用不了,因为他提供的接口不是USB接口,这时候我需要一个适配器,将这个类(或者接口)转化成我可以直接使用形式。
注意这里还有一种适配器,他是苹果的口转各种口。有点像HUB的那种转换头。如下图:
下面介绍适配器模式中的登场角色:
该角色负责定义所需的方法。在我的这个例子中就是上面那张图片所显示的,整个适配器设备,由Print(这个Print可以是接口也可以是抽象类,后面我将针对这两种情况进行详细的讨论)扮演该角色。
2.Client(请求者)
该角色负责使用Target角色所定义的方法进行具体的处理。在我的这个例子中是樱桃键盘,在示例程序中,由Main类扮演此角色。
3.Adaptee(被适配)
注意!这里是被适配,在我的例子中是苹果笔记本,在示例程序中由Banner类扮演此角色。
4.Adapter(适配)
这个是适配器模式的主人公,但是也是最不好理解的,看上面那个图,那个适配器不是有多个口吗,有转换成USB的口,有转换成其他类型的口。在我的这个例子中,适配器就是那么多的口中,转换成USB的那个口,因为我的键盘是USB口,其他口我不需要。在示例代码中由PrintBanner类扮演这个角色。
//1.Target(对象)扮演者
public interface Print {
public abstract void printWeak();
public abstract void printStrong();
}
//2.Client(请求者)扮演者
public class Main {
public static void main(String[] args) {
Print p = new PrintBanner("hello");
p.printWeak();
p.printStrong();
}
}
//Adaptee(被适配)角色扮演者
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 + "*");
}
}
//Adapter(适配)扮演者
public class PrintBanner extends Banner implements Print {
public PrintBanner(String string) {
super(string);
}
public void printWeak() {
showWithParen();
}
public void printStrong() {
showWithAster();
}
}
public abstract class Print {
public abstract void printWeak();
public abstract void printStrong();
}
public class PrintBanner extends Print {
private Banner banner;
public PrintBanner(String string) {
this.banner = new Banner(string);
}
public void printWeak() {
banner.showWithParen();
}
public void printStrong() {
banner.showWithAster();
}
}