为我的具体问题实施战略模式

时间:2014-11-23 20:11:40

标签: java design-patterns strategy-pattern

对于学校作业,我有一个实施策略模式,我完全理解具有界面和上下文的模式,根据所要求的内容获得正确的策略,但我似乎无法弄清楚如何用我的具体问题来实现它。

问题:

给出一个解决方案的设计(带有UML-classdiagram),它解决了以下问题:一个系统管理一些厨师(使用类厨师为此)。这些厨师中的一些人需要与其他厨师不同的东西以便为烹饪会议做好准备,这样厨师就可以区分其他人并且能够服务于不同的环境。该系统由一系列与许多厨师合作的餐馆使用。根据有限的准备组合来组合正确的厨师是很重要的,应该很容易去除某种类型的厨师或添加新的厨师。 在调用cook上的方法prepare()之后,您的解决方案应该能够显示不同的步骤。 一些例子:厨师Jeroen只需要“穿上围裙”,这也是大多数其他厨师所做的。但是,克里斯蒂安厨师需要“穿上围裙,拿一把刀,并设置一些古典音乐”。 Nini和Leo的厨师需要“打开啤酒并开启一些硬壳”。 注意:某些操作需要与其他类交互(它们不必在您的解决方案中明确包含),因此仅添加String-attribute“准备”是不够的!

我的猜测是preperation是战略界面,不同种类的预备是ConcreteStrategies(每个例子在这里找到:http://upload.wikimedia.org/wikipedia/commons/3/39/Strategy_Pattern_in_UML.png),而cook是本例中的上下文

希望你能为我提供一些启示(我更倾向于提示正确的方向,而不是完整的解决方案)

编辑:替换了我对问题的解释并插入了原始文本

1 个答案:

答案 0 :(得分:0)

你走在正确的轨道上。每个Cook都应该有一个Preparation接口列表。我建议有一个厨师的构造函数,它取一个列表而不是一个setter。准备界面应该有办法获得制剂的描述,例如getDescription()。然后,可以创建一个实现,例如PutApronOnPreparation,它可以有一个名为description的String成员,也可以从构造函数中设置。这就是它的样子:

class PutApronOnPreparation implements Preparation {
    private final String description;

    public PutApronOnPreparation(String description) {
        this.description = description;
    }

    @Override
    public getDescription() {
        return description;
    }
}

现在,如果您的Cook实例已使用这些Preparation实施的列表进行初始化,则其prepare()方法可以遍历列表并调用getDescription()对于他们每个人。

最后,要搜索多个Cook个实例,您可以使用另一个方法,例如hasPreparation(...),它可以接受字符串参数,并迭代准备列表并检查{{1} value包含该字符串。或者,它可以将Preparation作为参数,并且,如果您已重写equals()方法,则可以直接匹配对象。