0

トランザクションでラインアイテムを受け取り、40列の表示用にフォーマットするレシートオブジェクトを設計する必要があります。将来的には、通常サイズのプリンター用紙用に別のフォーマットも必要になります。

トランザクションには、さまざまなタイプのラインアイテム(アイテム、コメント、割引、入札など)があります。

私の最初の考えは、これらのそれぞれのインターフェイスを作成して、それらが自分自身をフォーマットする責任を負うようにすることでした。必要なレシートフォーマットのタイプごとに、インターフェイスに新しいメソッドを追加できました。私の次の考えは、必要なレシートフォーマットのタイプごとに1つのクラスを作成し、各行がどのタイプであるかを確認し、適切にフォーマットする責任を負わせることでした。

だから私の質問は、私が見落としているかもしれないより良いデザインパターンがあるかどうかです、そしてそうでなければ、上記のデザインの1つを他のものよりも好む重要な理由がありますか?

だから私はこのようなものを追加することができます:

public interface IReceiptFormat
{
    string FormatFor40Column();
    string FormatForRegularPaper();
}

私のアイテム、コメントなどのクラスに。または、次のようなものを作成できます。

public ReceiptFormatterFor40Column
{
    public Ticket Ticket {get; private set;}

    public ReceiptFormatterFor40Column(Ticket ticket)
    {
        Ticket = ticket;
    }

    public List<string> GenerateReceipt()
    {
        var lines = new List<string>();

        foreach(var line in Ticket.Lines)
        {
            // check what type of object line is and add
            // add an appropriately formatted string to lines
        }
    }
}
4

3 に答える 3

1

私の最初の考えは、戦略パターンがあなたが探しているものだということです。これは、フォーマットをコンテンツから分離したい場合に役立ちます。行には、作成時に適切な書式設定戦略を挿入することができ、便宜上デフォルトを設定することもできます。次に、行はすべて、注入された戦略に委任された単一の IFormattable インターフェイスを実装できます。

于 2013-01-25T09:27:01.620 に答える
1

IRecieptPrinterインターフェイスを作成してから and をRegularPaperPrinter作成してみませんColumnPrinterか?

次に、次のことができます。

var printer = new RegularPaperPrinter();
printer.Print(receipt);

自分でプリンターを作成したくない場合は、ファクトリ パターンを使用できます。

var printer = printerFactory.Create("regularpaper");
printer.Print(receipt);
于 2013-01-25T10:41:05.243 に答える