战略模式实施

时间:2011-12-29 08:45:35

标签: design-patterns polymorphism strategy-pattern

以下是我班级的结构

public abstract class BaseUser
{
    protected List<Perm> permissions;
    public abstract void AddPerm(Perm perm);
}

public class NormalUser : BaseUser
{
    public override void AddPerm(Perm perm)
    {
        throw new InvalidOperationException("A normal user cant add permissions");
    }
}

public class SpecialUser : BaseUser
{
    public override void AddPerm(Perm perm)
    {
        if(permissions==null) permissions=new List<Perm>();
            this.permissions.Add(perm);
    }
}

class Container
{
    List<BaseUser> users;
}

需要什么:

  1. 容器将保留两种类型的用户
  2. SpecialUser将具有添加权限的功能 - 完成
  3. 不允许普通用户添加权限 - 完成

    我选择了战略模式来实现上述目标

    我无法实现的是

  4. 两种类型的用户都将从数据库中保存(用户将使用默认权限列表进行初始化)

  5. 在这种情况下我选择这种模式是对的吗?如果是,那么我该如何解决要求4?

    非常感谢, asolvent

1 个答案:

答案 0 :(得分:1)

您提供的示例实际上不是strategy pattern的实例,它只是一种方法覆盖。策略模式涉及上下文对象和策略对象。无论如何,我会尽量避免在所有可能的地方应用OOP的诱惑。而不是继承考虑使用UserType枚举和简单的if语句来支持所需的行为。这样可以更轻松地映射到数据库并保持代码简单:

enum UserType {
 Normal,
 Special
}

class User {

public UserType Type { get; set; }  

public override void AddPerm(Perm perm){
  switch (this.Type) {
 // logic goes here
  } 
 }
} 

这种类型的问题是在企业数据驱动的应用程序中使用OOP的一个反复出现的主题,我通常会尽量保持简单。您真的需要派生基本用户类型来提供所需的功能吗?它会有其他行为和属性吗?