【问题标题】:Classes with template method design具有模板方法设计的类
【发布时间】:2021-08-29 06:09:34
【问题描述】:

我已经做了这四个类,我想知道我是否正确使用了模板方法设计模式,因为我真的在这个主题上苦苦挣扎。

我使用 getPrijsBehandeling() 和 getBeschrijvingBehandeling() 方法作为我的抽象类。

我还想知道是应该在我的 UML 中还是只在代码中使用抽象方法。

由于这是我第一次使用设计模式,我想知道我是否走在正确的轨道上。

public abstract class Behandeling {

    private String beschrijving;
    private double prijs;
    private int behandelingsNummer;

    private Wassen wassen;

    public Behandeling(int behandelingsNummber, int keuze) {
        this.behandelingsNummer = behandelingsNummber;

        if(keuze == 3 || keuze == 4) {
            wassen = new Wassen();
        }
    }

    public abstract double getPrijsBehandeling();

    public abstract String getBeschrijvingBehandeling();

    public double getPrijs() {
        prijs = getPrijsBehandeling();

        if(wassen != null) {
            prijs += wassen.getPrijsBehandeling();
        }
        return prijs;
    }

    public String getBeschrijving() {
        beschrijving = getBeschrijvingBehandeling();

        if(wassen != null) {
            beschrijving += wassen.getBeschrijvingBehandeling();
        }
        return beschrijving;
    }

    public int getBehandelingsNummer() {
        return behandelingsNummer;
    }
} 

------------------------------------------

public class Verven extends Behandeling {

    public Verven(int behandelingsNummer, int keuze) {
        super(behandelingsNummer, keuze);
    }

    @Override
    public double getPrijsBehandeling() {
        return 20;
    }

    @Override
    public String getBeschrijvingBehandeling() {
        return "Haren worden geverfd";
    }
}

---------------------------------------------

public class Knippen extends Behandeling{

    public Knippen(int behandelingsNummer, int keuze) {
        super(behandelingsNummer, keuze);
    }

    @Override
    public double getPrijsBehandeling() {
        return 15;
    }

    @Override
    public String getBeschrijvingBehandeling() {
        return "Haren worden geknipt";
    }
}

-----------------------------------------------------

public class Wassen {

    private double prijs;
    private String beschrijving;

    public Wassen() {
        this.prijs = 7.50;
        this.beschrijving = " en haren worden gewassen";
    }

    public double getPrijsBehandeling() {
        return prijs;
    }

    public String getBeschrijvingBehandeling() {
        return beschrijving;
    }
}

【问题讨论】:

  • 一开始我以为这是一种治疗方法,但从我的德语中猜测它是理发器的设计。芬xD
  • SO 不是为了评论,而是为了具体问题。粗略查看您的代码,我没有发现任何问题。

标签: java inheritance design-patterns uml template-method-pattern


【解决方案1】:

geefPrijs()geefBeschrijving() 的方法(也称为“操作”,用 UML 说法)确实是根据模板方法模式设计的:基类实现了通用算法,封装了可​​能需要的“原始”部分被专门化为可以被类扩展覆盖(即“专门化”,在 UML 中)的单独方法。

如果基类不能提供它自己的“部分”方法的实现,你可以把它变成抽象的。但是,尽管这是通常描述模式的方式,但实际上这不是义务:基类提供并不总是被覆盖的默认行为是完全有效的。如果有抽象元素,UML 图应该反映您在这方面的设计。

一些额外的提示

在您的设计中,getPrijs()(模板方法)和getPrijsBehandeling()(模板方法中使用的原语)都是公开的,并且名称可能会造成混淆:

  • 如果原语不打算用于其他目的,那么将其设为protected 可能是一个好主意。
  • 如果您不想使用protected,您可以使用命名约定。 GoF 建议“do”前缀的灵感来自一个无法生存的框架。我更喜欢像preparePrijsBehandeling()prepareBeschrijvingBheandeling() 这样的“准备”,因为它立即提出了“准备做什么?”的问题。防止不当使用。
  • 这里不是这样,但是当然,如​​果原语是在模板方法之外有意义的原语操作,那么就没有问题(例如:surface()perimeter()barycenter()形状的几何特征可能与某些模板方法相关,但它们本身就有意义)。

【讨论】:

  • geefPrijs 可能是极客变种 ;-) 我的荷兰语也不是那么好。
  • @qwerty_so 我有机会学习了一点那种很好的语言(Schnupperkurs),所以我忍不住把剩下的英语词根翻译成荷兰语来命名一致性并表明我理解它的含义。我曾梦想用我的母语做同样的事情,但它没有提供这么短的等价物,如果可以的话,它还需要标识符中的 unicode,这就是为什么我必须在我的代码中坚持使用英语。顺便说一句,会不会有已知的get 前缀,我会花一些时间来理解,所以混合并不是一件坏事;-)
猜你喜欢
  • 1970-01-01
  • 2017-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-02
相关资源
最近更新 更多