作用
应用场景
场景一
比如华为和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);
}
}