java - 控制器和检票口页面的设计模式帮助
问题描述
我有一个将发布交易的检票口页面。它采用净值并计算出佣金和税金。控制器类用于在更改其他值时更新其他值。我已经让它工作了,但我觉得控制器的设计并不是最好的,因为它有不同的更新方法,基于它是总交易还是净交易。
我的第一个想法是拥有一个 nettController 和一个 GrossController,它们都继承自控制器并使用工厂来选择正确的控制器。由于使用@SpringBean,我在使用检票口时遇到了麻烦。
public class PostUnderwriterTransactionPanel extends AbstractPolicyCurrentAdhocTransactionPanel<PostUnderwriterTransactionContext>{
@SpringBean
public PostUnderwriterTransactionPanelController controller;
@Override
protected void onInitialize() {
super.onInitialize();
transactionDetails.add(grossAmountQuestion = createNettAmountTextField(GROSS_AMOUNT_ID, GROSS_AMOUNT_KEY));
transactionDetails.add(nettAmountQuestion = createNettAmountTextField(NETT_AMOUNT_ID, NETT_AMOUNT_KEY));
transactionDetails.add(nettAmountIncTax = createCurrencyTextField(NETT_INC_TAX_ID, NETT_INC_TAX_KEY));
transactionDetails.add(commissionAmount = createCurrencyTextField(COMMISSION_AMOUNT_ID, COMMISSION_AMOUNT_KEY));
transactionDetails.add(commissionRate = createPercentageTextField(COMMISSION_RATE_ID, COMMISSION_RATE_KEY));
transactionDetails.add(taxAmount = createCurrencyTextField(TAX_AMOUNT_ID, TAX_AMOUNT_KEY));
transactionDetails.add(taxRate = createPercentageTextField(TAX_RATE_ID, TAX_RATE_KEY));
transactionDetails.add(totalAmount = createInfoPanel(TOTAL_AMOUNT_ID, TOTAL_AMOUNT_KEY));
checkOverride(commissionAmount, commissionRate, OVERRIDE_INSURER_COMMISSION.getCode());
checkOverride(taxAmount, taxRate, OVERRIDE_TAX.getCode());
add(content);
addEffectiveDateOnUpdate();
getModelObject().getTransactionPosting().setAmount(0L);
controller.setParameterValues(getModelObject());
if(getModelObject().isNetRated()){
grossAmountQuestion.setVisible(false);
}else{
nettAmountQuestion.setVisible(false);
nettAmountIncTax.setVisible(false);
}
}
public void checkOverride(TextField<Float> amount, TextField<Float> rate, String code){
if(!controller.getOverrideAllowed(code, getPscm())){
amount.setEnabled(false);
rate.setEnabled(false);
}
}
private void redrawValues(AjaxRequestTarget target){
if(getModelObject().isNetRated()) {
target.add(nettAmountQuestion, nettAmountIncTax, commissionAmount, commissionRate, taxAmount, taxRate, totalAmount, newPolicyBalance);
}
else{
target.add(grossAmountQuestion, commissionAmount, commissionRate, taxAmount, taxRate, totalAmount, newPolicyBalance);
}
}
private void callControllerUpdate(String type){
if(getModelObject().isNetRated()) {
switch (type) {
case NETT_AMOUNT_ID:
controller.updateNettAmount(getModelObject());
break;
case NETT_INC_TAX_ID:
controller.updateNettIncTax(getModelObject());
break;
case COMMISSION_AMOUNT_ID:
controller.updateCommissionAmount(getModelObject());
break;
case COMMISSION_RATE_ID:
controller.updateCommissionRate(getModelObject());
break;
case TAX_AMOUNT_ID:
controller.updateTaxAmount(getModelObject());
break;
case TAX_RATE_ID:
controller.updateTaxRateFromTextBox(getModelObject());
break;
}
}else{
switch (type) {
case GROSS_AMOUNT_ID:
controller.updateGrossAmount(getModelObject());
break;
case COMMISSION_AMOUNT_ID:
controller.updateGrossCommissionAmount(getModelObject());
break;
case COMMISSION_RATE_ID:
controller.updateGrossCommissionRate(getModelObject());
break;
case TAX_AMOUNT_ID:
controller.updateGrossTaxAmount(getModelObject());
break;
case TAX_RATE_ID:
controller.updateGrossTaxRate(getModelObject());
break;
}
}
}
}
@Component
public class PostUnderwriterTransactionPanelController extends AdhocTransactionViewControllerImpl {
@Autowired
private NettRatedCalculator nettRatedCalculator;
public void updateNettAmount(PostUnderwriterTransactionContext context){
context.setNettAmountIncTax(nettRatedCalculator.calculateNettIncTax(context.getNettAmount(), context.getParameterTaxRate()));
context.setCommissionAmount(nettRatedCalculator.calculateCommissionAmount(context.getCommissionFlatCharge(), context.getNettAmount(), context.getParameterCommissionRate()));
context.setCommissionRate(nettRatedCalculator.calculateCommissionRate(context.getCommissionAmount(), context.getNettAmount()));
context.setTaxRate(context.getParameterTaxRate());
context.setTaxAmount(nettRatedCalculator.calculateTaxAmount(context.getParameterTaxRate(), context.getNettAmount(), context.getCommissionAmount()));
context.setTotalAmount(nettRatedCalculator.calculateTotalAmount(context.getNettAmount(), context.getCommissionAmount(), context.getTaxAmount()));
}
public void updateCommissionAmount(PostUnderwriterTransactionContext context){
context.setCommissionRate(nettRatedCalculator.calculateCommissionRate(context.getCommissionAmount(), context.getNettAmount()));
updateCommission(context);
}
public void updateCommissionRate(PostUnderwriterTransactionContext context){
float equivalentCommission = nettRatedCalculator.calculateEquivalentRate(context.getCommissionRate());
context.setCommissionAmount(nettRatedCalculator.calculateCommissionAmount(0L, context.getNettAmount(), equivalentCommission));
updateCommission(context);
}
private void updateCommission(PostUnderwriterTransactionContext context){
context.setNettAmountIncTax(nettRatedCalculator.calculateNettIncTax(context.getNettAmount(), context.getTaxRate()));
context.setTaxAmount(nettRatedCalculator.calculateTaxAmount(context.getTaxRate(), context.getNettAmount(), context.getCommissionAmount()));
context.setTotalAmount(nettRatedCalculator.calculateTotalAmount(context.getNettAmount(), context.getCommissionAmount(), context.getTaxAmount()));
}
public void updateTaxAmount(PostUnderwriterTransactionContext context){
context.setTaxRate(nettRatedCalculator.calculateTaxRate(context.getTaxAmount(), context.getNettAmount(), context.getCommissionAmount()));
context.setNettAmountIncTax(nettRatedCalculator.calculateNettIncTax(context.getNettAmount(), context.getTaxRate()));
context.setTotalAmount(nettRatedCalculator.calculateTotalAmount(context.getNettAmount(), context.getCommissionAmount(), context.getTaxAmount()));
}
public void updateTaxRateFromTextBox(PostUnderwriterTransactionContext context) {
context.setTaxAmount(nettRatedCalculator.calculateTaxAmount(context.getTaxRate(), context.getNettAmount(), context.getCommissionAmount()));
context.setNettAmountIncTax(nettRatedCalculator.calculateNettIncTax(context.getNettAmount(), context.getTaxRate()));
context.setTotalAmount(nettRatedCalculator.calculateTotalAmount(context.getNettAmount(), context.getCommissionAmount(), context.getTaxAmount()));
}
public void updateTaxRateFromSystemParameter(PostUnderwriterTransactionContext context) {
context.setTaxRate(getTaxRateParameter(context.getPscm(), context));
context.setTaxAmount(nettRatedCalculator.calculateTaxAmount(context.getTaxRate(), context.getNettAmount(), context.getCommissionAmount()));
context.setNettAmountIncTax(nettRatedCalculator.calculateNettIncTax(context.getNettAmount(), context.getTaxRate()));
context.setTotalAmount(nettRatedCalculator.calculateTotalAmount(context.getNettAmount(), context.getCommissionAmount(), context.getTaxAmount()));
}
public void updateNettIncTax(PostUnderwriterTransactionContext context){
context.setNettAmount(nettRatedCalculator.calculateNettAmount(context.getNettAmountIncTax(), context.getParameterTaxRate()));
context.setCommissionAmount(nettRatedCalculator.calculateCommissionAmount(context.getCommissionFlatCharge(), context.getNettAmount(), context.getParameterCommissionRate()));
context.setCommissionRate(nettRatedCalculator.calculateCommissionRate(context.getCommissionAmount(), context.getNettAmount()));
context.setTaxAmount(nettRatedCalculator.calculateTaxAmount(context.getParameterTaxRate(), context.getNettAmount(), context.getCommissionAmount()));
context.setTaxRate(context.getParameterTaxRate());
context.setTotalAmount(nettRatedCalculator.calculateTotalAmount(context.getNettAmount(), context.getCommissionAmount(), context.getTaxAmount()));
}
public void updateGrossAmount(PostUnderwriterTransactionContext context) {
context.setTaxRate(context.getParameterTaxRate());
context.setTaxAmount(nettRatedCalculator.calculateTaxFromGross(context.getGrossAmount(), context.getTaxRate()));
context.setCommissionRate(context.getParameterCommissionRate());
context.setCommissionAmount(nettRatedCalculator.calculateCommissionGross(context.getCommissionRate(), context.getGrossAmount(), context.getTaxAmount()));
context.setTotalAmount(nettRatedCalculator.calculateTotalAmount(context.getGrossAmount(), context.getCommissionAmount(), context.getTaxAmount()));
}
public void updateGrossCommissionAmount(PostUnderwriterTransactionContext context){
context.setCommissionRate(nettRatedCalculator.calculateCommissionRateGross(context.getCommissionAmount(), context.getGrossAmount(), context.getTaxAmount()));
context.setTotalAmount(nettRatedCalculator.calculateTotalAmount(context.getGrossAmount(), context.getCommissionAmount(), context.getTaxAmount()));
}
public void updateGrossCommissionRate(PostUnderwriterTransactionContext context){
context.setCommissionAmount(nettRatedCalculator.calculateCommissionAmountGross(context.getCommissionRate(), context.getGrossAmount(), context.getTaxAmount()));
context.setTotalAmount(nettRatedCalculator.calculateTotalAmount(context.getGrossAmount(), context.getCommissionAmount(), context.getTaxAmount()));
}
public void updateGrossTaxAmount(PostUnderwriterTransactionContext context){
context.setTaxRate(nettRatedCalculator.calculateTaxRateGross(context.getTaxAmount(), context.getGrossAmount()));
context.setCommissionAmount(nettRatedCalculator.calculateCommissionAmountGross(context.getCommissionRate(), context.getGrossAmount(), context.getTaxAmount()));
context.setTotalAmount(nettRatedCalculator.calculateTotalAmount(context.getGrossAmount(), context.getCommissionAmount(), context.getTaxAmount()));
}
public void updateGrossTaxRate(PostUnderwriterTransactionContext context){
context.setTaxAmount(nettRatedCalculator.calculateTaxAmountFromTaxRateGross(context.getGrossAmount(), context.getTaxRate()));
context.setCommissionAmount(nettRatedCalculator.calculateCommissionAmountGross(context.getCommissionRate(), context.getGrossAmount(), context.getTaxAmount()));
context.setTotalAmount(nettRatedCalculator.calculateTotalAmount(context.getGrossAmount(), context.getCommissionAmount(), context.getTaxAmount()));
}
}
我对检票口很陌生,但我已经开始工作了。我认为代码可能会更好。任何想法,我可以做些什么来改进设计?
解决方案
如果你想重构你的控制器制作两个不同的组件,对你的页面做同样的事情可能会有所帮助。例如,您可以创建两个不同的页面,一个用于净值,一个用于总价值。您甚至可以使用两种不同的路径(例如:/net 和 /gross)安装它们。这就是为什么您可以将正确的控制器注入相应的页面并避免
if(getModelObject().isNetRated())
在 callControllerUpdate 方法中。
只是我的2美分。
推荐阅读
- android - 深层链接不适用于 Instragram 故事向上滑动
- python - 安装 NLTK 时出错
- laravel - 在 laravel 中的数据透视表上定义附加关系
- python - 字典列表可以用适当的结果排序
- javascript - 如何在javascript中检查和添加属性到数组对象
- java - 如何复制列表
进入java中的当前数组列表?(通用列表) - function - 识别 id 玩家 onclick unity
- vue.js - 使用 Vue.js 防止 DOM 刷新?
- python - Python pandas read_csv() utf-8 csv 文件,包含 EOF 和 NULL 字节
- android - react-native-webview:区分脚本引起的window.location和用户点击链接