任何人都能用一个很好的例子向我解释可插拔适配器的概念吗?

时间:2009-01-16 03:38:09

标签: language-agnostic design-patterns adapter

有没有人可以通过很好的例子向我解释可插拔适配器的概念?

3 个答案:

答案 0 :(得分:13)

根据我对Google结果的快速阅读理解,可插拔适配器是一种不针对特定适配器进行硬编码的适配器。表面上(适配器自己的接口),它们都是相同的,但它可以适应不同的接口不同的适配器。我发现this thread很有说服力:

  

基本上,它允许你放入   适配器(接收器)时的适配器   协议在编译时是未知的   通过使用反射。当你创建   适配器实例,你传递它   适应者呼叫方法的名称,   以及必要的任何元数据   翻译输入类型。当。。。的时候   适配器接收方法调用   目标界面,它使用反射   调用相应的方法   适应者指定。

this

  

Viewer的主要职责   是从域填充小部件   模型没有做出任何假设   关于域名本身。 JFace查看器使用   委托对象机制   可插拔适配器模式实现   以上要求。

Facehugger in action

将其视为来自Alien的面孔师;当它拥抱一张脸时,你所看到的只是脸部的黏糊糊的背部。你可以用棍子戳它并试图撬开它的手臂(适配器接口)。但它基本上可以拥抱任何人(适应者)的脸,无论面部特征如何。也许我正在推动它,但是,嘿,我喜欢Alien。

答案 1 :(得分:3)

您可以阅读有关适配器/可插拔模式的this article

本文的目录:

* 1 Design Patterns
* 2 Intent of Adapter
* 3 Motivation
* 4 Structure
* 5 Applicability
* 6 Consequences
* 7 Implementation
      o 7.1 Known Uses and Sample Code
      o 7.2 Related Patterns
* 8 Conclusions
* 9 Appendix
      o 9.1 References
      o 9.2 Glossary

引用:

  

Smalltalk介绍了一个概念   “可插拔适配器”来描述   具有内置接口的类   适应。这个有趣的概念   允许引入类   进入可能的现有系统   期望不同的接口   类。这种技术可以帮助促进   跨模块甚至可以重用类   项目

这是一个小例子:

我们有两个班级 - Foo& Boo输出一些字符串到控制台。 Adapter类可以调整两个类的方法,以提供客户端所需的接口(SaySomething)。请注意,不依赖于接口名称 - 我们可以轻松地调整SayHey和Bark方法。

class Foo 
{
    public static void SayHey() { Console.WriteLine("Hey!"); }
}

class Boo 
{
    public static void Bark() { Console.WriteLine("Woof!"); }
}

class Adapter 
{
    public Action SaySomething { get; private set;} // "pluggable" adapter

    public Adapter(Action saySomethingAction) 
    {
        SaySomething = saySomethingAction;
    }
}

class Program
{
    static void Main(string[] args)
    {
        (new Adapter(Foo.SayHey)).SaySomething();
        (new Adapter(Boo.Bark)).SaySomething();
    }
}

答案 2 :(得分:0)

可插拔适配器的区别特征是客户端调用的方法和接口中存在的方法可能不同。

 interface Ilegacy
    {
        float calculate(int a, int b);
    }
    class Legacy : Ilegacy
    {
        public float calculate(int a, int b)
        {
            return a * b;
        }
    }
    class Adapter
    {
        public Func<int, int, float> legacyCalculator;
        public Adapter()
        {
            this.legacyCalculator = new Legacy().calculate;
        }
    }
    class Client
    {
        static void Main()
        {
            float result = new Adapter().legacyCalculator(5, 6);
        }
    }

通常可以在C#

中使用delegate,Func或Action来实现