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 - Fatal编程技术网

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

Java 具有相似行为的两个类的最佳设计模式,java,design-patterns,Java,Design Patterns,我有两门课: 类,它包含许多函数 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类也使用这些测试 另外两个问题

我有两门课:

类,它包含许多函数

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类也使用这些测试

另外两个问题:

B包含在A的某些类中实现的函数。例如,A在A1类中,函数B在A2类中

我想最小化A中的变化,而在B中,我可以改变我想要的任何东西


有什么想法吗?

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

您可以根据

接口和组合优于继承可以帮助您解决这个问题。示例可能存在一些语法错误,我使用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
}

如果类a和类B中的方法a的行为相似,则可以用参数类替换参数。这将定义两个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);    
}

你可以让B班继续上课A@kustrle:但我需要多个扩展,Java不支持它,因为问题1.class A1实现了ifcA1{};A2类实现ifcA2{};类B实现了ifcA1,ifcA2{},但我需要多个扩展,Java不支持它,因为问题1。关于问题1,什么是B实现了A的类,类永远不会实现它可以实现接口和扩展类的类。
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);    
}