话说乾隆、和申、纪晓岚三人离京巡游,一日来到一个村庄,村子有一户人家住着一个漂亮姑娘和她的母亲老夫人。姑娘喜欢三件事情:美食、购物、旅游,但是这三件事情都是老夫人最厌恶的,她希望自己的女儿能做两件事情:读书、练字,可是姑娘一听见这些东西就头痛。
乾隆知道这些情况后想考察一下两个大臣的能力,于是他给和申、纪晓岚每人三天时间,看谁能把姑娘泡到手,让和申先来。
和申心想,这还不好办吗?我就投姑娘所好,Eating 、Shopping 、Travelling 三招把她搞定。和申他们有的是钱,第一天下来,姑娘非常满意,没想到老夫人火了,把和申臭骂了一顿,说他是个不学无术的小混混,从此再不让进门。和申的泡妞计划以失败告终。
纪晓岚心想,我可不能像和申那样,我要先和姑娘约定好暗号,出门的时候要说老夫人爱听的,实际上做的是姑娘爱做的,说一套做一套,这样两个人都可以搞定了。暗号如下:
Reading:老夫人以为是去读书,实际上出了门就去 Eating 和 Shopping 了
Writing:老夫人以为是去练字,实际上出了门就去 Travelling 了
这套暗号约定实际上就是个适配器。它把对外的接口从姑娘希望的 Eating 、Shopping 、Travelling 变成了老夫人希望的 Reading 和 Writing ,这样就可以顺利通过老夫人这一关了;但实际上做的还是姑娘希望的 Eating 、Shopping 、Travelling ,这样姑娘也满意。
哈哈,这应该就是投其所好,说一套做一套了吧!事情从表面上看是一回事,实际上内部的实现可能是另一回事。最后当然是纪晓岚赢得了芳心。
下面我们用代码来讲述这个故事吧:
Adapter.cs
using System; using System.Collections.Generic; using System.Text; namespace Adapter ... { // 姑娘希望的接口:但是由于老夫人不喜欢这些东西,不能直接使用了 public class Girl ... { public void Eating() ... { System.Console.WriteLine( " 不用装样子了,我要吃大闸蟹! " ); System.Console.WriteLine(); } public void Shopping() ... { System.Console.WriteLine( " 不用装样子了,买一件今年最流行的小背心! " ); System.Console.WriteLine(); } public void Travelling() ... { System.Console.WriteLine( " 不用装样子了,后山是个不错的地方哦! " ); System.Console.WriteLine(); } } // 老夫人希望的接口:要想约姑娘出来,必须告诉老夫人,我们是去做您喜欢的事情去了 public interface Mother ... { void Reading(); void Writing(); } // 纪晓岚和姑娘的约定,精髓就是客户喜欢什么就让他看见什么,实际上做的还是原来的那一套东西 public class Agreement : Mother ... { Girl girl = new Girl(); // 说的是去读书,那是给老夫人(客户端)看的,实际上呢? public void Reading() ... { girl.Eating(); girl.Shopping(); } public void Writing() ... { girl.Travelling(); } } }
客户端:Client.cs
using System; using System.Collections.Generic; using System.Text; namespace Adapter ... { class Client ... { static void Main( string [] args) ... { Agreement ag = new Agreement(); Console.WriteLine( " 纪晓岚:老夫人,我们去读书了! " ); Console.WriteLine( " 老夫人:乖,好好读呀! " ); ag.Reading(); Console.WriteLine(); Console.WriteLine( " 纪晓岚:老夫人,我们去练字了! " ); Console.WriteLine( " 老夫人:好呀好呀! " ); ag.Writing(); System.Console.Read(); } } }
运行结果如下图:
Copyright © fred