java - 如何 'wrap' 两个具有相同方法的类?

标签 java oop design-patterns

我必须处理两个具有相同方法的类,但它们不实现相同的接口(interface),也不扩展相同的父类(super class)。我不能/不允许更改这个类,我不构造这个类的实例,我只得到这个的对象。 避免大量代码重复的最佳方法是什么?

类(class)之一:

package faa;

public class SomethingA {

    private String valueOne = null;
    private String valueTwo = null;

    public String getValueOne() { return valueOne; }
    public void setValueOne(String valueOne) { this.valueOne = valueOne; }

    public String getValueTwo() { return valueTwo; }
    public void setValueTwo(String valueTwo) { this.valueTwo = valueTwo; }
}

还有一个……

package foo;

public class SomethingB {

    private String valueOne;
    private String valueTwo;

    public String getValueOne() { return valueOne; }
    public void setValueOne(String valueOne) { this.valueOne = valueOne; }

    public String getValueTwo() { return valueTwo; }
    public void setValueTwo(String valueTwo) { this.valueTwo = valueTwo; }
}

(实际上这些类更大)

我现在唯一的想法是在其中创建一个包装类:

public class SomethingWrapper {

    private SomethingA someA;
    private SomethingB someB;

    public SomethingWrapper(SomethingA someA) {
        //null check..
        this.someA = someA;
    }

    public SomethingWrapper(SomethingB someB) {
        //null check..
        this.someB = someB;
    }

    public String getValueOne() {
        if (this.someA != null) {
            return this.someA.getValueOne();
        } else {
            return this.someB.getValueOne();
        }
    }

    public void setValueOne(String valueOne) {
        if (this.someA != null) {
            this.someA.setValueOne(valueOne);
        } else {
            this.someB.setValueOne(valueOne);
        }
    }

    public String getValueTwo() {
        if (this.someA != null) {
            return this.someA.getValueTwo();
        } else {
            return this.someB.getValueTwo();
        }
    }

    public void setValueTwo(String valueTwo) {
        if (this.someA != null) {
            this.someA.setValueTwo(valueTwo);
        } else {
            this.someB.setValueTwo(valueTwo);
        }
    }
} 

但我对这个解决方案并不十分满意。有没有更好/更优雅的方法来解决这个问题?

最佳答案

更好的解决方案是创建一个接口(interface)来表示两个类的统一接口(interface),然后编写两个实现该接口(interface)的类,一个包装 A,另一个包装 B:

public interface SomethingWrapper {
    public String getValueOne();
    public void setValueOne(String valueOne);
    public String getValueTwo();
    public void setValueTwo(String valueTwo);
};

public class SomethingAWrapper implements SomethingWrapper {

    private SomethingA someA;

    public SomethingWrapper(SomethingA someA) {
        this.someA = someA;
    }

    public String getValueOne() {
        return this.someA.getValueOne();
    }

    public void setValueOne(String valueOne) {
        this.someA.setValueOne(valueOne);
    }

    public String getValueTwo() {
        return this.someA.getValueTwo();
    }

    public void setValueTwo(String valueTwo) {
        this.someA.setValueTwo(valueTwo);
    }
};

然后是 SomethingBWrapper 的另一个类。

关于java - 如何 'wrap' 两个具有相同方法的类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11484169/

相关文章:

java - Clojure:类 CSS/DOM 的 Java UI

java - 从 java web 应用程序轮询数据库表更新的最佳方法

java - 在数据库中保留java实体

java - 将 JSON Base64 字符串转换为 Java 中的 String

java - 为什么我使用 JXDatePicker 类时出现错误

c++ - C++ 类的私有(private)成员和 protected 成员有什么区别?

php - Zend Framework 如何优化模型?

c++ - 比工厂更好的设计模式?

java - 软件分析....从 UML 或设计模式开始?

design-patterns - INTERPRETER 是反模式吗?