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, runningI am china 2 pin plug, running