名前を聞くだけでは何の手がかりもないのですが、どんな戦略?
シナリオ:スーパーマーケットの活動、完全な割引、割引、通常の請求、さまざまな状況での支払いの要求。
①创建 付款基类抽象类,有一个抽象方法apply用于计算活动后实际付款额
//付款 基类
public abstract class CashSuper {
//计算付款额
public abstract double apply(double money);
}
② 创建正常付费、打折付费、满减付费 三种付费方式类,分别继承付费基类。各自重写自己的apply方法。
// 满A返现(B) 方式
public class CashReturn extends CashSuper {
private double A;
private double B;
public CashReturn(String a, String b) {
super();
A = Double.valueOf(a.toString());
B = Double.valueOf(b.toString());
}
@Override
public double apply(double money) {
if(money >= A){
return money - B;
}else{
return money;
}
}
}
package num02_策略模式;
// 打折方式 付费
public class CashRebate extends CashSuper {
private double zhekou;// 打几折
public CashRebate(String zhekou){
this.zhekou = Double.valueOf(zhekou.toString());
}
@Override
public double apply(double money) {
return money * zhekou;
}
}
package num02_策略模式;
//正常付费无活动 付款方式类
public class CashNormal extends CashSuper{
@Override
public double apply(double money) {
return money;
}
}
③创建付费工厂类,用于根据不同的情景创建不同付款方式的 具体类对象
package num02_策略模式;
//付款 工厂类,用于创建 不同付款方式 具体类对象
public class Context {
CashSuper cs;
//返现方式
public Context(String high,String low){
cs = new CashReturn(high,low);
}
public Context(String type) {
switch(type){
case "normal":
cs = new CashNormal();
break;
case "0.8": //这里直接写死,用于说明折扣问题即可。
cs = new CashRebate("0.8");
break;
}
}
//用于接受活动前初始金额,调用apply方法计算实际付款额
public double getResult(double money){
return cs.apply(money);
}
}
④ main方法测试:
package num02_策略模式;
public class Main {
public static void main(String[] args) {
Context context = new Context("normal");
double result = context.getResult(200);
System.out.println(result); // 正常付款 200.0
context = new Context("0.8");
double result2 = context.getResult(200);
System.out.println(result2); // 折扣付款 160.0
context = new Context("500","50"); //满500减50
double result3 = context.getResult(600);
System.out.println(result3); // 满减付款 550.0
double result4 = context.getResult(300);
System.out.println(result4); // 满减付款 300.0
}
}
戦略モード:アルゴリズムファミリーを定義し、個別にカプセル化して、相互に置き換えられるようにします。そのため、アルゴリズムの変更は、アルゴリズムを使用するユーザーに影響を与えません。アルゴリズム自体は単なる戦略であり、いつでも変更されます。たとえば、タイムアウトして数元を加算または減算するアクティビティに従事している場合、これが変更のポイントです。
例に関する限り、割引かリベートかは特定の支払いアルゴリズムです。これらは、抽象アルゴリズムクラスCashSuperから継承されました。ファクトリクラスにはCashSuperへの参照があり、
ポリモーフィズムを使用して、ファクトリクラスに特定の支払い方法オブジェクトを作成します。さまざまな戦略がインスタンス化されるため、context.getResultが呼び出されると、さまざまな有料クラスのapplyメソッドが最終的に呼び出されます。
シンプルファクトリモードのみを使用する場合、クライアントはCashSuperクラスとContextクラスを認識する必要があります。ストラテジーモードをシンプルファクトリモードと組み合わせて使用すると、コンテキストクラスをクライアントに通知するだけで、結合度がさらに低下します[ストラテジーモードは定義を減らしますアルゴリズムクラスとアルゴリズムを使用するクラスの間の結合]。
ps:オブジェクト指向プログラミングは、より多くのクラスではなく、より良いクラスの分割はカプセル化のためですが、分類の基礎は抽象化であり、同じプロパティと機能を持つオブジェクトの抽象的なコレクションがクラスです。