2

我正在处理一个非常简单的应用程序,它是学校项目的一部分。

这是一个非常基本的基于控制台的员工管理系统,您可以在其中添加 4 种类型的员工(全职、兼职、合同、季节性,所有这些都具有几个不同的属性。)

我遇到的问题是在显示用于修改特定员工类型的菜单时。

对员工类型进行 switch 语句显然是非常糟糕的设计,但是在每个员工类中添加“DisplayModificationMenu”以便它可以显示自己的菜单似乎也很糟糕,因为显示菜单似乎不是员工的适当职责对象本身。

解决此设计问题的最佳方法是什么?我考虑过创建一个 Menu 类并对每个菜单进行子类型化,以便每个菜单都可以显示自己,但即便如此,我仍然觉得类型的开关仍会在某处发生,以决定要实例化哪个菜单。

修改员工的工作流程是通过 ID 选择员工,然后应显示该员工类型的正确菜单。因此,即使使用子类型菜单,您似乎也必须在知道要实例化哪个菜单之前检查员工类型。

提前感谢您的任何建议。

4

3 回答 3

2

我认为打开对象的类型不是问题,只要它被正确封装、记录和理解。

在您的情况下,您可以 make DisplayMenuFactory,这将接受抽象员工对象并返回抽象 Menu 类。在内部,它将根据员工类型进行切换,并为每种类型返回具体的菜单类。而且,如果您最终拥有不同的工厂,它们具有相同的切换机制,您可以将它们合并在一起,并且这种切换将始终在单个类中发生。因此,为不同的员工创建不同的 UI 的责任将在这个单一的类中。

第二个选项是让 Employee 类具有 GetMenu 方法,该方法将为每个员工类型返回具体的 Menu 类型。但这是混合模型和 UI,我认为在这种情况下这是不可接受的。

于 2012-12-08T22:26:32.473 回答
1

对我来说,设计没有“完美的方式”。这取决于很多事情;项目进度、开发技术、灵活性需求等。

但是在您的示例中,如果您不想在菜单生成例程中使用 switch 语句,则可以使用装饰器模式。认为菜单是您的员工对象的一种表示形式。

所以;

1)创建一个菜单装饰的基类,并将decorateMenu函数添加到这个类中(MenuDecorator)

2)为每个员工类型(MenuPartTimeEmployee、MenuFullTimeEmployee ...等)创建子类,并为这些类实现decorateMenu函数。您可以为不同的员工类别实施不同的行为。

3)如果你没有,创建一个基 Employee 类并从这个类扩展员工子类。将装饰器实例变量添加到基 Employee 类。对于每个 Employee 子类,将合适的菜单装饰器类分配给 menuDecorator 实例变量。比如PartTimeEmployee类;

this.menuDecorator = new MenuPartTimeEmployee();

4)最后在你的菜单渲染例程中;

// get target employee
employee = ...;
employee.menuDecorator.decorateMenu(); // Render menu for employee type 

这种模式的优点是您将菜单呈现代码与实体隔离开来。因此,您可以为不同的操作系统、平台(移动设备、桌面等)实现不同的菜单类型行为。

于 2012-12-08T22:47:19.823 回答
0

创建一个名为employee的类,它具有员工的所有公共属性,所有4个类都应该扩展该类,并且如果需要更改或者如果员工的所有菜单都不同,则可以覆盖基本方法创建一个接口,所有的4个类以自己的方式实现

于 2012-12-08T22:25:49.863 回答