具有相似行为的2个类的最佳设计模式

时间:2013-06-09 11:54:53

标签: java design-patterns

我有2个课程:

A类,包含很多功能。

Class A{
  public void a(int param1, int param2);
  public void b(String param1, int param2);
....}

B类也有相同的功能,但有些参数是多余的,

Class B{
  public void a(int param1forB){}
  public void b(String param1){}
....}

我有检查A类的测试。我也想对B类使用这些测试。

另外两个问题:

  1. B包含在某些A类中实现的函数。例如,a位于课程A1中,而功能b位于课程A2

  2. 我想最小化A中的变化(在B中,我可以改变我想要的任何东西)。

  3. 有什么想法吗?

4 个答案:

答案 0 :(得分:0)

让B扩展A,然后覆盖您希望在B中具有不同行为的方法。如果您希望通过使用重载来更改B中方法的签名,请将该方法保留为公共。并确保在进行重载时删除IDE自动添加的@override注释。 对于多重继承,你是对的java不支持多类,所以你必须选择接口来做多继承

答案 1 :(得分:0)

您可以按照Template pattern

创建模板
public abstract class templateClass
{
    public abstract void a();
    public abstract void b();
}


public class A extends templateClass
{
    public void a() {

    }

    public void b() {
    }
}

public class B extends A
{

}

答案 2 :(得分:0)

InterfaceComposition Over Inheritance可以帮助您解决问题。示例(可能存在一些语法错误,自从我使用java以来​​已经很长时间了):

public interface IFunctionA{
    void a(int param1, int param2);
    void a(int param1);
}

public interface IFunctionB{
    void b(String param1, int param2);
    void b(String param1);
}

public class FunctionA implement IFunctionA{
    public void a(int param1, int param2){
        //do the function
    }
}

// same with FunctionB

public class A{
    private IFunctionA functionA = new FunctionA();
    // same with b

    public void a(int param1, int param2){
        functionA.a(param1, param2);
    }

    //same with function b
}

答案 3 :(得分:0)

如果A类和B类的方法在行为上相似,则可以通过参数类替换参数。这将定义两个get方法(param1和param2),你需要两个构造函数,一个是A类使用的参数,B类只有一个参数(实际上有几个解决方案可以得到相同的结果)。

这样两个类都可以实现相同的接口:

public interface ABInterface {
    void a(AParams params);
    void b(BParams params);
    ...
}

public class AParams implements ABInterface {

    private int param1;
    private int param2;

    public AParams(int param1, int param2) {
        this.param1 = param1;
        this.param2 = param2;
    }

    public AParams(int param1) {
        this.param1 = param1;        
    }

    public int getParam1() {
        return param1;
    }


    public int getParam2() {
        return param2;
    }      
}

public class BParams implements ABInterface {

    private String param1;
    private int param2;

    public BParams(String param1, int param2) {
        this.param1 = param1;
        this.param2 = param2;
    }

    public BParams(String param1) {
        this.param1 = param1;        
    }

    public String getParam1() {
        return param1;
    }


    public int getParam2() {
        return param2;
    }      
}


public class A{
    public void a(AParams params) {
        ...
    }
    public void b(BParams params) {
        ...
    }
    ...
  }

public class B{
    public void a(AParams params){
       ... 
    }
    public void b(BParams params){
       ...
    }
    ...
}



public void someMethod() {
    // you can new invoke these methods like this
    a.a(new AParams(1,2));
    b.a(new AParams(1));
    // but also like this, to reuse existing code
    AParams params = new AParams(1,2);
    a.a(params);
    b.a(params);    
}