是否有可以帮助在通用显示器上配置命令的设计模式?

时间:2011-04-11 15:32:47

标签: java design-patterns

我有一个显示用户列表的显示对象,并提供了一个用于处理该列表的菜单 - 添加新用户,将它们添加到组,删除它们等等。此时显示器配置自己的菜单,因此它可以添加像doCreateNewUsers()这样的菜单命令。不幸的是,这意味着显示的每个实例总是具有“创建新”选项。

我想为不同的显示实例配置不同的菜单 - 在“用户”选项卡中,它应该包含“创建新”选项,而在“组”选项卡中,它不应该包含。我的第一个想法是外化菜单,以便我可以以不同的方式配置它。问题是,我失去了调用私有doCreateNewUsers()函数的能力!

这种情况有设计模式吗?我不喜欢将doCreateNewUsers公开的想法,因为它显示了一个不应该由外部类触发的对话框。我可以使显示抽象,以便我可以在匿名子类中定义菜单,但这种方式会影响我现在重复使用小部件的方式 - 我想在创建和初始化显示后配置菜单。我希望有一些行业标准的处理方式!

2 个答案:

答案 0 :(得分:1)

听起来我觉得你可以在这种情况下使用Strategy Pattern

答案 1 :(得分:1)

显示器可以配置自己的菜单,但前提是该操作可以封装在与菜单项关联的命令中。一旦你这样设置,你就可以在菜单中添加和删除项目,他们不需要访问私有方法,因为他们可以访问负责该操作的命令。

我认为command pattern是你的朋友。

获得命令对象后,可以使用它们创建菜单项并提供执行实际命令的方法。

如果您只是添加User个对象的列表,那么传递命令对象可能会更有意义。如果要传递表示用户集合的对象,则添加方法以公开命令对象可能是有意义的。如果是这种情况,那么你应该让你的对象实现一个接口来访问命令对象,如:

public ICommandProvider
{
    ICollection<ICommand> GetCommands();
}

然后命令可以是:

public ICommand
{
     String GetMenuText();
     void Execute();  
}

让正在显示的对象负责返回命令,这使得命令可以很容易地引用正在显示的事物,以便他们可以修改它(例如添加元素或删除元素)。 显然,确切的细节将取决于您的情况,但类似的东西应该允许您配置显示器的菜单选项,而您的显示器不需要知道正在做什么的细节。您可能需要在命令后刷新显示。