Object Adapter概述
玩具代码案例 - 电源插座
目标接口的调用者
如何将一个中国的2口插头兼容这个美国的3口插座
Usa3PinSocket 三口插头
package org.gof.structural.patterns1.adapter.objectadapter.socket;
import org.gof.structural.patterns1.adapter.objectadapter.plug.api.IUsa3PinPlug;
public class Usa3PinSocket {
public void play(IUsa3PinPlug usa3PinPlug) {
usa3PinPlug.runUsa3Pin();
}
// 破坏掉已有的组件, 强行提供对新接口的支持,但是如果这个类不是我们能够修改的代码,情况就有些不一样
/* public void play(IChina2PinPlug china2PinPlug) {
china2PinPlug.runChina2Pin();
}*/
}
适配与被适配的类型
IChina2PinPlug 两口插头
package online.javabook.gof.structural.patterns1.adapter.objectadapter.plug.api;
public interface IChina2PinPlug {
public void runChina2Pin();
}
China2PinPlug
package online.javabook.gof.structural.patterns1.adapter.objectadapter.plug.impl;
import online.javabook.gof.structural.patterns1.adapter.objectadapter.plug.api.IChina2PinPlug;
public class China2PinPlug implements IChina2PinPlug {
@Override
public void runChina2Pin() {
System.out.println("I am china 2 pin plug, running");
}
}
IUsa3PinPlug
package online.javabook.gof.structural.patterns1.adapter.objectadapter.plug.api;
public interface IUsa3PinPlug {
public void runUsa3Pin();
}
Usa3PinPlug
package online.javabook.gof.structural.patterns1.adapter.objectadapter.plug.impl;
import online.javabook.gof.structural.patterns1.adapter.objectadapter.plug.api.IUsa3PinPlug;
public class Usa3PinPlug implements IUsa3PinPlug {
@Override
public void runUsa3Pin() {
System.out.println("I am usa 2 pin plug, running");
}
}
对象适配器类型
China2PinPlugToUsa3PinPlugAdapter
package online.javabook.gof.structural.patterns1.adapter.objectadapter.plug.adpter;
import online.javabook.gof.structural.patterns1.adapter.objectadapter.plug.api.IChina2PinPlug;
import online.javabook.gof.structural.patterns1.adapter.objectadapter.plug.api.IUsa3PinPlug;
public class China2PinPlugToUsa3PinPlugAdapter implements IUsa3PinPlug {
// 包装一个被适配的对象
private IChina2PinPlug china2PinPlug;
public China2PinPlugToUsa3PinPlugAdapter(IChina2PinPlug china2PinPlug) {
this.china2PinPlug = china2PinPlug;
}
@Override
public void runUsa3Pin() {
china2PinPlug.runChina2Pin();
}
}
不基于对象适配器模式的实现
Main
package org.gof.structural.patterns1.adapter.objectadapter.app.bad;
import org.gof.structural.patterns1.adapter.objectadapter.plug.api.IChina2PinPlug;
import org.gof.structural.patterns1.adapter.objectadapter.plug.api.IUsa3PinPlug;
import org.gof.structural.patterns1.adapter.objectadapter.plug.impl.China2PinPlug;
import org.gof.structural.patterns1.adapter.objectadapter.plug.impl.Usa3PinPlug;
import org.gof.structural.patterns1.adapter.objectadapter.socket.Usa3PinSocket;
public class Main {
public static void main(String[] args) {
Usa3PinSocket usa3PinSocket = new Usa3PinSocket();
IUsa3PinPlug usa3PinPlug = new Usa3PinPlug();
usa3PinSocket.play(usa3PinPlug);
IChina2PinPlug china2PinPlug = new China2PinPlug();
// 当前插座不支持该接口
//usa3PinSocket.play(china2PinPlug);
}
}
基于对象适配器模式的实现
Main
package online.javabook.gof.structural.patterns1.adapter.objectadapter.plug.app.good;
import online.javabook.gof.structural.patterns1.adapter.objectadapter.plug.adpter.China2PinPlugToUsa3PinPlugAdapter;
import online.javabook.gof.structural.patterns1.adapter.objectadapter.plug.api.IChina2PinPlug;
import online.javabook.gof.structural.patterns1.adapter.objectadapter.plug.api.IUsa3PinPlug;
import online.javabook.gof.structural.patterns1.adapter.objectadapter.plug.impl.China2PinPlug;
import online.javabook.gof.structural.patterns1.adapter.objectadapter.plug.impl.Usa3PinPlug;
import online.javabook.gof.structural.patterns1.adapter.objectadapter.plug.socket.Usa3PinSocket;
public class Main {
public static void main(String[] args) {
Usa3PinSocket usa3PinSocket = new Usa3PinSocket();
IUsa3PinPlug usa3PinPlug = new Usa3PinPlug();
usa3PinSocket.play(usa3PinPlug);
IChina2PinPlug china2PinPlug = new China2PinPlug();
// 通过对象适配器兼容已有接口
IUsa3PinPlug adapter = new China2PinPlugToUsa3PinPlugAdapter(china2PinPlug);
usa3PinSocket.play(adapter);
}
}
Console
I am usa 2 pin plug, running
I am china 2 pin plug, running