java—确定是否正确使用了复合模式

vq8itlhq  于 2021-06-29  发布在  Java
关注(0)|答案(2)|浏览(293)

我尝试在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);
    }
jc3wubiy

jc3wubiy1#

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

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() 实现您可以使用前序、中序或后序遍历,这实际上取决于您的系统(或者可以配置)。

irlmq6kh

irlmq6kh2#

很难说,因为你没有真正提供任何代码。
复合不需要接口。复合对象只是一个类,它将某一类型的多个对象组合在一起,同时又是同一类型的对象。示例:您的库存中有项目,它们的行为都类似于项目。有些物品是可以装其他物品的袋子,而本身就是物品。这种袋子是复合材料的。它们包含项目,并且是项目本身。

相关问题