界面>摘要类>具体类模式

时间:2013-11-05 13:00:04

标签: java architecture

我找到了一个reference architecture,其中所有域类(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 {
    ...
}  

你们知道这个设计是不是某种模式?你能解释为什么架构是这样设计的(Interface - > Abstract Class - > Concrete Class)?

6 个答案:

答案 0 :(得分:2)

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

让我们举一个例子:

  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();
      }
  }

参见上面的例子,我们有总线的代码,无论是AC总线还是Volvo,所以它是用Bus类编写的,但run()对所有人来说并不常见,所以不是在Bus类中实现,而是保持抽象,所以它的子类将根据需要实现该基础。

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

答案 1 :(得分:1)

在设计要扩展的代码时,标准做法是仅依赖于接口。为了使扩展器更容易生命,将样板代码添加到扩展这些接口的抽象类中。

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

答案 2 :(得分:1)

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

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

因此,此类接口的实现应为User类型。

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

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

您现在可以在User

的帮助下编写具体的AbstractUser实现
public class UserImpl extends AbstractUser implements User {
...
}

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

答案 3 :(得分:0)

这可能是装饰设计模式。你有一个接口,一个实现接口的抽象类。扩展抽象类(装饰器)的具体类。和另一个只实现接口(你装饰的对象)的具体类。我不确定。如果不看整个代码我就说不出来。但是,还是看看这个链接。它可能对你有帮助。

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

答案 4 :(得分:0)

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

public class Category extends CategoryBase implements ICategory

另一个是

public class Functional extends CategoryBase implements ICategory

这里有趣的是CategoryBase抽象类,你保留了你的公共属性和功能,你只是将它们重用于继承

答案 5 :(得分:0)

抽象类是一个广义类,例如动物被概括,因为这里提到了抽象方法和属性。由于许多动物具有共同的行为和特性。

具体类是狗的特定类,它继承自动物类(广义类),仅为狗做更多的特定。在这里我们可以添加一些属性和方法,甚至覆盖它的行为(来自generlized类)

接口是一个基于任务的类,它只有抽象方法,可以在抽象类中实现,或者在具体类中实现为特定行为

这里的示例代码......

    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(); 
    }