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

実行時にアルゴリズムを選択すると、それはStrategy Patternと呼ばれます。

コンピューター プログラミングでは、戦略パターン (ポリシー パターンとも呼ばれます) は、実行時にアルゴリズムの動作を選択できるソフトウェア設計パターンです。

于 2013-01-21T08:58:04.387 に答える
1

フィリップが言ったように、それはあなたが実装した戦略パターンです。 テンプレート パターンは代替手段です。

ただし、特定のケースで柔軟性が失われても問題ない場合は、電話をかける必要があります。

于 2013-01-21T10:06:12.410 に答える