正确设计类层次结构

时间:2013-11-09 15:24:48

标签: c# class design-patterns hierarchy

我正在尝试在C#中设计一个类层次结构,以正确建模我的应用程序模型。 问题是我不确定哪种方法是正确的。

假设我有一个Order类,它应该是所有订单类型的基础(抽象)类,以及我在使用订单时使用的引用类型。订单类只有一个“重要”方法:让我们称之为order.PlaceOrder(),但订单可能需要执行(或不执行)多个(正交)需求:记录订单的放置,放置异步订单(PlaceOrder方法立即返回)和其他。

现在,我想制作可以支持任何这些要求的实际具体类。例如:     GoogleOrder类:LoggedOrder,AsyncOrder等     class AppleOrder:AsyncOrder     class MicrosoftOrder:Order

问题是:如果我想通过从所有“策略”派生来创建这样的类,那么它们全部(但是一个)必须是接口,而我希望继承实际的实现并避免复制/粘贴代码,我不知道该怎么做。

我来自C ++背景,我可以从多个基类派生(或者可能使用基于策略的设计,如Andrei Alexandrescu在他的书中描述的那样),但在C#中我不知道该怎么做,尽管这似乎是一个非常普遍的问题,我现在应该知道这个问题。

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:0)

看起来您的设计需要“装饰器模式”,装饰器模式可以灵活地动态添加职责/角色,但是您可以使用不同的组合而不是使用继承。

以下是如何实现装饰器的示例:

http://alagesann.com/2013/08/16/decorator-pattern-made-easy/ http://en.wikipedia.org/wiki/Decorator_pattern

希望有所帮助。

这是您的方案的示例代码。看看它是否有帮助。

 public abstract class Order
    {
        public abstract void PlaceOrder(); // log the placeing of the ordr, place the order asynchronously
    }
    public class MicrosoftOrder : Order // default order
    {
        public void PlaceOrder()
        {
            // default implementation for placing order.
        }
    }
    public class AppleOrder : Order // for asycn functionalities.
    {
        private Order order;
        public AppleOrder(Order order)
        {
            this.order = order;
        }
        public void PlaceOrder()
        {
            // Implement async functionalities.
            // you can also call default order as
            // order.PlaceOrder();
        }
    }
    public class GoogleOrder : Order // logged order
    {
        private Order order;
        public GoogleOrder(Order order)
        {
            this.order = order;
        }
        public void PlaceOrder()
        {           
            // Implement logged order
            // you can also call default order as
            // order.PlaceOrder();
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Order order = new MicrosoftOrder();
            order.PlaceOrder(); // Default Order;
            Order orderWithAsync = new AppleOrder(order);
            orderWithAsync.PlaceOrder(); // Place order with asycn 

            Order orderWithAsyncAndlogging = new GoogleOrder(orderWithAsync);
            orderWithAsyncAndlogging.PlaceOrder(); // order with asynch and logging.            
        }
    }