私たちのプロジェクトでは、いくつかの条件によってアルゴリズムを選択することがよくあります。
たとえば、さまざまな製品の注文を印刷する必要があるとします。製品タイプ、価格、またはその他の製品特性に応じて、さまざまなブランクを選択し、さまざまなデータを取得する必要があります。通常、私たちはこのように書きます。
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 ...
}
}
このパターンには一般的に知られている名前はありますか? はい、複合パターンとかなり似ていますが、とにかく違いがあります。このタスクをより適切に (よりエレガントに、より少ないコードで) 解決する標準的な設計パターンはありますか? 同様の動作を実装する別の方法について読むと興味深いでしょう。