确定复合图案是不是正确使用
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()
实现中,您可以使用前序、中序或后序遍历,这实际上取决于您的系统(或者可以配置)。
【讨论】:
以上是关于确定复合图案是不是正确使用的主要内容,如果未能解决你的问题,请参考以下文章
不确定我是不是正确使用急切加载,在存在的关系上获取 null
C# Composition - 不完全确定我是不是正确实施
使用 libsndfile 和 libsamplerate 的音频采样率转换器。不确定是不是正确使用函数 src_simple