哪个oo设计模式使用

时间:2011-03-15 14:19:53

标签: design-patterns oop

我需要创建一个网站,该网站将支付具有不同成员级别的会员资格。根据成员级别,他们可以访问某些功能。有没有我可以使用的设计模式?

7 个答案:

答案 0 :(得分:3)

我建议您阅读有关设计模式和OOAD的更多信息,并了解设计模式的真正目的。您的应用程序是直接在其上应用模式的非常模糊的情况。模式的使用取决于应用程序内部的各个方面,而不是整个应用程序。

答案 1 :(得分:3)

看起来你刚刚开始学习设计模式。 :)常见的是,当你开始学习设计模式时,你试着把它放在任何地方,你试图用模式解决每个问题,通常模式的使用成为你的目标而不是你要解决的真正问题。

你应该忘记一段时间的设计模式,专注于你的目标,你要解决的问题。然后尝试解决它,然后也许不需要使用任何模式。也许你会意识到架构出了问题,只有这样才能考虑一些重构和模式。

答案 2 :(得分:2)

您所描述的内容与面向对象的设计模式无关,但与访问控制有关。如果您有大量的分层访问,我建议使用基于角色的访问控制,否则坚持使用ACL。

答案 3 :(得分:1)

看看MVC,.net提供了一些示例以及过去对我们有用的东西

答案 4 :(得分:0)

我建议避免用户继承并选择在表示访问权限的对象中带有标记的用户。 OO很好,但在一个简单的对象中处理标记要容易得多,特别是在处理网站时。

答案 5 :(得分:0)

在最简单的层面上,你可以有一个名为例如'功能'的枚举,并让'会员'类包含他/她有权获得的'功能'列表。

您可以决定将其作为标志存储在数据库中,如同某人建议的那样。

如果复杂性增加,你可以让'Feature'成为一个完整的类层次结构,例如有一个名为IFeature的接口。您可以为IFeatures实现具体的类。然后,您的“会员”对象将包含一个IFeature列表

答案 6 :(得分:-1)

你想要的是Chain of Responsibility设计模式。

这是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; }
}

希望有所帮助。