我找到了一个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)?
答案 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
接口一起使用,该接口将具有其某些方法的默认实现。这里AbstractUser
是User
的骨架实现:
public abstract class AbstractUser extends IUser
{
public abstract operation1();
public operation2(){
...
}
}
您现在可以在User
:
AbstractUser
实现
public class UserImpl extends AbstractUser implements User {
...
}
Java Collections Framework有许多骨架实现与主集合接口一起使用,以最大限度地减少实现集合接口所需的工作:AbstractSet
,AbstractList
等。
答案 3 :(得分:0)
这可能是装饰设计模式。你有一个接口,一个实现接口的抽象类。扩展抽象类(装饰器)的具体类。和另一个只实现接口(你装饰的对象)的具体类。我不确定。如果不看整个代码我就说不出来。但是,还是看看这个链接。它可能对你有帮助。
答案 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();
}