1

“高级”组件是具有根据其他“低级”组件定义的行为的类。例如 Bulb 类需要 Socket 类来实现其 LightOn() 行为。

并非所有超类都是高级组件,也并非所有子类都是低级组件。因为下面的例子。

来自头部优先设计模式的模板方法模式。

public abstract class CaffeineBeverage {

    final void prepareRecipe() {
        boilWater();
        brew();
        pourInCup();
        addCondiments();
    }

    abstract void brew();

    abstract void addCondiments();

    void boilWater() {
        System.out.println("Boiling water");
    }

    void pourInCup() {
        System.out.println("Pouring int cup");
    }
}

public class Coffee extends CaffeineBeverage {

    public void brew() {
        System.out.println("Dripping Coffee through filter");
    }

    public void addCondiments() {
        System.out.println("Adding Sugar and Milk");
    }
}

在这个例子CaffeineBeverage中类有一个行为prepareRecipe()brew()这种行为需要和的子类实现addCondiments()

所以...这意味着这里CaffeineBeverage的(超类)是高级组件,Coffee(子类)是低级组件。

public class superClass {
    public go() {
        //super class implementation
    }
}

public class subClass extends superClass {
    public go() {
        //sub class implementation
    }
}

在这种情况下,superClass不需要subclass实现它的go()方法。

即使一个类具有需要子类实现它的抽象方法,也不意味着超类是高级组件。请参见下面的示例。

public abstract class superClass {
    public abstract go();
}

public class subClass extends superClass {
    public go() {
        //subclass implementation;
    }
}

main() {
    superClass s = new subClass();
    s.go();
}

这里 s 不是 superClass 对象...这里是 subClass 对象。

4

1 回答 1

1

说不是所有的超类都是子类的高级组件对吗?

是的,这样说是对的……假设您以正确的方式使用“组件”一词。事实上,作为一般规则,继承不会为组件建模。

例如:

  public abstract class Mammal extends Animal {
      ....
  }

  public class Cat extends Mammal {
      ....
  }

猫不是哺乳动物的“组成部分”,哺乳动物也不是动物的“组成部分”。这不是对“组合”或“容器”关系建模。它是对分类关系进行建模;即猫“是”哺乳动物,而哺乳动物“是”动物。


您的第一个示例有点令人困惑/困惑,因为类名和方法具有矛盾的含义(在我看来)。但看起来您正在为饮料制造设备建模。如果这是正确的,那么您真正建模的关系是“is-a”而不是“component-of”/“part-of”。


最后,不要纠结于类和继承对于现实世界的“意义”。在实践中,Java 类很少用于直接建模现实世界的事物。(您不太可能在真实程序中看到模拟猫和咖啡机的类。)继承的真正用途在于它能够为代码提供结构......而不是它能够(粗略地)模拟现实世界。

于 2012-04-22T00:11:51.110 回答