2 回答
TA贡献1820条经验 获得超10个赞
BillBundle因为参数对象是一种可伸缩的方法,用于减少方法的参数列表。正如参数对象设计模式的任何实现一样,也意味着在处理参数的代码中移动。避免代码重复以获取账单并将其传递给方法的选项可能是访问者设计模式(以获取账单)和模板方法设计模式(用于处理账单)之间的混合depositCash
假设用于计算账单的信息来自ATM,账单发射器可以计算账单并接受账单处理器作为访客,该处理器获取账单并对其进行处理
interface BillEmitter {
int getFives();
int getTens();
int getTwenties();
int getFifties();
default void accept(Visitor v) {
v.visit(this);
}
}
// add BillEmitter implementations as needed
public class SomeBillEmitter implements BillEmitter {
private Atm atm;
public SomeBillEmitter(Atm atm) {
this.atm = atm;
}
public int getFives() {
int theFivesBill = 0;
// compute the fives bill with the information from ATM
return theFivesBill;
}
public int getTens() {
int theTensBill = 0;
// compute the tens bill with the information from ATM
return theTensBill;
}
public int getTwenties() {
int theTwentiesBill = 0;
// compute the twenties bill with the information from ATM
return theTwentiesBill;
}
public int getFifties() {
int theFiftiesBill = 0;
// compute the fifties bill with the information from ATM
return theFiftiesBill;
}
}
参观者
interface Visitor {
default void visit(BillEmitter billEmitter) {
// template method which gets the bills from the billEmitter
// and pass them to the bill processor
Billbundle billBundle = new BillBundle();
billBundle.setFives(billEmitter.getFives());
billBundle.setTens(billEmitter.getTens());
billBundle.setTwenties(billEmitter.getTwenties());
billBundle.setFifties(billEmitter.getFifties());
processBills(billBundle);
}
void processBills(BillBundle billBundle);
}
// add Visitor implementations as needed
public class DepositCashVisitor implements Visitor {
public void processBills(BillBundle billBundle) {
// deposit the cash
...
}
}
用法
public class Atm {
// add methods which returns information used to emit bills
}
public class Test {
public static void main(String[] args) {
Visitor depositCashVisitor = new DepositCashVisitor();
Atm atm = new Atm();
BillEmitter billEmitter = new SomeBillEmitter(atm);
billEmitter.accept(depositCashVisitor);
// add more bill emitters and visit them with depositCashVisitor
// or add more visitors and visit billEmitter with them
}
}
TA贡献1804条经验 获得超3个赞
你的想法在我看来很好。你说你必须反复编写这样的代码:BillBundle
Billbundle billBundle = new BillBundle(); billBundle.setFives(fives); billBundle.setTens(tens); billBundle.setTwenties(twenties); billBundle.setFifties(fifties); depositCash(billBundle);
但你真的或者你只是在想你可能会吗?
像这样的事情只有在计算账单时才应该真正进行,如果这种情况发生在不止几个地方,我会感到惊讶。BillBundle
实际上不会更改或确定每个账单数量的代码应该只是通过账单捆绑包。记录每种类型存入多少张账单的方法?通过它,你从计数得到。将总金额相加的方法?通过它,你从计数得到。等等等等。BillBundleBillBundle
这比到处传递4个参数要好得多,原因有两个:
搞砸事情的机会要少得多 - 每个采用4个账单参数并将其传递到其他地方的函数都有机会以错误的顺序或错误的参数位置传递它们。这尤其成问题,因为实际的计数都是相同的类型(即 ),并且许多参数将该类型用于完全不同的事情。
int实际上,更少的代码取决于您支持的账单类型。假设你的国家换成5美元的硬币,或者你只是不想再把它们放在机器里了......需要更改多少代码才能摆脱五?您需要更改计算账单的代码以及实际关心每个账单金额的所有其他内容,但是您不必更改任何只是传递这些计数的代码。他们可以传递原始文件,而不必担心它。
BillBundle
我建议的一个改变是让你的比尔邦德尔不可变。然后,您不必担心任何人在您传递它时更改它。
像这样:
class BillBundle
{
public final int fives;
public final int tens;
public final int twenties;
public final int fifties;
public BillBundle(int fives, int tens, int twenties, int fifties)
{
this.fives = fives;
this.tens = tens;
this.twenties = twenties;
this.fifties = fifties;
}
}
我会警告你,大多数Java程序员更喜欢getter方法而不是公共的最终字段,但是没有充分的理由。
添加回答
举报
