最近のコードで、私は次のような問題が発生しました:当店の完全な削減量では活動の種類の問題、おおよそ次のコードに基づいて計算されます。
public class orderCalculate { public BigDecimal getDiscount(String type) { BigDecimal discount = BigDecimal.ZERO; if(type.equals("fullDiscount")){ //....................满减计算方法 } else if (type.equals("platFormDiscount")) { //....................平台满减计算方法 } else if (type.equals("coupon")) { //.....................优惠券计算方法 }else { //没有优惠 } return discount; } }
このアプローチの欠点は、次のとおりです。
他の判定ロジックが非常に複雑になる1.if、コードの可読性が悪いです
2.コードの非常に貧しいスケーラビリティ、追加アクティビティ一度コードは急激な変化が発生します
3. OCDは受け入れることは非常に困難でした
上記の、特に第三の点に基づいて、我々は、コードに対処することにしました
まず、我々は、コードを最適化するためのインタフェースを使用するための方法を考えることができます。まず、我々は共通のインタフェースアクティビティを定義し、彼の実装クラスの一部
public interface Activity { public BigDecimal getDiscount(BigDecimal amount); } public class fullDiscountActivity implements Activity { @Override public BigDecimal getDiscount(BigDecimal amount) { BigDecimal discount=BigDecimal.ZERO; //计算逻辑 return discount; } } public class coupon implements Activity { @Override public BigDecimal getDiscount(BigDecimal amount) { BigDecimal discount=BigDecimal.ZERO; //计算逻辑 return discount; } } @Override public BigDecimal getDiscount(BigDecimal amount) { BigDecimal discount=BigDecimal.ZERO; //计算逻辑 return discount; } public class noActivity implements Activity { @Override public BigDecimal getDiscount(BigDecimal amount) { return amount; } }
だから、次のように私たちのgetDiscount方法になること:
public BigDecimal getDiscount(BigDecimal amount,String type) { BigDecimal discount = BigDecimal.ZERO; if(type.equals("fullDiscount")){ fullDiscountActivity fullDiscountActivity = new fullDiscountActivity(); return fullDiscountActivity.getDiscount(amount); } else if (type.equals("platFormDiscount")) { platFormDiscount platFormDiscount = new platFormDiscount(); return platFormDiscount.getDiscount(amount); } else if (type.equals("coupon")) { coupon coupon = new coupon(); return coupon.getDiscount(amount); }else { //没有优惠 } return discount; }
ここでは、ある程度のコードの可読性を向上させるために、自分で各クラスの特定のメソッドを提供します。我々はさらに、コードの最適化次
public BigDecimal getDiscount(BigDecimal amount,String type) { Activity activity; if(type.equals("fullDiscount")){ activity = new fullDiscountActivity(); } else if (type.equals("platFormDiscount")) { activity = new fullDiscountActivity(); } else if (type.equals("coupon")) { activity = new fullDiscountActivity(); }else { activity = new noActivity(); } return activity.getDiscount(amount); }
だから、コードはそれの表情でなっているようだという。それ以外の場合でも、実際には、我々はを取り除くしませんでした。その後、我々は我々のタイプのフィールドが治療への我々の方法である、と考え、我々は我々がまだであれば、他を取り除くことができないのでこと、また過去に送信フィールドとして入力する方法を見つけることができます。このケースでは、適切なクラスに活動を、工場出荷時のモデルを使用して処理クラスで処理入力し、一致する必要があります。
まず、我々はインターフェイスにgetTypeメソッドを増加させ、それぞれの具体的な実装クラスのための具体的なアプローチを返します
public interface Activity { public BigDecimal getDiscount(BigDecimal amount); public String getType(); } public class coupon implements Activity { @Override public BigDecimal getDiscount(BigDecimal amount) { BigDecimal discount=BigDecimal.ZERO; //计算逻辑 return discount; } @Override public String getType() { return "coupon"; } } public class fullDiscountActivity implements Activity { @Override public BigDecimal getDiscount(BigDecimal amount) { BigDecimal discount=BigDecimal.ZERO; //计算逻辑 return discount; } @Override public String getType() { return "fullDiscount"; } } public class noActivity implements Activity { @Override public BigDecimal getDiscount(BigDecimal amount) { return amount; } @Override public String getType() { return "noActivity"; } } public class platFormDiscount implements Activity { @Override public BigDecimal getDiscount(BigDecimal amount) { BigDecimal discount=BigDecimal.ZERO; //计算逻辑 return discount; } @Override public String getType() { return "platFormDiscount"; } }
次に、我々は新しいクラスファクトリアクティビティを作成します。
戻り値の型とクラスファクトリに対応するような治療の必要性;
public class ActivityFactory {
private Map<String, Activity> map;
private ActivityFactory() {
List<Activity> activities = new ArrayList<>();
activities.add(new coupon());
activities.add(new fullDiscountActivity());
activities.add(new platFormDiscount());
activities.add(new noActivity());
//LIST转化为map以做匹配
for (Activity activity : activities) {
map.put(activity.getType(), activity);
}
}
//静态内部类
public static class Holder {
public static ActivityFactory instance = new ActivityFactory();
}
//单例方法
public ActivityFactory getInstance() {
return Holder.instance;
}
//获取对应的活动类
public Activity getActivity(String type) {
return map.get(type);
}
}
このクラスは、主に以下の機能を実装します。
1民営の構成方法、および実施例を取得するシングルモードのgetInstanceを可能にします。
2.静的な内部クラスローダオブジェクト
マップへのキーとして3.コンストラクタすべてのアクティブなオブジェクトタイプに応じて
オブジェクトとリターン活動に対応するマップマッチングの方法を介して4.getActivity
このように、私たちはgetDiscountメソッドを記述するために(乙女座用)で幸せになることができ、それは非常に簡単ではありません。
public BigDecimal getDiscount(BigDecimal amount,String type) {
Activity activity =ActivityFactory.getInstance().getActivity(type);
return activity.getDiscount(amount);
}