Java 中同一类的继承和组合



我在github上找到了以下代码:

public class DummySSLSocketFactory extends SSLSocketFactory {
    private static final Logger LOG = LoggerFactory.getLogger(DummySSLSocketFactory.class);
    private SSLSocketFactory factory;
    public DummySSLSocketFactory() {
        try {
            SSLContext sslContext = SSLContext.getInstance("TLS");
            TrustManager[] trustManagers = new TrustManager[] {new DummyTrustManager()};
            sslContext.init(null, trustManagers, new java.security.SecureRandom());
            factory = sslContext.getSocketFactory();
        } catch (Exception e) {
            throw new RuntimeCamelException("Error creating DummySSLSocketFactory: " + e.getMessage(), e);
        }
    }
    /**
     * Must provide this getDefault operation for JavaMail to be able to use this factory.
     */
    public static SocketFactory getDefault() {
        LOG.warn("Camel is using DummySSLSocketFactory as SSLSocketFactory (only to be used for testing purpose)");
        return new DummySSLSocketFactory();
    }
    public String[] getDefaultCipherSuites() {
        return factory.getDefaultCipherSuites();
    }
    public String[] getSupportedCipherSuites() {
        return factory.getSupportedCipherSuites();
    }
    public Socket createSocket(Socket socket, String host, int port, boolean autoClose) throws IOException {
        return factory.createSocket(socket, host, port, autoClose);
    }
    public Socket createSocket(String host, int port) throws IOException {
        return factory.createSocket(host, port);
    }
    public Socket createSocket(String host, int port, InetAddress localAddress, int localPort)
        throws IOException {
        return factory.createSocket(host, port, localAddress, localPort);
    }
    public Socket createSocket(InetAddress host, int port) throws IOException {
        return factory.createSocket(host, port);
    }
    public Socket createSocket(InetAddress address, int port, InetAddress localAddress, int localPort)
        throws IOException {
        return factory.createSocket(address, port, localAddress, localPort);
    }
    public Socket createSocket() throws IOException {
        // must have this createSocket method
        return factory.createSocket();
    }
}

类似的实现在不同的项目中被广泛使用。我试图弄清楚同时使用继承和组合的目的是什么。看起来只要有一个返回sslContext.getSocketFactory();结果的工厂方法就足够了,因为它根本不扩展类。

我不知道

谁编写这段代码的确切意图是什么,但是在这个类组织中很明显,使用组合和继承,DummySSLSocketFactory可以使用SSLSocketFactory中实现的受保护方法,甚至是上面的类(使用super(。
这是可能的,因为DummySSLSocketFactory具有对其父类的引用SSLSocketFactory

 private SSLSocketFactory factory;

设置在DummySSLSocketFactory的costructor中

factory = sslContext.getSocketFactory();

如果没有这个参考,你将能够使用super访问SSLSocketLayer,但不能使用更高的类。

这是一种常见的模式(如您所提到的(。

子类可以扩展类(或实现接口(以建立"is-a"关系。在您的示例中, DummySSLSocketFactorySSLSocketFactory."is-a"关系允许多态性。

子类可能不希望完全重写(或在接口的情况下实现(方法,因此,它使用组合来获取已经覆盖了无趣但必需的方法的东西。为了实现这一目标,子类将对"不有趣"(我的术语在那里(方法的调用转发给组合成员。在您的示例中,原始类SSLSocketFactory提供了DummySSLSocketFactory类不感兴趣的内容的"默认"实现。

将调用转发到组合成员是代理模式的变体。 它不是完整的代理,因为它会更改功能。

相关内容

  • 没有找到相关文章

最新更新