策略模式(strategy)

作用

应用场景

场景一

比如华为和apple两家的手机都想要进行优惠促销的活动。华为想用优惠券做活动,apple想打折进行活动

简单代码实现

包的个数只是红色矩形内的文件个数
在这里插入图片描述

类的关系图
在这里插入图片描述
一下就是代码被撸出来的顺序。。。。

//定义优惠活动的抽象
public interface IPromoteStategy {
    void doPromoteStategy();
}

//优惠券活动
public class CouponPromote implements IPromoteStategy {
    @Override
    public void doPromoteStategy() {
        System.out.println(" 优惠券直接抵消金额");
    }
}
//抽奖打折活动
public class DiscountPromote implements  IPromoteStategy {
    @Override
    public void doPromoteStategy() {
        System.out.println(" 进行打折优惠");
    }
}

//默认没有促销活动
public class NoPromote implements IPromoteStategy{
    @Override
    public void doPromoteStategy() {
        System.out.println(" 原价销售,没有优惠策略");
    }
}
//商品管理员选择活动的入口
public class PromotActivity {
    IPromoteStategy promoteStategy;
    //将管理员想要进行的活动 传值给活动中心
    public  PromotActivity(IPromoteStategy promoteStategy) {
        this.promoteStategy = promoteStategy;
    }

    public void execute() {
        this.promoteStategy.doPromoteStategy();
    }
}

//测试 , 再测试过程中发现 如果想要增加一个优惠活动,要多次的去new一个策略。
//这样的场景很像 工厂模式的场景。
public class StrategyTest {
    public static void main(String[] args) {
        System.out.println( "华为天猫旗舰店 正在选择是否进行促销活动。。。。");
        System.out.println("进行限时发放优惠券活动....");
        PromotActivity huawei = new PromotActivity(new CouponPromote());
        huawei.execute();

        System.out.println("--------------------");
        System.out.println( "apple天猫旗舰店 正在选择是否进行促销活动。。。。");
        System.out.println("进行限时发放抽打折现活动....");
        PromotActivity apple = new PromotActivity(new DiscountPromote());
        apple.execute();
    }
}

优化上面的代码

因为再如果根据业务需要增加一个促销活动,程序员改动的代码从测试到实现都要增加,这样比较复杂。所以要进行优化
类的展示
在这里插入图片描述
类关系图
在这里插入图片描述

增加代码的实现


public class ActivityConstants {
    public static final  String COUPON = "COUPON"; //优惠券
    public static final  String DISCOUNT = "DISCOUNT"; //打折
    public static final  String DEFAULT = "DEFAULT";//无优惠
}


//从上面代码可以看出,再测试中可以用工厂模式去优化
public class PromoteStrategyFactory {

    //每个活动都只有一个入口,所以用到 单例模式
    private PromoteStrategyFactory () {}

    private static Map<String, IPromoteStategy> allStrategy = new HashMap<>();
    //注册式单例
    static {
        allStrategy.put(ActivityConstants.COUPON, new CouponPromote());
        allStrategy.put(ActivityConstants.DISCOUNT, new DiscountPromote());
        allStrategy.put(ActivityConstants.DEFAULT, new NoPromote());
    }

    //promoteKey就相当于页面的传值
    public static void  choosePromote(String promoteKey) {
        IPromoteStategy stategy = allStrategy.get(promoteKey);
        if(null == stategy){
            System.out.println("没有相关的活动, 默认无促销");
            stategy = new NoPromote();
        }
        stategy.doPromoteStategy();

    }

}
public class OptimizeTest {
    public static void main(String[] args) {
        System.out.println( "华为天猫旗舰店 正在选择是否进行促销活动。。。。");
        System.out.println("进行限时发放优惠券活动....");
        PromoteStrategyFactory.choosePromote(ActivityConstants.COUPON);

        System.out.println("--------------");
        System.out.println( "apple天猫旗舰店 正在选择是否进行促销活动。。。。");
        System.out.println("进行限时发放抽打折现活动....");
        PromoteStrategyFactory.choosePromote(ActivityConstants.DISCOUNT);
    }
}

