Java 如何在更改接口时最小化要修改的类的数量

Java 如何在更改接口时最小化要修改的类的数量,java,design-patterns,Java,Design Patterns,有一个接口Accountable,它有两种方法。有9个类实现了可问责的接口 public interface Accountable{ boolean isAccountable(); float getWorth(); } 我们有如下新要求: 还要向接口添加两个方法声明。但是我们需要最小化对现有类的影响。 有人告诉我,我们可以使用适配器来解决这个问题。但我不知道怎么做。 有人能帮我解决这个问题吗?使用java 8,您可以在界面中声明默认实现: public interface

有一个接口
Accountable
,它有两种方法。有9个类实现了
可问责的
接口

public interface Accountable{
    boolean isAccountable();
    float getWorth();
}
我们有如下新要求: 还要向接口添加两个方法声明。但是我们需要最小化对现有类的影响。 有人告诉我,我们可以使用适配器来解决这个问题。但我不知道怎么做。
有人能帮我解决这个问题吗?

使用java 8,您可以在界面中声明默认实现:

public interface Accountable{
  boolean isAccountable();
  float getWorth();
  default int someMethod() {return 0;}
}

如果您使用旧java,唯一的方法就是添加一个抽象类作为中间件,但是由于java不支持多重继承,这可能会很痛苦。

避免向接口添加方法,而是创建从第一个接口继承的新接口。。现在您的新类将实现新接口。因此只有最小的更改。

我想目标是了解适配器。要使用适配器,首先需要创建一个适配器:

public class AccountableAdapter implements Accountable{
    @Override
    boolean isAccountable(){ return false; }
    @Override
    float getWorth(){ return (float)0.0 }
}
然后,您的类扩展该适配器。您可以看到,它们将自动实现从适配器继承默认实现的接口的所有方法

如果以后该接口添加了一个方法,则只需在适配器中添加一个实现。所有扩展类都不会中断

当然,在此之前,您只有默认实现。现在,您将覆盖所有需要在具体类中具有特殊实现的方法


就我个人而言,我发现这是学习适配器的一个相当糟糕的例子。一个更好的“现实生活”示例是事件处理程序。例如它为您提供了各种可能的鼠标事件回调。通过使用适配器,您可以只实现您真正需要的侦听器,而不必实现整个接口。

我喜欢这一点,大多数人不知道接口的功能及其用途,接口是开发的最佳选择,已经为您的问题发明了解决方案,使用了设计模式

你的界面改变了

public interface Accountable <E> { 

 //method commun all class  
 public boolean isAccountable();

 public float getWorth();

 //method commun all class     
 public int someMethod();

 //method commun all class
 public E getSameCommun();
}
公共接口{
//方法common all类
公共布尔值是可计算的();
公共浮点数getWorth();
//方法common all类
公共int方法();
//方法common all类
公共E getSameCommun();
}
这是一个通用的实现

public abstract class Generic<T extends Serializable> implements<T>{

    private boolean accountable;

    @Override
    public boolean isAccountable(){
       return 
    }

    @Override
    public int someMethod(){
        System.out.println("do samethink");
    }

    @Override
    public E getSameCommun(){
      System.out.println("do samethink");
    }

}
公共抽象类泛型实现{
私营部门;
@凌驾
公共布尔值可计算(){
返回
}
@凌驾
公共int方法(){
System.out.println(“dosamethink”);
}
@凌驾
公共E GetSameCommum(){
System.out.println(“dosamethink”);
}
}
在课堂上使用

public class Class1 extends Generic<Class1> implements Accountable<Class1>{

   //that moment you bring 3 method of the Generic
   // you need implement specific method of class
   @Override
   public float getWorth(){
      //so something
    }
}

//other class
public class Class2 extends Generic<Class2> implements Accountable<Class2>{

   //that moment you bring 3 method of the Generic
   // you need implement specific method of class
   @Override
   public float getWorth(){
      //so something
    }
}

//other class
public class Class3 extends Generic<Class3> implements Accountable<Class3>{

   //that moment you bring 3 method of the Generic
   // you need implement specific method of class
   @Override
   public float getWorth(){
      //so something
    }

   //that case you need overred same method commun
   @Override
   public E getSameCommun(){
          System.out.println("do other samethink");
   }
}


//other class, you need additional functionality for method
public class Class3 extends Generic<Class3> implements Accountable<Class3>{

   //that moment you bring 3 method of the Generic
   // you need implement specific method of class
   @Override
   public float getWorth(){
      //so something
    }

   //that case you need overred same method commun
   @Override
   public E getSameCommun(){
          super.getSameCommun();
          System.out.println("additional functionality");
         return e;
   }
}
public类Class1扩展了泛型实现{
//那个一刻你们带来了3种通用的方法
//您需要实现类的特定方法
@凌驾
公共浮点数getWorth(){
//所以
}
}
//其他类
公共类Class2扩展了泛型实现{
//那个一刻你们带来了3种通用的方法
//您需要实现类的特定方法
@凌驾
公共浮点数getWorth(){
//所以
}
}
//其他类
公共类Class3扩展了泛型实现{
//那个一刻你们带来了3种通用的方法
//您需要实现类的特定方法
@凌驾
公共浮点数getWorth(){
//所以
}
//这种情况下,你需要高估同样的方法
@凌驾
公共E GetSameCommum(){
System.out.println(“做其他samethink”);
}
}
//在其他类中,您需要方法的附加功能
公共类Class3扩展了泛型实现{
//那个一刻你们带来了3种通用的方法
//您需要实现类的特定方法
@凌驾
公共浮点数getWorth(){
//所以
}
//这种情况下,你需要高估同样的方法
@凌驾
公共E GetSameCommum(){
super.getSameCommun();
System.out.println(“附加功能”);
返回e;
}
}

“设计模式”的相同目标请忽略代码中的
,不要使用此界面。然后,当您更改接口时,您不必修改任何类。使用Java 8,您可以使用默认方法,并在接口级别添加默认实现。在新接口(a)和“近9个类”中编写新方法。。。那么你的意思是8吗?这将如何解决接下来的问题?将有更多的方法声明添加到接口中。@B'bekShakya单点更改。您只需要在适配器中添加默认实现。所有基于“旧”接口实现的具体类都不需要更改。现在我明白了,先生。感谢您编辑您的答案。@B'bekShakya在Java 8中,您可能会求助于界面中的默认实现。但是适配器对于其他用途来说仍然是一种有效的模式。。立即修复设计模式请不要使用Java代码段,它们仅用于html/css/javascript。使用普通的代码块。我尝试使用
,但是我的文本中有无效字符的问题,你告诉我你可以吗