寻找收据对象的设计模式的方向

时间:2013-01-25 08:43:40

标签: design-patterns point-of-sale

我需要设计一个收据对象,该对象将在事务中获取行项目并将其格式化为40列显示。将来我还需要另一种常规尺寸打印纸格式。

交易有不同类型的订单项(商品,评论,折扣,投标等)。

我的第一个想法是为每个创建一个接口,以便他们负责格式化自己,我可以为接口添加一个新方法,用于我需要的每种收据格式。我的下一个想法是为我需要的每种收据格式创建一个类,让它负责查看每一行的类型并适当地格式化它。

所以我的问题是我是否可以忽略更好的设计模式,如果没有,那么是否有理由支持上述设计之一而不是另一种?

所以我可以添加这样的东西:

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

3 个答案:

答案 0 :(得分:1)

我最初的想法是,您正在寻找战略模式。如果您想要将格式与内容分开,这将非常有用。该行可以在创建时注入适当的格式化策略,并且为方便起见可能有默认值。然后这些行都可以实现一个委托给注入策略的IFormattable接口。

答案 1 :(得分:1)

为什么不创建IRecieptPrinter界面,然后创建RegularPaperPrinterColumnPrinter

然后你可以这样做:

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

如果您不想自己创建打印机,可以使用工厂模式:

var printer = printerFactory.Create("regularpaper");
printer.Print(receipt);

答案 2 :(得分:0)

我有同样的案例要解决,我最终使用了一种桥接设计模式,将收据和他的内容与印刷分开。

abstract class Receipt{
private Printer printer;

public Receipt (Printer printer){
if (printer==null){
throw new NullArgumentException ("Printer can't be null.");
}
this.printer=printer;
}

public abstract PrintJobStatus printReceipt ();
}

abstract class Printer {

public abstract void printLine (String txt, Alignement al, Font fo, Size si);
public abstract void printQrCode(String qrCodeStr, QrType qrType, Size si);
}

public class VatReceipt extend Receipt{

public VatReceipt (Printer printer){
super (printer);
}

@Overide
public PrintJobStatus printReceipt ()
PrintJobStatus result=PrintJobStatus.UNDEFINE;

printer.printLine ("Hello i'm the receipt.header",
Alignement.CENTER,  Font.A, Size.SMALL);
...
...
return result;
}

public class EpsonT88Printer extend Printer{
private EpsonPrinterSdk epsonSdkPrinter;

@Overide
public void printLine(String txt, Alignement al, Font fo, Size si){
int epsonAlignement=convertGenericAligToEpsonAlig(al);
int epsonFont=convertGenericFontToEpsonFont(fo);
...
epsonSdkPrinter.printTextLine (txt, epsonAlignement,...);
}
}

我正在接听电话......