我需要设计一个收据对象,该对象将在事务中获取行项目并将其格式化为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
}
}
}
答案 0 :(得分:1)
我最初的想法是,您正在寻找战略模式。如果您想要将格式与内容分开,这将非常有用。该行可以在创建时注入适当的格式化策略,并且为方便起见可能有默认值。然后这些行都可以实现一个委托给注入策略的IFormattable接口。
答案 1 :(得分:1)
为什么不创建IRecieptPrinter
界面,然后创建RegularPaperPrinter
和ColumnPrinter
?
然后你可以这样做:
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,...);
}
}
我正在接听电话......