3

我找到了一个参考架构,其中所有域类 (POJO) 都继承了一个抽象类,而抽象类又实现了一个接口。例如:

public interface User {  
    public abstract operation1();  
    public abstract operation2();  
    ...  
}  

public abstract class AbstractUser implements User {  
    String name;  
    // only attributes
    ...
}  

public abstract class XyzUser extends AbstractUser {
    ...
}  

你们知道这个设计是不是某种图案吗?你能解释一下为什么架构是这样设计的(接口->抽象类->具体类)吗?

4

6 回答 6

3

首先了解接口、抽象类和具体类的需求。

让我们在这里举个例子:

  public interface Vehicle{
     public void startEngine();
     public void run();
  }


 public abstract class Bus implements Vehicle{
      public void startEngine(){
        System.out.println("Engine Starting of bus");
      }
 }

 public abstract class Plane implements Vehicle{
      public void startEngine(){
        System.out.println("Engine Starting of plane");
      }
 }

 public class VolvoBus extends Bus{

      public void run(){
        System.out.println("Running at 100kmp/h");
      }



 }


 public class NonACBus extends Bus{

      public void run(){
        System.out.println("Running at 50kmp/h");
      }
  }


public class Test{

 public static void main(String[] args){
        VolvoBus volvoBus=new VolvoBus();
        NonACBus nonAcbus=new NonACBus();
        volvoBus.startEngine();
        volvoBus.run();
        nonAcBus.startEngine();
        nonAcBus.run();
      }
  }

在上面的示例中,我们有总线通用的代码,无论是交流总线还是沃尔沃,所以它是在 Bus 类中编写的,但是 run() 对所有人来说并不常见,所以它不是在 Bus 类中实现,而是保持为抽象,因此它的子类将根据那里的要求实施。

我的代码会更好地解释你:)谢谢

于 2013-11-05T13:13:11.613 回答
1

在设计要扩展的代码时,标准做法是仅依赖接口。为了让扩展者的生活更轻松,样板代码被添加到扩展这些接口的抽象类中。

这是标准的 OO 实践,而不是“模式”。在几乎所有 Java Swing 小部件模型中都可以找到一个很好的示例。例如, TableModel是一个接口,旨在提供对表数据的访问,AbstractTableModel是一个抽象类,它为接口中的一些简单会计方法提供实现,而DefaultTableModel是一个具体类,它使用ArrayList.

于 2013-11-05T13:26:13.193 回答
1

这里接口User定义了一个类型:

public interface User{  
public abstract operation1();  
public abstract operation2();  
...  
}

所以这个接口的实现被称为 type User

现在您可以使用类为该接口的实现者提供实现帮助Abstract,因为接口不允许有方法实现。您可以提供一个骨架实现类来配合User接口,该接口将具有其某些方法的默认实现。这AbstractUser是 的骨架实现User

public abstract class AbstractUser extends IUser  
{ 
public abstract operation1();  
public operation2(){
...
}  
}

您现在可以User借助以下工具编写具体的实现AbstractUser

public class UserImpl extends AbstractUser implements User {
...
}

Java 集合框架有许多骨架实现与主要集合接口一起使用,以最大限度地减少实现集合接口所需的工作量:AbstractSetAbstractList等。

于 2013-11-05T13:30:10.713 回答
0

Abstract class is a generalized class for example animal is generalized because abstract method and properties are mentioned here. As many animal has common behaviors and properties.

Concrete Class is a specilized class for a dog which is inherited from animal class (generalized class) to do more specilized for dog only. here we can add some properties and method and even override it's behaviour (from generlized class)

Interface is a task based class which have only abstract methods which can be implemented in abstract class or/and in concrete class to specilized behaviours

Example code here...

    abstract class Animal {
      private String leg;

      abstract void run();
    }

    class Dog extends Animal implements Ibehaviors {

      @Override
      void run() { 
       System.out.println("dog run"); 
      }

      @Override
      void eat() { 
       System.out.println("dog eat"); 
      }

    }


    interface Ibehaviors { 
      void eat(); 
    }
于 2013-11-15T21:14:37.833 回答
0

这可能是装饰器设计模式。你有一个接口,一个实现接口的抽象类。扩展抽象类(装饰器)的具体类。和另一个只实现接口的具体类(你装饰的对象)。我不知道。如果不查看整个代码,我什么也说不出来。但是,请查看此链接。它可能会帮助你。

http://javapapers.com/design-patterns/decorator-pattern/

于 2013-11-05T13:15:23.377 回答
0

我有过这种架构实现。例如这里是代码片段

public class Category extends CategoryBase implements ICategory

另一个是

public class Functional extends CategoryBase implements ICategory

这里有趣的是CategoryBase抽象类,您在其中保留了通用属性和功能,并且您只是通过继承重用它们

于 2013-11-05T13:17:55.893 回答