确定复合图案是不是正确使用

Posted

技术标签:

【中文标题】确定复合图案是不是正确使用【英文标题】:determining whether the composite pattern is used properly or not确定复合图案是否正确使用 【发布时间】:2021-03-27 16:01:48 【问题描述】:

我正在尝试在 Java 中使用复合设计模式。但是,我不确定我是否有效/正确地使用了它。下面的代码是对复合设计模式的有效/正确使用吗?我有一个类 leafGoal,compositeGoal 扩展了该类。但是,他们没有实现接口,这是我在网上看到的一种常见的模式,有复合模式。这有关系吗?那我没有两个类的通用接口?它仍然是有效的复合模式吗?

public class leafGoal 

    String goalName;
    //private GoalStrategy strategy;
    GoalStrategy strategy;
    private Dungeon dungeon;
    private Inventory inventory;
public class compositeGoal extends leafGoal 

    ArrayList<leafGoal> goals = new ArrayList<leafGoal>();
    
    public compositeGoal(String goalName, GoalStrategy strategy, Dungeon dungeon, Inventory inventory) 
        super(goalName, strategy, dungeon, inventory);
    

    public void addGoal(leafGoal g) 

        goals.add(g);
    

【问题讨论】:

复合不是叶子,所以不应该扩展它;并且一个 Composite 可以包含其他 Composite,而不仅仅是 Leaf。 【参考方案1】:

很难说,因为你并没有真正提供任何代码。

您不需要复合材料的接口。 Composite 是一个简单的类,它组合了特定类型的多个对象,同时属于同一类型。示例:您的库存中有物品,它们的行为都像物品。一些项目是可以包含其他项目的包,同时也是项目本身。在这种情况下,袋子是复合材料。它们包含项目并且本身就是项目。

【讨论】:

嗯,compositeGoal 包含一个名为goals 的数组,其中包含leafGoals【参考方案2】:

您至少需要一个用于 Component 的基类/抽象类和用于 Composite 的接口。 这个想法是首先定义一个包含所有基本操作的通用抽象。然后,您可以定义另一个接口来定义 Composite 的行为。 像这样的:

public abstract class Node
    public abstract void DoSomething();


public class Leaf : Node
    public override void DoSomething()
        // I am a leaf!
    


public interface IComposite
    void AddNode(Node node);


public class InnerNode : Node, IComposite
    public override void DoSomething()
        // I am NOT a leaf!
        
        // loop over the child collection and call DoSomething()
    
    
    public void AddNode(Node node)
        // add to some inner collection
    

请注意,在InnerNode.DoSomething() 实现中,您可以使用前序、中序或后序遍历,这实际上取决于您的系统(或者可以配置)。

【讨论】:

以上是关于确定复合图案是不是正确使用的主要内容,如果未能解决你的问题,请参考以下文章

为啥我没设置任何锁屏,PIN码,安卓就显示手机已加密了

无法确定类型的复合主键排序

SpringData JPA复合主键

不确定我是不是正确使用急切加载,在存在的关系上获取 null

C# Composition - 不完全确定我是不是正确实施

使用 libsndfile 和 libsamplerate 的音频采样率转换器。不确定是不是正确使用函数 src_simple