7

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

4

3 回答 3

14

根据我对 Google 结果的快速阅读理解,可插拔适配器是一种没有针对特定适配器进行硬编码的适配器。表面上看(适配器自己的接口),都是一样的,但是可以适应不同的适配器,不同的接口。我发现这个线程非常解释:

基本上,它允许您通过使用反射在编译时不知道适配器(接收器)协议时放入适配器。当您创建适配器实例时,您将要调用的适配器方法的名称以及转换输入类型所需的任何元数据传递给它。当适配器接收到目标接口的方法调用时,它使用反射来调用适配器上指定的相应方法。

这:_

Viewer 的主要职责是从域模型中填充小部件,而不对域本身做任何假设。JFace viewer 使用 Pluggable Adapter Pattern 中的 Delegating Objects 机制来实现上述要求。

脸拥抱者在行动

把它想象成外星人的脸拥抱者;当它拥抱一张脸时,你所看到的只是它粘糊糊的背。你可以用一根棍子戳它,然后试着撬开它的手臂(适配器接口)。但它基本上可以拥抱任何人(适应者)的脸,无论面部特征如何。也许我有点过分了,但是,嘿,我爱外星人。

于 2009-01-16T04:11:07.393 回答
3

你可以阅读这篇关于适配器/可插拔模式的文章:

本文目录:

* 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();
    }
}
于 2009-01-16T03:45:13.983 回答
0

Pluggable Adapter 的一个显着特点是客户端调用的方法和接口中存在的方法可以不同。

 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# 中使用委托、Func 或 Action 来实现

于 2016-11-19T00:24:54.903 回答