Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Design patterns 运行时选择算法的设计模式_Design Patterns - Fatal编程技术网

Design patterns 运行时选择算法的设计模式

Design patterns 运行时选择算法的设计模式,design-patterns,Design Patterns,在我们的项目中,我们经常根据一些条件选择算法 例如,假设我们需要打印不同产品的订单。我们需要根据产品类型、价格或任何其他产品特性选择不同的空白并检索不同的数据。通常,我们写这样的东西 public interface IOrderPrinter { bool CanPrint(Order order); PrintResult Print(Order order); } class CompositeOrderPrinter : IOrderPrinter { priv

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

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

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 ...
    }
}

这个图案有什么众所周知的名字吗?是的,它看起来和复合模式非常相似,但还是有区别的。是否有任何标准的设计模式可以更好地解决这个问题,更优雅,更少的代码。。。方法阅读其他实现类似行为的方法会很有趣。

当您在运行时选择算法时,它被称为

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


正如Philipp所说,这是您已经实施的战略模式。 这是另一种选择


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

事实上,它们并不是相互排斥的。您可以使用模板方法模式在内部实现策略。在打印机示例中,您可以创建一个基类来处理if!CanPrint//抛出一些异常。是的,谢谢!我更仔细地阅读了战略模式,注意到上下文可以直接或通过某些工厂选择具体的战略。