设计模式中的结构模式是关于结构的,包括聚合,组合,继承等等,主要使用这些结构来表示程序的逻辑,主要包括下面这些模式:适配器模式(Adapter),桥接模式(Bridge),组合模式(Composite),装饰模式(Decorator),外观模式(Facade),享元模式(Flyweight),代理模式(Proxy)。下面的一些列文章将会逐个讲述。
首先来了解一下适配器模式。
1. 适配器模式(Adapter Pattern)
适配器模式就是两个对象之间的接口的适配,使两个接口不兼容的类可以一起工作,举一个现实点的例子。
比如说朋友去日本出差,让他捎回来一个笔记本,可是这个笔记本使用的是110V的电压,并且用的是两项的插槽,这个时候就要用一个电源适配器了,笔记本插在电源适配器上,适配器接到一个220V的三项的插座上。这个就是一个适配器的例子,在程序中,也可以模拟这种结构,也就实现了适配器模式了。
上边的这个过程用Java语言来进行描述的话,如下所示:
首先是二项插头应该使用的两项插座接口。
但是现在家里只有三项插座。
所以就需要一个2-3项的适配器了。
最后是两项插头,这个相当于Client。
适配器模式的定义是:将一个类的接口转换成了客户端需要的接口,使不兼容的接口可以一起工作。
另外,还有一个进一步的话题需要讨论一下,适配器模式其实是分两种的,对象适配器(Object adapter)和类适配器(Class adapter)。上边的例子是对象适配器,而Java是不支持类适配器的,因为类适配器是需要多重继承的。
下面给出适配器模式的类图。
对象适配器:
类适配器:
首先来了解一下适配器模式。
1. 适配器模式(Adapter Pattern)
适配器模式就是两个对象之间的接口的适配,使两个接口不兼容的类可以一起工作,举一个现实点的例子。
比如说朋友去日本出差,让他捎回来一个笔记本,可是这个笔记本使用的是110V的电压,并且用的是两项的插槽,这个时候就要用一个电源适配器了,笔记本插在电源适配器上,适配器接到一个220V的三项的插座上。这个就是一个适配器的例子,在程序中,也可以模拟这种结构,也就实现了适配器模式了。
上边的这个过程用Java语言来进行描述的话,如下所示:
首先是二项插头应该使用的两项插座接口。
- // 两项插座
- public interface Term2PlugSocket {
- public void plugin2term();
- }
// 两项插座
public interface Term2PlugSocket {
public void plugin2term();
}
但是现在家里只有三项插座。
- // 三项插座
- public class Term3PlugSocket {
- public void plugin3term() {
- System.out.println("plug in 3 term socket");
- }
- }
// 三项插座
public class Term3PlugSocket {
public void plugin3term() {
System.out.println("plug in 3 term socket");
}
}
所以就需要一个2-3项的适配器了。
- // 2-3项插座适配器
- public class Term2to3Adapter implements Term2PlugSocket {
- private Term3PlugSocket term3PlugSocket = null;
- public Term2to3Adapter(Term3PlugSocket term3PlugSocket) {
- this.term3PlugSocket = term3PlugSocket;
- }
- @Override
- public void plugin2term() {
- System.out.println("execute adapter action");
- // 调用目标的方法
- term3PlugSocket.plugin3term();
- }
- }
// 2-3项插座适配器
public class Term2to3Adapter implements Term2PlugSocket {
private Term3PlugSocket term3PlugSocket = null;
public Term2to3Adapter(Term3PlugSocket term3PlugSocket) {
this.term3PlugSocket = term3PlugSocket;
}
@Override
public void plugin2term() {
System.out.println("execute adapter action");
// 调用目标的方法
term3PlugSocket.plugin3term();
}
}
最后是两项插头,这个相当于Client。
- // 两项插座
- public class Term2Connector {
- // 把插头插入插座
- public void connect() {
- Term3PlugSocket term3PlugSocket = new Term3PlugSocket();
- // 2-3项插座适配器
- Term2PlugSocket adapter = new Term2to3Adapter(term3PlugSocket);
- // 适配3项插座
- adapter.plugin2term();
- }
- public static void main(String[] args) {
- Term2Connector connector = new Term2Connector();
- connector.connect();
- }
- }
// 两项插座
public class Term2Connector {
// 把插头插入插座
public void connect() {
Term3PlugSocket term3PlugSocket = new Term3PlugSocket();
// 2-3项插座适配器
Term2PlugSocket adapter = new Term2to3Adapter(term3PlugSocket);
// 适配3项插座
adapter.plugin2term();
}
public static void main(String[] args) {
Term2Connector connector = new Term2Connector();
connector.connect();
}
}
适配器模式的定义是:将一个类的接口转换成了客户端需要的接口,使不兼容的接口可以一起工作。
另外,还有一个进一步的话题需要讨论一下,适配器模式其实是分两种的,对象适配器(Object adapter)和类适配器(Class adapter)。上边的例子是对象适配器,而Java是不支持类适配器的,因为类适配器是需要多重继承的。
下面给出适配器模式的类图。
对象适配器:
类适配器: