概述:
将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
类型:结构型模式。
类图:
适用性:
1、你想使用一个已经存在的类,而它的接口不符合你的需求。
2、你想创建一个可以复用的类,该类可以与其他不相关的类或不可预见的类(即那些接口可能不一定兼容的类)协同工作。
参与者
1、Target (Three Hole)
定义Client使用的与特定领域相关的接口。
2、Client (Hotel)
与符合Target接口的对象协同。
3、Adaptee (TwoHole)
定义一个已经存在的接口,这个接口需要适配。
4、Adapter (Three_Swith_Two_Adapter)
对Adaptee的接口与Target接口进行适配。
例子: 使用 三孔插孔 转换为 二口插孔的例子
。 假如你外出旅游带的手机充电器是二孔插头,但是入住的旅店只有三孔插孔(不考虑三孔可以插二孔的情况),,,这时候你下楼 买了一个 三孔转化为二孔的适配器
package com.zq.designpattern.adatper;
/**
* Created by zhengshouzi on 2015/10/26.
*/
//三孔插座的标准
interface ThreeHole{
void doSomething();
}
//三孔插座的实现
class ThreeHoleImpl implements ThreeHole{
@Override
public void doSomething() {
System.out.println("使用 三孔 充电");
}
}
//两孔插座的标准
interface TwoHole{
void doSomething();
}
//两孔插座的实现
class TwoHoleImpl implements TwoHole{
@Override
public void doSomething() {
System.out.println("使用 二孔 充电");
}
}
//三孔 转 二孔的适配器
class Three_Swith_Two_Adapter implements ThreeHole {
private TwoHole twoHole;
//此适配器 必须要有 一个二孔的插口才能工作
public Three_Swith_Two_Adapter(TwoHole twoHole){
this.twoHole = twoHole;
}
@Override
public void doSomething() {
twoHole.doSomething();
}
}
class Hotel{
//旅馆默认是三孔的充电器
private ThreeHole threeHole = new ThreeHoleImpl();
//给旅馆加上适配器
public void setSwitcher(ThreeHole threeHole){
this.threeHole = threeHole;
}
//充电
public void charge(){
threeHole.doSomething();
}
}
public class AdapterPattern {
public static void main(String[] args) {
//找了一个旅馆住下
Hotel hotel = new Hotel();
//如果你是三孔的充电器,开始充电,直接充电
hotel.charge();
//如果你带的是二孔的充电器,拿出二孔的充电器,发现没法充电
TwoHole twoHole = new TwoHoleImpl();
//这时候你下楼买一个 三孔 转换 二孔的适配器
//适配器的构造函数,说我需要一个二孔的插头插在我上面
ThreeHole threeHole = new Three_Swith_Two_Adapter(twoHole);
//这个时候将适配器插在旅馆的 三孔排插上
hotel.setSwitcher(threeHole);
//开始充电
hotel.charge();
}
}
看了这个代码,你可以试试自己写一个把 二孔转化为 三孔的适配器。