0

我需要设计一个收据对象,它将在交易中获取行项目并将它们格式化为 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
        }
    }
}
4

3 回答 3

1

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

于 2013-01-25T09:27:01.620 回答
1

为什么不直接创建一个IRecieptPrinter界面,然后创建一个RegularPaperPrinterand ColumnPrinter

那么你可以这样做:

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

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

var printer = printerFactory.Create("regularpaper");
printer.Print(receipt);
于 2013-01-25T10:41:05.243 回答
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,...);
}
}

我用手机接听...

于 2017-12-12T23:31:47.343 回答