在我们的项目中,我们经常在某些条件下选择算法
例如,假设我们需要打印不同产品的订单.我们需要根据产品类型,价格或任何其他产品特性选择不同的空白并检索不同的数据.通常,我们写这样的东西.
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 ...
}
}
Run Code Online (Sandbox Code Playgroud)
这种模式是否有任何众所周知的名称?是的,它看起来与Composite模式非常相似,但无论如何都存在差异.是否有任何标准设计模式以更好(更优雅,更少代码,......)的方式解决此任务?阅读有关实现类似行为的其他方法会很有趣.