Object Adapter概述

Object Adapter - 图1

玩具代码案例 - 电源插座

目标接口的调用者

如何将一个中国的2口插头兼容这个美国的3口插座

Usa3PinSocket 三口插头

  1. package org.gof.structural.patterns1.adapter.objectadapter.socket;
  2. import org.gof.structural.patterns1.adapter.objectadapter.plug.api.IUsa3PinPlug;
  3. public class Usa3PinSocket {
  4. public void play(IUsa3PinPlug usa3PinPlug) {
  5. usa3PinPlug.runUsa3Pin();
  6. }
  7. // 破坏掉已有的组件, 强行提供对新接口的支持,但是如果这个类不是我们能够修改的代码,情况就有些不一样
  8. /* public void play(IChina2PinPlug china2PinPlug) {
  9. china2PinPlug.runChina2Pin();
  10. }*/
  11. }

适配与被适配的类型

IChina2PinPlug 两口插头

  1. package online.javabook.gof.structural.patterns1.adapter.objectadapter.plug.api;
  2. public interface IChina2PinPlug {
  3. public void runChina2Pin();
  4. }

China2PinPlug

  1. package online.javabook.gof.structural.patterns1.adapter.objectadapter.plug.impl;
  2. import online.javabook.gof.structural.patterns1.adapter.objectadapter.plug.api.IChina2PinPlug;
  3. public class China2PinPlug implements IChina2PinPlug {
  4. @Override
  5. public void runChina2Pin() {
  6. System.out.println("I am china 2 pin plug, running");
  7. }
  8. }

IUsa3PinPlug

  1. package online.javabook.gof.structural.patterns1.adapter.objectadapter.plug.api;
  2. public interface IUsa3PinPlug {
  3. public void runUsa3Pin();
  4. }

Usa3PinPlug

  1. package online.javabook.gof.structural.patterns1.adapter.objectadapter.plug.impl;
  2. import online.javabook.gof.structural.patterns1.adapter.objectadapter.plug.api.IUsa3PinPlug;
  3. public class Usa3PinPlug implements IUsa3PinPlug {
  4. @Override
  5. public void runUsa3Pin() {
  6. System.out.println("I am usa 2 pin plug, running");
  7. }
  8. }

对象适配器类型

China2PinPlugToUsa3PinPlugAdapter

  1. package online.javabook.gof.structural.patterns1.adapter.objectadapter.plug.adpter;
  2. import online.javabook.gof.structural.patterns1.adapter.objectadapter.plug.api.IChina2PinPlug;
  3. import online.javabook.gof.structural.patterns1.adapter.objectadapter.plug.api.IUsa3PinPlug;
  4. public class China2PinPlugToUsa3PinPlugAdapter implements IUsa3PinPlug {
  5. // 包装一个被适配的对象
  6. private IChina2PinPlug china2PinPlug;
  7. public China2PinPlugToUsa3PinPlugAdapter(IChina2PinPlug china2PinPlug) {
  8. this.china2PinPlug = china2PinPlug;
  9. }
  10. @Override
  11. public void runUsa3Pin() {
  12. china2PinPlug.runChina2Pin();
  13. }
  14. }

不基于对象适配器模式的实现

Main

  1. package org.gof.structural.patterns1.adapter.objectadapter.app.bad;
  2. import org.gof.structural.patterns1.adapter.objectadapter.plug.api.IChina2PinPlug;
  3. import org.gof.structural.patterns1.adapter.objectadapter.plug.api.IUsa3PinPlug;
  4. import org.gof.structural.patterns1.adapter.objectadapter.plug.impl.China2PinPlug;
  5. import org.gof.structural.patterns1.adapter.objectadapter.plug.impl.Usa3PinPlug;
  6. import org.gof.structural.patterns1.adapter.objectadapter.socket.Usa3PinSocket;
  7. public class Main {
  8. public static void main(String[] args) {
  9. Usa3PinSocket usa3PinSocket = new Usa3PinSocket();
  10. IUsa3PinPlug usa3PinPlug = new Usa3PinPlug();
  11. usa3PinSocket.play(usa3PinPlug);
  12. IChina2PinPlug china2PinPlug = new China2PinPlug();
  13. // 当前插座不支持该接口
  14. //usa3PinSocket.play(china2PinPlug);
  15. }
  16. }

基于对象适配器模式的实现

Main

  1. package online.javabook.gof.structural.patterns1.adapter.objectadapter.plug.app.good;
  2. import online.javabook.gof.structural.patterns1.adapter.objectadapter.plug.adpter.China2PinPlugToUsa3PinPlugAdapter;
  3. import online.javabook.gof.structural.patterns1.adapter.objectadapter.plug.api.IChina2PinPlug;
  4. import online.javabook.gof.structural.patterns1.adapter.objectadapter.plug.api.IUsa3PinPlug;
  5. import online.javabook.gof.structural.patterns1.adapter.objectadapter.plug.impl.China2PinPlug;
  6. import online.javabook.gof.structural.patterns1.adapter.objectadapter.plug.impl.Usa3PinPlug;
  7. import online.javabook.gof.structural.patterns1.adapter.objectadapter.plug.socket.Usa3PinSocket;
  8. public class Main {
  9. public static void main(String[] args) {
  10. Usa3PinSocket usa3PinSocket = new Usa3PinSocket();
  11. IUsa3PinPlug usa3PinPlug = new Usa3PinPlug();
  12. usa3PinSocket.play(usa3PinPlug);
  13. IChina2PinPlug china2PinPlug = new China2PinPlug();
  14. // 通过对象适配器兼容已有接口
  15. IUsa3PinPlug adapter = new China2PinPlugToUsa3PinPlugAdapter(china2PinPlug);
  16. usa3PinSocket.play(adapter);
  17. }
  18. }

Console

  1. I am usa 2 pin plug, running
  2. I am china 2 pin plug, running