0

在我们的项目中,我们经常根据一些条件选择算法。

例如,假设我们需要打印不同产品的订单。我们需要根据产品类型、价格或任何其他产品特性选择不同的空白并检索不同的数据。通常,我们会写这样的东西。

public interface IOrderPrinter
{
    bool CanPrint(Order order);
    PrintResult Print(Order order);
}

class CompositeOrderPrinter : IOrderPrinter
{
    private IList<IOrderPrinter> printers;

    public bool CanPrint(Order order)
    {
        return printers.Any(p => p.CanPrint(order));
    }

    public PrintResult Print(Order order)
    {
        foreach (var printer in printers)
        {
            if (printer.CanPrint(order))
                return printer.Print(order);
        }
        // throw some exception
    }

    public void AddPrinter(IOrderPrinter printer)
    {
        printers.Add(printer);
    }
}

class FirstOrderPrinter : IOrderPrinter
{
    public bool CanPrint(Order order)
    {
        return order.ProductType == ProductType.Banana && order.Price < 100;
    }

    public PrintResult Print(Order order)
    {
        if (!CanPrint)
            // throw some exception
        // print ...
    }
}

class SecondOrderPrinter : IOrderPrinter
{
    public bool CanPrint(Order order)
    {
        return order.ProductType == ProductType.Apple;
    }

    public PrintResult Print(Order order)
    {
        if (!CanPrint)
            // throw some exception
        // print ...
    }
}

这个模式有什么众所周知的名字吗?是的,它看起来与复合模式非常相似,但还是有区别的。是否有任何标准设计模式可以更好(更优雅,更少代码,......)方式解决此任务?阅读有关实现类似行为的另一种方法会很有趣。

4

2 回答 2

8

当您在运行时选择算法时,它被称为策略模式

在计算机编程中,策略模式(也称为策略模式)是一种软件设计模式,可以在运行时选择算法的行为。

于 2013-01-21T08:58:04.387 回答
1

正如菲利普所说,这是您实施的战略模式。 模板模式是另一种选择。

但是,如果在您的特定情况下失去灵活性是可以接受的,您需要接听电话。

于 2013-01-21T10:06:12.410 回答