设计模式(java) ------ 工厂模式+策略模式+门面模式 (一)

2014-11-24 11:36:05 · 作者: · 浏览: 16

场景:设计一个交易系统中的子模块------扣款子模块

扣款子模块中主要包括两部分:

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;