我认为下面的解决方案对C#很有用,它没有外部的
if
visitor
不建议使用模式。
public class InvoicePrinterManager
{
public void Print(AccountInvoice invoice)
{
AccountInvoicePrinter p1 = new AccountInvoicePrinter(invoice);
p1.print();
}
public void Print(LaborInvoice invoice)
{
LaborInvoicePrinter p1 = new LaborInvoicePrinter(invoice);
p1.print();
}
}
public class InvoicePrinter<T> where T : Invoice, new()
{
T instance;
public InvoicePrinter(T invoice)
{
if (invoice != null)
{
this.instance = invoice;
}
else
instance = new T();
}
public virtual void Print()
{
/// Arrange objects as you want and print them.
}
}
public class AccountInvoicePrinter : InvoicePrinter<AccountInvoice>
{
public AccountInvoicePrinter(AccountInvoice invoice)
: base(invoice)
{
}
public override void Print()
{
/// todo
}
}
public class LaborInvoicePrinter : InvoicePrinter<LaborInvoice>
{
public LaborInvoicePrinter(LaborInvoice invoice)
: base(invoice)
{
}
public override void Print()
{
/// todo: use instance
}
}
public class Test
{
public void TestPrint()
{
LaborInvoice li = new LaborInvoice();
InvoicePrintManager printerManager = new InvoicePrintManager();
printerManager.Print(li);
}
}