戦略モード
アルゴリズムの家族の定義があり、それらをカプセル化するので、彼らはお互いの間で交換することができることを、このモードでは、アルゴリズムの変更は、ユーザアルゴリズムには影響しませんことができます。
複数のポイントをよければ...他に...とswitch文
シナリオ
1.システムは、クラスをたくさん持っている、と彼らは彼らの行動のみが異なる場合。
動的にいくつかのアルゴリズムのいずれかを選択します。2. Aシステム。
たとえば、Jingdongは、今プロモーションに従事、我々は書き込みに戦略パターンを使用することができ、いくつかのプロモーションが必要です。
/**
* @Author Darker
* @Descrption 京东促销活动优惠方式接口
* @Date : Created in 13:54 2020-3-12
*/
public interface JDactivity {
//促销方式
/**
* 1.原价
* 2.现金返现
* 3.优惠券减免
* 4.赠送实物
*
*/
void activity();
}
/**
* @Author Darker
* @Descrption
* @Date : Created in 13:57 2020-3-12
*/
public class EmptyActivity implements JDactivity{
@Override
public void activity() {
System.out.println("原价");
}
}
/**
* @Author Darker
* @Descrption
* @Date : Created in 13:59 2020-3-12
*/
public class CashBackActivity implements JDactivity{
@Override
public void activity() {
System.out.println("购物直接返现,返回现金到京东账号");
}
}
/**
* @Author Darker
* @Descrption
* @Date : Created in 13:57 2020-3-12
*/
public class CouponsActivity implements JDactivity{
@Override
public void activity() {
System.out.println("领取优惠券,购物减免价格");
}
}
/**
* @Author Darker
* @Descrption
* @Date : Created in 14:00 2020-3-12
*/
public class GiftActivity implements JDactivity {
@Override
public void activity() {
System.out.println("购物赠送礼品");
}
}
/**
* @Author Darker
* @Descrption 活动策略规则
* @Date : Created in 14:02 2020-3-12
*/
public class ActivityStrategy {
//把优惠活动作为成员变量,new哪一种子类就是哪一种优惠
JDactivity jDactivity;
public ActivityStrategy(JDactivity jDactivity){
this.jDactivity = jDactivity;
}
public void execute(){
jDactivity.activity();
}
}
実行してみてください
/**
* @Author Darker
* @Descrption
* @Date : Created in 14:04 2020-3-12
*/
public class StrategyTest {
public static void main(String[] args) {
//6.18购物活动
ActivityStrategy activity618 = new ActivityStrategy(new CashBackActivity());
activity618.execute();
//双11购物优惠
ActivityStrategy activity1111 = new ActivityStrategy(new CouponsActivity());
activity1111.execute();
}
}
これは、Strategyパターンは、アルゴリズムの家族(家族割引)を定義するのに使用するのが最も簡単です、動的なアルゴリズム(割引)を選択します。
しかし!しかし!しかし!!!
ユーザー・コールのレベルに、あなたは..あなたがもし...他に持っていることがわかります。このような、あなたがプロモーションを生成したいが..場合... esle避けるために、その戦略パターンあるため、フィールドの前面から来ました今、当然のことながら、ものを使う遊びが結合しないことができない、単純なファクトリパターンまあ見えるように次のコードを参照してくださいまだ、私たちは工場出荷時のパターンを変更することができません、この戦略を生産する工場で、工場になるための方法単一の実施形態だけでなく、効率を改善します。
そこで、我々は彼がコードを追加しました
/**
* @Author Darker
* @Descrption
* @Date : Created in 14:40 2020-3-12
*/
public class ActivityStrategyFactory {
//构造方法私有化
private ActivityStrategyFactory(){};
//饿汉式单例
private static ActivityStrategyFactory activityStrategyFactory = new ActivityStrategyFactory();
private static Map<String,JDactivity> iocMap = new HashMap<>();
static {
iocMap.put(ActivityKey.COUPON,new CouponsActivity());
iocMap.put(ActivityKey.CASHBACK,new CashBackActivity());
iocMap.put(ActivityKey.GIFT,new GiftActivity());
}
//无优惠
private static final ActivityStrategy NON_ACTIVITY_STRATEGY = new ActivityStrategy(new EmptyActivity());
//全局唯一工厂路口
public static ActivityStrategyFactory getInstance(){
return activityStrategyFactory;
}
//工厂生成相应策略的活动
public ActivityStrategy getActivityStrategy(String activity){
ActivityStrategy activityStrategy = new ActivityStrategy(iocMap.get(activity));
return activityStrategy == null ? NON_ACTIVITY_STRATEGY:activityStrategy;
}
//活动字符串,约定>配置
private interface ActivityKey{
String COUPON = "COUPON";
String CASHBACK = "CASHBACK";
String GIFT = "GIFT";
}
}
操作を見てください
/**
* @Author Darker
* @Descrption
* @Date : Created in 14:04 2020-3-12
*/
public class StrategyTest {
public static void main(String[] args) {
//前端传来的活动key
String activityKey = "CASHBACK";
//生成策略工厂
ActivityStrategyFactory strategyFactory = ActivityStrategyFactory.getInstance();
ActivityStrategy activityStrategy = strategyFactory.getActivityStrategy(activityKey);
activityStrategy.execute();
}
}
あなたはありませんが、単にラインにはほとんどの設定フィールドを追加しようとしたとき、我々は活動を増加させたときに、すぐに変更するクライアントの呼び出しに非常に非常に友好的に見えます。
私たちは、クラス図を見てください:
これは非常に明確である、我々はアクティブなポリシーを通じて、および戦略を生産する工場と、対応するポリシーを生成するために4つの優遇政策を持っています。
その後、私たちはしばしば日常、モバイル決済、非常に古典的な戦略モードで使用される定期的な機能に来て、良い十分ではありません。
/**
* @Author Darker
* @Descrption 支付抽象类,包含公共判断逻辑
* @Date : Created in 16:12 2020-3-12
*/
public abstract class Paymet {
public abstract String getKeyName();
//查询余额
protected abstract double queryBalance(String uid);
//公用支付逻辑
public MsgResult pay(String uid,double amount){
if(queryBalance(uid)<amount){
return new MsgResult(500,"支付失败","余额不足");
}else{
return new MsgResult(200,"支付成功","支付金额"+amount);
}
}
}
/**
* @Author Darker
* @Descrption
* @Date : Created in 16:11 2020-3-12
*/
public class Alipay extends Paymet{
@Override
public String getKeyName() {
return "支付宝";
}
@Override
protected double queryBalance(String uid) {
return 250;
}
}
/**
* @Author Darker
* @Descrption
* @Date : Created in 16:16 2020-3-12
*/
public class JDpay extends Paymet {
@Override
public String getKeyName() {
return "京东白条";
}
@Override
protected double queryBalance(String uid) {
return 500;
}
}
/**
* @Author Darker
* @Descrption
* @Date : Created in 16:18 2020-3-12
*/
public class WechatPay extends Paymet {
@Override
public String getKeyName() {
return "微信支付";
}
@Override
protected double queryBalance(String uid) {
return 700;
}
}
/**
* @Author Darker
* @Descrption 订单
* @Date : Created in 15:45 2020-3-12
*/
@Data
@AllArgsConstructor
public class Order {
private String uid;
private String orderId;
private Double amount;
public MsgResult pay(String payKey){
Paymet paymet = PayStrategy.getInstance(payKey);
MsgResult result = paymet.pay(orderId, amount);
return result;
}
}
/**
* @Author Darker
* @Descrption 返回包装类
* @Date : Created in 16:07 2020-3-12
*/
@Data
@AllArgsConstructor
public class MsgResult {
private int code;
private Object data;
private String msg;
@Override
public String toString() {
return "支付状态:[" + code +"]," + msg +",交易详情"+ data;
}
}
/**
* @Author Darker
* @Descrption 支付策略
* @Date : Created in 16:25 2020-3-12
*/
public class PayStrategy {
public static final String ALI_PAY = "Alipay";
public static final String JD_PAY = "Jdpay";
public static final String WECHAT_PAY = "Wechatpay";
public static final String DEFAULT_PAY = ALI_PAY;
private static Map<String, Paymet> payStrategy =new HashMap<>();
static {
payStrategy.put(ALI_PAY,new Alipay());
payStrategy.put(JD_PAY,new JDpay());
payStrategy.put(WECHAT_PAY,new WechatPay());
}
public static Paymet getInstance(String payKey){
Paymet paymet = payStrategy.get(payKey) ;
return paymet == null ? payStrategy.get(DEFAULT_PAY):paymet;
}
}
/**
* @Author Darker
* @Descrption 测试
* @Date : Created in 16:21 2020-3-12
*/
public class payStrategyTest {
public static void main(String[] args) {
String payKey = "Jdpay";
String payKey2 = "Wechatpay";
//用户提交了一个订单
Order order = new Order("1", "2020031200000000", 570.00);
//用户选择支付方式,京东白条
MsgResult result = order.pay(payKey);
System.out.println(result);
//用户选择支付方式,微信支付
MsgResult result2 = order.pay(payKey2);
System.out.println(result2);
}
}
見てください、これは我々が実際にそれを使用するために支払う方法ではありません。
さて、最後に、我々は戦略パターンとJDKが、答えはコンパレータ、コンパレータで、私たちはしばしば、このコンパレータは、アルゴリズムの多くは、ソート、比較器がある場合について話に来て、私たちは自分の好きな戦略を自由に選択できますソート、非常に古典的。
それはJDKの方法またはCGLIB方法を選択された場合も同様に、ばねに、クラスの初期化中に戦略パターンを使用します。
要約:
利点:
開閉の原則に沿って、1 Strategyパターン
2.避け、そのような場合は...他など、複数の条件分岐文を、使用して.....
3. Strategyパターンは、アルゴリズムの機密性と安全性を向上させることができます
短所:
1.クライアントが使用するクラスを決定するために、すべての戦術と戦略を知っている必要があります。
2.コードはメンテナンスがより困難である、戦略カテゴリの多くを生成します。