可以使用状态模式来用类型代替状态吗?
Can the state pattern be utilized to substitute types for state?
我刚刚了解了状态设计模式,我想知道将该模式应用于 "types" 是否合适。情况是这样的:我们有几种不同类型的数据导入,根据用户选择的类型,取决于我们如何导入数据。
我对状态模式的理解是,它消除了使用状态创建复杂开关 and/or if 语句的需要。像我的导入一样,我也想根据类型消除 switch/if 语句。与状态不同的是,一旦文件被导入,我将永远不会将它的状态或类型更改为另一种状态或类型。
我想删除下面的代码,这样当我们必须添加更多类型时,它会更容易维护:
//Prompt user to select import type then go below
switch (typeof(MyDataToImportType))
{
case FileLatePaymentsImport:
//Import File1
break;
case DatabaseReportsImport:
//connect to db
break;
default :
break;
}
看来您需要的是使用 Strategy 而不是 State。
您可以通过在某处设置 Dictionary<Type, IImportStrategy>
(或提供类型和 return 正确策略实例的 Factory
)来删除该开关
IImportStrategy
界面的一个例子可以是
interface IImportStrategy {
void Execute();
}
然后您将实现两个实现 class FileLatePaymentsImport IImportStrategy
和 class DatabaseReportsImport: IImportStrategy
,其中将包含特定逻辑。
当事件的影响取决于当前状态时,状态模式更适合对事件做出反应。
所以我完全同意 Sebastian Piu 的观点,策略模式更适合您的情况。
我刚刚了解了状态设计模式,我想知道将该模式应用于 "types" 是否合适。情况是这样的:我们有几种不同类型的数据导入,根据用户选择的类型,取决于我们如何导入数据。
我对状态模式的理解是,它消除了使用状态创建复杂开关 and/or if 语句的需要。像我的导入一样,我也想根据类型消除 switch/if 语句。与状态不同的是,一旦文件被导入,我将永远不会将它的状态或类型更改为另一种状态或类型。
我想删除下面的代码,这样当我们必须添加更多类型时,它会更容易维护:
//Prompt user to select import type then go below
switch (typeof(MyDataToImportType))
{
case FileLatePaymentsImport:
//Import File1
break;
case DatabaseReportsImport:
//connect to db
break;
default :
break;
}
看来您需要的是使用 Strategy 而不是 State。
您可以通过在某处设置 Dictionary<Type, IImportStrategy>
(或提供类型和 return 正确策略实例的 Factory
)来删除该开关
IImportStrategy
界面的一个例子可以是
interface IImportStrategy {
void Execute();
}
然后您将实现两个实现 class FileLatePaymentsImport IImportStrategy
和 class DatabaseReportsImport: IImportStrategy
,其中将包含特定逻辑。
当事件的影响取决于当前状态时,状态模式更适合对事件做出反应。
所以我完全同意 Sebastian Piu 的观点,策略模式更适合您的情况。