Реализация шаблона стратегии - PullRequest
1 голос
/ 29 декабря 2011

Ниже приведена структура моего класса

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. Оба типа пользователей будут гидратированы из базы данных (пользователи будут инициализированы со списком разрешений по умолчанию)

AmПрав ли я при выборе этой схемы в данной ситуации?Если да, то как мне выполнить требование 4?

Большое спасибо, asolvent

1 Ответ

1 голос
/ 30 декабря 2011

Пример, который вы предоставили, на самом деле не является примером стратегии , это просто переопределение метода. Шаблон стратегии включает в себя объект контекста и объект стратегии. Несмотря на это, я бы постарался избежать соблазна применить ООП во всех возможных местах. Вместо наследования рассмотрите использование перечисления 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
  } 
 }
} 

Проблема такого типа является повторяющейся темой при использовании ООП в корпоративных приложениях, управляемых данными, и я обычно стараюсь сделать все как можно более простым. Вам действительно нужно получить базовый тип пользователя для обеспечения требуемой функциональности? Будет ли у него дополнительное поведение и свойства?

...