场景二

我们平时再携程上买火车票,当去支付的时候,会提示用户选择支付方式。我们模拟这个场景写出逻辑

代码实现

类的展示
在这里插入图片描述

关系图
在这里插入图片描述
代码顺序

//订单实体类
public class Order {
    private Integer uid;
    private Integer oid;
    private Double cash;
    private String wayId;//支付方式id

    public Order(Integer uid, Integer oid, Double cash, String wayId) {
        this.uid = uid;
        this.oid = oid;
        this.cash = cash;
        this.wayId = wayId;
    }

    public Integer getUid() {
        return uid;
    }

    public void setUid(Integer uid) {
        this.uid = uid;
    }

    public Integer getOid() {
        return oid;
    }

    public void setOid(Integer oid) {
        this.oid = oid;
    }

    public Double getCash() {
        return cash;
    }

    public void setCash(Double cash) {
        this.cash = cash;
    }

    public String getWayId() {
        return wayId;
    }

    public void setWayId(String wayId) {
        this.wayId = wayId;
    }
//因为无论用什么方式支付,支付的逻辑是大概是一样的。所以用到模板模式。
//抽象类可以处理通用的逻辑,不同的逻辑可以交给子类去实现
public  abstract  class PayStrategy {
    protected  abstract  String queryPayName();
    //查询余额
    protected  abstract double queryMoney();


    public final void pay(Order order) {
        System.out.println("。。。。。进行支付。。。。");
        if(queryMoney() >= order.getCash())
            System.out.println("通过【 "+ queryPayName()+"方式】支付成功 "+ order.getCash() +"元。");
        else
            System.out.println("【"+ queryPayName()+"】账户余额不足,请选择其他支付方式");
    }
}
//支付宝账户
public class AliPay extends PayStrategy {
    @Override
    protected String queryPayName() {
        return "支付宝";
    }

    //模拟查询支付数据库余额
    @Override
    protected double queryMoney() {
        return 512.40;
    }
}
public class JDPay extends  PayStrategy {
    @Override
    protected String queryPayName() {
        return "京东白条";
    }

    @Override
    protected double queryMoney() {
        return 30;
    }
}


public class WechatPay extends PayStrategy {
    @Override
    protected String queryPayName() {
        return "微信";
    }

    @Override
    protected double queryMoney() {
        return 123.25;
    }
}
public class WayConstants {
    public static  final  String ALI_PAY = "ALIPAY";
    public static  final  String WECHAT_PAY = "WECHATIPAY";
    public static  final  String JD_PAY = "JDPAY";
    public static  final  String DEFAULT = ALI_PAY;
}


//模拟 当用户点击提交,后台接收订单信息
public class OrderPaySubmit {
    private OrderPaySubmit(){}
    private static Map<String,PayStrategy> payStrategy = new HashMap<>();

    static {
        payStrategy.put(WayConstants.ALI_PAY,new AliPay());
        payStrategy.put(WayConstants.WECHAT_PAY,new WechatPay());
        payStrategy.put(WayConstants.JD_PAY,new JDPay());
        payStrategy.put(WayConstants.DEFAULT,new AliPay());
    }

    //判断用户选择的支付方式
    public static void pay(Order order) {
        PayStrategy strategy = payStrategy.get(order.getWayId());
        if(strategy == null){
            strategy = payStrategy.get(WayConstants.DEFAULT);
        }
        System.out.println("后台判断用户选择支付方式");
        strategy.pay(order);
    }
}
//测试
public class PayTest {
    public static void main(String[] args) {
        Order order = new Order(1,11,300.0,WayConstants.JD_PAY);
        System.out.println("用户选择完产品,即将下单");
        OrderPaySubmit.pay(order);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值