话说乾隆、和申、纪晓岚三人离京巡游,一日来到一个村庄,村子有一户人家住着一个漂亮姑娘和她的母亲老夫人。姑娘喜欢三件事情:美食、购物、旅游,但是这三件事情都是老夫人最厌恶的,她希望自己的女儿能做两件事情:读书、练字,可是姑娘一听见这些东西就头痛。

乾隆知道这些情况后想考察一下两个大臣的能力,于是他给和申、纪晓岚每人三天时间,看谁能把姑娘泡到手,让和申先来。

和申心想,这还不好办吗?我就投姑娘所好,EatingShoppingTravelling 三招把她搞定。和申他们有的是钱,第一天下来,姑娘非常满意,没想到老夫人火了,把和申臭骂了一顿,说他是个不学无术的小混混,从此再不让进门。和申的泡妞计划以失败告终。

纪晓岚心想,我可不能像和申那样,我要先和姑娘约定好暗号,出门的时候要说老夫人爱听的,实际上做的是姑娘爱做的,说一套做一套,这样两个人都可以搞定了。暗号如下:

Reading:老夫人以为是去读书,实际上出了门就去 EatingShopping

Writing:老夫人以为是去练字,实际上出了门就去 Travelling

这套暗号约定实际上就是个适配器。它把对外的接口从姑娘希望的 EatingShoppingTravelling 变成了老夫人希望的 Reading Writing ,这样就可以顺利通过老夫人这一关了;但实际上做的还是姑娘希望的 EatingShoppingTravelling ,这样姑娘也满意。

哈哈,这应该就是投其所好,说一套做一套了吧!事情从表面上看是一回事,实际上内部的实现可能是另一回事。最后当然是纪晓岚赢得了芳心。

下面我们用代码来讲述这个故事吧:

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();
        }

    }

}

运行结果如下图:





只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


Copyright © fred