将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以在一起工作。
例子一(对象适配器模式):
1。Apple
package com.test.adaptermodel;
public class Apple {
public void getAColor(String str) {
System.out.println("Apple color is: " + str);
}
}
2.Orange
package com.test.adaptermodel;
public class Orange {
public void getOColor(String str) {
System.out.println("Orange color is: " + str);
}
}
3.AppleAdapter
package com.test.adaptermodel;
public class AppleAdapter extends Apple {
private Orange orange;
public AppleAdapter(Orange orange) {
this.orange = orange;
}
public void getAColor(String str) {
orange.getOColor(str);
}
}
4.Test
package com.test.adaptermodel;
public class Test {
public static void main(String[] args) {
Apple apple = new Apple();
apple.getAColor("green");
Orange orange = new Orange();
//要让一个桔子被“适配”成一个苹果
AppleAdapter aa = new AppleAdapter(orange);
//于是桔子表现得就像苹果一样了
aa.getAColor("red");
}
}
5.结果
Apple color is: green
Orange color is: red
==============================
例子二:(类适配器模式和对象适配器模式对比)
1。基本接口标准
package com.test.adaptermodel;
public interface Socket {
// 目标接口,或称为标准接口
// 基本插座的功能
public void myPlug();
}
2。香港插口实现
package com.test.adaptermodel;
/**
* 站在香港的角度
*
* @author Administrator
*
*/
public class HongKongSocket implements Socket {
@Override
public void myPlug() {
// TODO Auto-generated method stub
System.out.println("香港自己普通的英式方头插座 具有插在香港插排上的功能...");
}
}
3。内地插口只有自己的方式,没有香港插口的标准
package com.test.adaptermodel;
/**
* 已存在的、具有特殊功能、但不符合我们既有的标准接口的类 不能直接插在香港插排的插在
* @author Administrator
*
*/
public class InlandSocket {
public void myPlugNoWorkInHongkong() {
System.out.println("来自内地的需要适配器的内地扁头插座...");
}
}
4。SocketAdapter //类适配器模式
package com.test.adaptermodel;
public class SocketAdapter extends InlandSocket implements Socket{
@Override
public void myPlug() {
// TODO Auto-generated method stub
super.myPlugNoWorkInHongkong();
}
}
5。SocketAdapterTwo //对象适配器模式
package com.test.adaptermodel;
public class SocketAdapterTwo implements Socket{
private InlandSocket inlandSocket;
public SocketAdapterTwo(InlandSocket inlandSocket) {
super();
this.inlandSocket = inlandSocket;
}
@Override
public void myPlug() {
// TODO Auto-generated method stub
inlandSocket.myPlugNoWorkInHongkong();
}
}
6。Test
package com.test.adaptermodel;
//都是站在香港的角度考虑
public class SocketTest {
public static void main(String[] args) {
objectAdapter();
classAdapter();
}
private static void objectAdapter() {
// TODO Auto-generated method stub
// 使用普通功能类 普通插头
HongKongSocket hongKongSocket = new HongKongSocket();
hongKongSocket.myPlug();
// 使用特殊功能类,即适配类, 转换器
// 需要先创建一个被适配类的对象作为参数
SocketAdapterTwo adapter = new SocketAdapterTwo(new InlandSocket());
adapter.myPlug();
}
/**
* 类的适配器模式
*/
private static void classAdapter() {
// 使用普通插头
HongKongSocket hongKongSocket = new HongKongSocket();
hongKongSocket.myPlug();
// 使用转换器
SocketAdapter adapter = new SocketAdapter();
adapter.myPlug();
}
}
7,结果(两个模式结果是一致的)
香港自己普通的英式方头插座 具有插在香港插排上的功能...
来自内地的需要适配器的内地扁头插座...
香港自己普通的英式方头插座 具有插在香港插排上的功能...
来自内地的需要适配器的内地扁头插座...
1.继承(局限:java单继承)
采用继承方式的称为类适配器
特点:通过多继承不兼容接口,实现对目标接口的匹配,单一的对某个类而实现的适配
2.组合
采用组合方式的适配器称为对象适配器
特点:把”被适配者”作为对象组合到适配器中,以修改目标接口包装被适配者