用不同类型的对象的复合模式

时间:2010-07-12 22:15:25

标签: java design-patterns composite

我想使用Composite模式将一个对象接收的调用转发给其他人。

目前,接收端的对象都是相同的Abstract类型,但障碍是他们根据具体类型(想想不同的模型)选择性地接受不同类型的对象作为参数。

据我所知,有两种解决办法,但都不令人满意:

  • 使用instanceof检测输入端的类类型对象。这通常被认为是一种不好的做法。
  • 与输入类型一样多Lists。这带来了一个问题,即必须添加List才能容纳新的输入类型,并且必须依次明确处理每个List

我一直在考虑界面,但还没有提出一个可行的想法。这个设计问题的解决方案是什么?复合材料是否合适?

P.S:这是在mvc。

的背景下

2 个答案:

答案 0 :(得分:3)

复合模式允许您将对象集合视为与叶对象相同。

我会说你可以这样做:

public interface Command
{
    void execute(Object parameter);
}

public class LeafCommand implements Command
{
    public void execute(Object parameter)
    {  
        // do something for a leaf
    }
}

public class CompositeCommand implements Command
{
    private List<Command> commands;

    void execute(Object parameter)
    {
        for (Command child : commands) 
        { 
           child.execute(parameter);
        }
    }

}

这就是Composite对我意味着什么。你是对的 - 如果你必须使用instanceof你做错了。

答案 1 :(得分:0)

我在Java Practices的StocksMonitor应用程序中找到了以下方法。这是mvc上下文中主视图的更新方法:

  public void update(Observable aObservable, Object aData) {
    fLogger.fine("Notify being broadcast...");
    if (aObservable == fCurrentPortfolio) {
      fLogger.fine("Notified by Current Portfolio...");
      synchTitleBarWithCurrentPortfolio();
    }
    else if (aObservable == fGeneralLookPrefs) {
      fLogger.fine("Notified by General Look...");
      synchGuiWithGeneralLookPrefs();
    }
  }

引用是用于有选择地更新相应视图的不同模型的实例。该方法遵循复合模式,并允许根据参数实例进行逐个处理。当然,这仅依赖于在运行时使用的模型的一个实例。