我想使用Composite模式将一个对象接收的调用转发给其他人。
目前,接收端的对象都是相同的Abstract
类型,但障碍是他们根据具体类型(想想不同的模型)选择性地接受不同类型的对象作为参数。
据我所知,有两种解决办法,但都不令人满意:
Lists
。这带来了一个问题,即必须添加List
才能容纳新的输入类型,并且必须依次明确处理每个List
。我一直在考虑界面,但还没有提出一个可行的想法。这个设计问题的解决方案是什么?复合材料是否合适?
P.S:这是在mvc。
的背景下答案 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();
}
}
引用是用于有选择地更新相应视图的不同模型的实例。该方法遵循复合模式,并允许根据参数实例进行逐个处理。当然,这仅依赖于在运行时使用的模型的一个实例。