какой дизайн шаблона использовать - PullRequest
0 голосов
/ 15 марта 2011

Мне нужно сделать сайт, на котором будет платное членство с разными уровнями членства.На основе уровня участников они будут иметь доступ к определенным функциям.Есть ли шаблон дизайна, который я мог бы использовать для этого?

Ответы [ 7 ]

3 голосов
/ 15 марта 2011

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

Вы должны на время забыть о шаблонах проектирования и сосредоточиться на своей цели, на том, какую проблему вы пытаетесь решить. Затем попытайтесь решить ее, и тогда, возможно, не будет необходимости использовать какой-либо шаблон. И, возможно, вы поймете, что с архитектурой что-то не так, только тогда вам следует подумать о рефакторинге и шаблонах.

3 голосов
/ 15 марта 2011

Я рекомендую вам прочитать больше о шаблонах проектирования и OOAD и понять реальную цель шаблонов проектирования.Ваше приложение является очень смутным примером применения шаблонов непосредственно к нему.использование шаблонов зависит от различных аспектов внутри приложения, а не от приложения в целом.

2 голосов
/ 15 марта 2011

То, что вы описываете, не имеет ничего общего с объектно-ориентированным шаблоном проектирования, но имеет отношение к управлению доступом.Если у вас есть тонны иерархического доступа, я предлагаю использовать управление доступом на основе ролей, в противном случае придерживайтесь списков ACL.

1 голос
/ 15 марта 2011

Взгляните на MVC, .net предлагает несколько примеров и то, что работало для нас в прошлом

0 голосов
/ 16 марта 2011

То, что вы хотите, это Цепочка ответственности шаблон проектирования.

Вот пример на C #:

using System;

internal sealed class Program
{
    private static void Main()
    {
        // Setup Chain of Responsibility.
        Approver larry = new Director();
        Approver sam   = new VicePresident();
        Approver tammy = new President();

        larry.Successor = sam;
        sam.Successor   = tammy;

        Purchase purchase;

        // Generate and process purchase requests.
        purchase = new Purchase { 
          Number = 2034, Amount = 350.00, Purpose = "Supplies" };

        larry.ProcessRequest(purchase);

        purchase = new Purchase { 
          Number = 2035, Amount = 32590.10, Purpose = "Project X" };

        larry.ProcessRequest(purchase);

        purchase = new Purchase { 
          Number = 2036, Amount = 122100.00, Purpose = "Project Y" };

        larry.ProcessRequest(purchase);

        // Wait for user.
        Console.ReadKey();
    }
}

// Purchase event argument holds purchase info.
internal sealed class PurchaseEventArgs : EventArgs
{
    public Purchase Purchase { get; set; }
}

/// <summary>
/// The 'Handler' abstract class.
/// </summary>
internal abstract class Approver
{
    // Purchase event .
    public event EventHandler<PurchaseEventArgs> Purchase;

    // Purchase event handler.
    public abstract void PurchaseHandler(Object sender, PurchaseEventArgs e);

    // Constructor.
    public Approver()
    {
        Purchase += PurchaseHandler;
    }

    public void ProcessRequest(Purchase purchase)
    {
        OnPurchase(new PurchaseEventArgs { Purchase = purchase });
    }

    // Invoke the Purchase event.
    public virtual void OnPurchase(PurchaseEventArgs e)
    {
        if (Purchase != null)
        {
            Purchase(this, e);
        }
    }

    // Sets or gets the next approver.
    public Approver Successor { get; set; }
}

/// <summary>
/// The 'ConcreteHandler' class.
/// </summary>
internal sealed class Director : Approver
{
    public override void PurchaseHandler(Object sender, PurchaseEventArgs e)
    {
        if (e.Purchase.Amount < 10000.0)
        {
            Console.WriteLine("{0} approved request# {1}",
                this.GetType().Name, e.Purchase.Number);
        }
        else if (Successor != null)
        {
            Successor.PurchaseHandler(this, e);
        }
    }
}

/// <summary>
/// The 'ConcreteHandler' class.
/// </summary>
internal sealed class VicePresident : Approver
{
    public override void PurchaseHandler(Object sender, PurchaseEventArgs e)
    {
        if (e.Purchase.Amount < 25000.0)
        {
            Console.WriteLine("{0} approved request# {1}",
                this.GetType().Name, e.Purchase.Number);
        }
        else if (Successor != null)
        {
            Successor.PurchaseHandler(this, e);
        }
    }
}

/// <summary>
/// The 'ConcreteHandler' class.
/// </summary>
internal sealed class President : Approver
{
    public override void PurchaseHandler(Object sender, PurchaseEventArgs e)
    {
        if (e.Purchase.Amount < 100000.0)
        {
            Console.WriteLine("{0} approved request# {1}", 
                sender.GetType().Name, e.Purchase.Number);
        }
        else if (Successor != null)
        {
            Successor.PurchaseHandler(this, e);
        }
        else
        {
            Console.WriteLine("Request# {0} requires an executive meeting!", 
                e.Purchase.Number);
        }
    }
}

/// <summary>
/// Class that holds request details.
/// </summary>
internal sealed class Purchase
{
    public Double Amount   { get; set; }
    public String Purpose  { get; set; }
    public Int32  Number   { get; set; }
}

Надежда, которая помогает.

0 голосов
/ 15 марта 2011

На самом простом уровне у вас может быть перечисление, называемое, например, «Feature», и класс «Member» содержит список «Feature», на которые он / она имеет право.

Вы можете решить:сохраняйте их как флаги в базе данных, как кто-то предложил.

Если сложность возрастает, вы можете сделать 'Feature' полноценной иерархией классов, например, иметь интерфейс IFeature.Вы можете реализовать конкретные классы для IFeatures.Ваш объект 'Member' будет содержать список IFeature (s)

0 голосов
/ 15 марта 2011

Я предлагаю избегать наследования пользователей и выбирать пользователей с флагами в объекте, обозначающем права доступа.ОО - это хорошо, но гораздо проще работать с флагами в простом объекте, особенно при работе с веб-сайтами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...