Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Java中实现可插拔适配器设计模式_Java_Design Patterns_Pluggable - Fatal编程技术网

如何在Java中实现可插拔适配器设计模式

如何在Java中实现可插拔适配器设计模式,java,design-patterns,pluggable,Java,Design Patterns,Pluggable,我知道如何实现基本的适配器设计模式,也知道C#如何使用委托实现可插拔适配器设计。但是我找不到任何用Java实现的东西。你介意指出一个代码示例吗 提前感谢。可插拔适配器模式是一种创建适配器的技术,无需为需要支持的每个适配器接口创建新类 在Java中,这类事情非常简单,但是没有任何对象与您可能在C#中使用的可插入适配器对象对应 许多适配器目标接口都是功能接口——只包含一个方法的接口 当需要将此类接口的实例传递给客户端时,可以使用lambda函数或方法引用轻松地指定适配器。例如: interface

我知道如何实现基本的适配器设计模式,也知道C#如何使用委托实现可插拔适配器设计。但是我找不到任何用Java实现的东西。你介意指出一个代码示例吗


提前感谢。

可插拔适配器模式是一种创建适配器的技术,无需为需要支持的每个适配器接口创建新类

在Java中,这类事情非常简单,但是没有任何对象与您可能在C#中使用的可插入适配器对象对应

许多适配器目标接口都是功能接口——只包含一个方法的接口

当需要将此类接口的实例传递给客户端时,可以使用lambda函数或方法引用轻松地指定适配器。例如:

interface IRequired
{
   String doWhatClientNeeds(int x);
}

class Client
{
   public void doTheThing(IRequired target);
}

class Adaptee
{
    public String adapteeMethod(int x);
}

class ClassThatNeedsAdapter
{
    private final Adaptee m_whatIHave;

    public String doThingWithClient(Client client)
    {
       // super easy lambda adapter implements IRequired.doWhatClientNeeds
       client.doTheThing(x -> m_whatIHave.adapteeMethod(x));
    }

    public String doOtherThingWithClient(Client client)
    {
       // method reference implements IRequired.doWhatClientNeeds
       client.doTheThing(this::_complexAdapterMethod);
    }

    private String _complexAdapterMethod(int x)
    {
        ...
    }
}
当目标接口有多个方法时,我们使用匿名内部类:

interface IRequired
{
   String clientNeed1(int x);
   int clientNeed2(String x);
}

class Client
{
   public void doTheThing(IRequired target);
}


class ClassThatNeedsAdapter
{
    private final Adaptee m_whatIHave;

    public String doThingWithClient(Client client)
    {
       IRequired adapter = new IRequired() {
           public String clientNeed1(int x) {
               return m_whatIHave.whatever(x);
           }
           public int clientNeed2(String x) {
               return m_whatIHave.whateverElse(x);
           }
       };
       return client.doTheThing(adapter);
    }
}

您能提供您的C#示例吗,然后我们可以帮助您将其转换为规范的Java吗?@TobiasRoland,感谢您的快速回复,它使用C#委托,但Java没有对应的委托。Java适配器模式的在线示例很多-例如,这是第一个结果,Wikipedia也有一个Java示例。你能发布你特别关注的东西吗?Java使用功能接口而不是delegates@TobiasRoland,这是关于基本适配器模式的。我知道如何实现它。PluggableAdapter和普通适配器有什么区别<代码>需要适配器的类对于每个客户端都是不同的,每个客户端都将创建一个适配器(匿名类仍然是一个类)。它的“可插拔”部分是什么?@nits.kk它是不同的,因为它是内联写的-它没有自己的名字,你不必在不同的地方写它,你也不必按照引用来查看它。这与C#版本中的重要差异相同。它是否“仍然是一个类”只与学术相关。OK,但如果您看到关于可插拔适配器的GOF书籍,您可以看到
DirectoryBrowser
/
DirectoryTreeDisplay
的明确的单独具体类。所以我的问题仍然是,这种适配器比普通适配器有什么特别之处。这本书来自《GOF:可重用面向对象软件的元素》一书,所以我想这本书是真实的,没有故事或解释,只是我需要帮助理解它。我想理解其中的例子,而不是外部不同的例子。我还提出了另一个例子。请帮助它不是特别的,但是可插拔适配器也不是特别的。他们只是用一点C#特定的糖来完成一些在其他语言中以其他方式完成的事情。他们所指的技术是相同的,但是使用smalltalk糖。不过,我会回答你的另一个问题