场景:设计一个交易系统中的子模块------扣款子模块
扣款子模块中主要包括两部分:
1.IC卡类和交易信息类
其中IC卡中包括两种金额:固定金额和自由金额;交易信息类负责记录每一笔交易。
2.扣款策略类
扣款策略有以下两种:
a. IC卡固定金额 = IC卡现有固定金额-交易金额/2
IC卡自由金额 = IC卡自由金额-交易金额/2
b. 全部消费从IC卡自由金额中扣除
类图实现:
主要涉及如下几个角色:
1.IC卡类和交易类
2.扣款策略接口
3.扣款策略的封装类
4.策略枚举类
5.策略工厂
6.扣款模块封装
7.场景类
代码实现
Card类:
[java]
package org.apache.java.designpatter.factoryandstrategy;
public class Card {
private String No;
private int steadyMoney; //卡内固定交易金额
private int freeMoney; //卡内自由交易金额
public String getNo() {
return No;
}
public void setNo(String no) {
No = no;
}
public int getSteadyMoney() {
return steadyMoney;
}
public void setSteadyMoney(int steadyMoney) {
this.steadyMoney = steadyMoney;
}
public int getFreeMoney() {
return freeMoney;
}
public void setFreeMoney(int freeMoney) {
this.freeMoney = freeMoney;
}
}
package org.apache.java.designpatter.factoryandstrategy;
public class Card {
private String No;
private int steadyMoney; //卡内固定交易金额
private int freeMoney; //卡内自由交易金额
public String getNo() {
return No;
}
public void setNo(String no) {
No = no;
}
public int getSteadyMoney() {
return steadyMoney;
}
public void setSteadyMoney(int steadyMoney) {
this.steadyMoney = steadyMoney;
}
public int getFreeMoney() {
return freeMoney;
}
public void setFreeMoney(int freeMoney) {
this.freeMoney = freeMoney;
}
}
Trade类:
[java]
public class Trade {
private String tradeNo;
private int mount; //交易金额
public String getTradeNo() {
return tradeNo;
}
public void setTradeNo(String tradeNo) {
this.tradeNo = tradeNo;
}
public int getMount() {
return mount;
}
public void setMount(int mount) {
this.mount = mount;
}
}
public class Trade {
private String tradeNo;
private int mount; //交易金额
public String getTradeNo() {
return tradeNo;
}
public void setTradeNo(String tradeNo) {
this.tradeNo = tradeNo;
}
public int getMount() {
return mount;
}
public void setMount(int mount) {
this.mount = mount;
}
}
扣款策略接口
[java]
public interface IDeduction {
public boolean exec(Card card, Trade trade);
}
public interface IDeduction {
public boolean exec(Card card, Trade trade);
}
扣款策略类
[java]
public class SteadyDeduction implements IDeduction {
public boolean exec(Card card, Trade trade) {
int halfMoney = (int) Math.rint(trade.getMount() / 2.0);
card.setSteadyMoney(card.getSteadyMoney() - halfMoney);
card.setFreeMoney(card.getFreeMoney() - halfMoney);
return true;
}
}
public class FreeDeduction implements IDeduction {
public boolean exec(Card card, Trade trade) {
card.setFreeMoney(card.getFreeMoney() - trade.getMount());
return true;
}
}
public class SteadyDeduction implements IDeduction {
public boolean exec(Card card, Trade trade) {
int halfMoney = (int) Math.rint(trade.getMount() / 2.0);
card.setSteadyMoney(card.getSteadyMoney() - halfMoney);
card.setFreeMoney(card.getFreeMoney() - halfMoney);
return true;
}
}
public class FreeDeduction implements IDeduction {
public boolean exec(Card card, Trade trade) {
card.setFreeMoney(card.getFreeMoney() - trade.getMount());
return true;