1.ストラテジーモード(ファクトリーモードと同様)
簡単な店舗のレジソフトウェアを作成し、顧客が購入した商品の単価と数量に応じてユーザーに請求します。
2つの数を掛けるのは簡単なようです
public class GetTotal {
public static double getTotal(double number,double slary) {
return number * slary;
}
}
- バリエーション1:ショッピングモール入場時に割引が発生した場合、割引もランダムになります。現時点では、上記の文言は当てはまらず、活動も多い場合があります。ソースコードを常に変更できるとは限りません。
このとき、最初に現金請求インターフェースを定義します(需要がどのように変化し、最終結果が変化しないか)
public interface GetTotal {
//公共方法抽离
double getTotal(double money);
}
//当正常收费的时候
public class CashNormal implements GetTotal {
@Override
public double getTotal(double money) {
return money;
}
}
//当出现打折情况下
public class CashRebate implements GetTotal {
private double moneyRebate = 1d;
public CashRebate(double moneyRebate) {
this.moneyRebate = moneyRebate;
}
@Override
public double getTotal(double money) {
return money * moneyRebate;
}
}
//当出现满减时
public class CashReturn implements GetTotal {
private double moneyCondition = 0.0d;
private double moneyReturn = 0.0d;
public CashReturn(double moneyCondition, double moneyReturn) {
super();
this.moneyCondition = moneyCondition;
this.moneyReturn = moneyReturn;
}
@Override
public double getTotal(double money) {
double result = money;
if (money >= moneyCondition) {
result = money - Math.floor(money/moneyCondition) * moneyReturn;
}
return result;
}
}
//定义一个工厂类
public class CashContext {
GetTotal testTotal = null;
public CashContext(String type) {
switch (type) {
case "正常收费":
testTotal = new CashNormal();
break;
case "满300返100":
testTotal = new CashReturn(300,100);
break;
case "打八折":
testTotal = new CashRebate(0.8);
break;
default:
break;
}
}
public double getResult(double money) {
return testTotal.getTotal(money);
}
}
//测试类
public class Test {
public static void main(String[] args) {
CashContext cashContext = new CashContext("正常收费");
}
}
戦略パターンの本質は、すべてのオブジェクトのパブリックメソッドを分離し、インターフェイスの書き換えメソッドを実装することでさまざまな要件を達成することです。