07

    科技2023-10-19  99

    GoF定义:将一个类的接口转换成客户端期望的另一个接口。适配器模式使得原本接口不兼容的类可以共同工作。(Convert the interface of a class into another interface that clients expect. The adapter pattern lets classes work together that couldn’t otherwise because of incompatible interfaces。)

    进一步解释:适配器在现实世界中可以看做是一个插座转换器,将原接口(被适配者 Adaptee)通过适配器(Adapter),转化成期望的目标接口(Target)。

     

    接下来举一个实际例子并用代码实现。我们以前搞科研的时候,总是倾向于把一个成果套在多个项目上,这样就可以省时省力骗经费。

    假设我们曾经做过一个自动机器人项目AutoRobot,挂靠在某科委(KeWei)的项目上,已经圆满汇报结题了。后来经过小明学弟的努力,胡扯一番家国情怀自主创新人类福祉之后,成功申请上了xx自然玄学基金(XuanXue)。验收汇报的日子一天天临近了,项目却一动不动。直到验收前一个月,老板给小明布置任务,把【KeWei】验收材料改为【XuanXue】的验收报告。小明没日没夜苦干一个月才完工。直到日后某一天,小明才明白老板的用意,是为了教他“适配器模式”,不禁流下了感激的泪水。

    我们有一个AutoRobot科研成功,通过Acceptance类验收。KeWei项目上的验收标准定义为KeWei;后来为了套用XuanXue项目,就需要符合XuanXue的验收标准。因此,我们定义了一个AcceptanceAdapter,在里面对原先的项目搞一波改头换面。

    代码描述如下:

    /** * Adapter pattern */ public class Main { public static void main(String[] args) { AutoRobot autoRobot = new AutoRobot(); KeWei keWei = new KeWei(); keWei.prologue = "欢迎各位专家莅临指导!"; new Acceptance(autoRobot).report(keWei); XuanXue xuanXue = new XuanXue(); xuanXue.prologue1 = "欢迎xuanxue界的领导专家\n"; xuanXue.prologue2 = "参与本次评审会。"; new AcceptanceAdapter(autoRobot).report(xuanXue); } } // 项目成果:机器人 class AutoRobot { private final char[] kouhao = {'\u5BCC', '\u5F3A', '\u6C11', '\u4E3B', '\u6587', '\u660E', '\u548C', '\u8C10', '\u81EA', '\u7531', '\u5E73', '\u7B49', '\u516C', '\u6B63', '\u6CD5', '\u6CBB', '\u7231', '\u56FD', '\u656C', '\u4E1A', '\u8BDA', '\u4FE1', '\u53CB', '\u5584'}; // 机器人的可供演示的技能 public void dance() { System.out.println("机器人跳舞.."); } public void readCoreSocialistValues() { System.out.println(String.valueOf(kouhao)); } } // KeWei的汇报信息 class KeWei { // 开场白 public String prologue; } // KeWei的汇报内容 class Acceptance { AutoRobot autoRobot; public Acceptance(AutoRobot autoRobot) { this.autoRobot = autoRobot; } public void report(KeWei keWei) { System.out.println(keWei.prologue); autoRobot.dance(); autoRobot.readCoreSocialistValues(); } } // XuanXue的汇报内容 class XuanXue { public String prologue1; public String prologue2; } // 适配器类,将XuanXue的汇报适配到KeWei的汇报 class AcceptanceAdapter { private Acceptance acceptance = null; private AutoRobot autoRobot; public AcceptanceAdapter(AutoRobot autoRobot) { this.autoRobot = autoRobot; } // 在此适配接口 public void report(XuanXue xuanXue) { acceptance = new Acceptance(autoRobot); KeWei keWei = new KeWei(); keWei.prologue = xuanXue.prologue1 + xuanXue.prologue2; acceptance.report(keWei); } }

     

    Processed: 0.027, SQL: 8