模式定义
策略模式作为一种软件设计模式,指对象有某个行为,但是在不同的场景中,该行为有不同的实现算法。比如每个人都要“交个人所得税”,但是“在美国交个人所得税”和“在中国交个人所得税”就有不同的算税方法。
主要解决:在有多种算法相似的情况下,使用 if...else 所带来的复杂和难以维护。
何时使用:一个系统有许多许多类,而区分它们的只是他们直接的行为。
如何解决:将这些算法封装成一个一个的类,任意地替换。
关键代码:实现同一个接口。
优点: 1、算法可以自由切换。 2、避免使用多重条件判断。 3、扩展性良好。
缺点: 1、策略类会增多。 2、所有策略类都需要对外暴露。
策略模式结构如下:
案例分析
场景:某电商促销线上活动,付款方式有微信支付,支付宝支付等;打折种类有限时折扣,限量折扣等,写程序实现支付方式和折扣的动态扩展和组合。
代码实现如下:
支付策略抽象类
public abstract class PayStrategy {
public abstract void pay();
}
折扣抽象类
public abstract class DiscountStrategy {
public abstract void shipping();
}
public class WeiXinPay extends PayStrategy {
@Override
public void pay() {
System.out.println("微信支付。。。。。。");
}
}
public class AliPay extends PayStrategy {
@Override
public void pay() {
System.out.println("支付宝支付。。。。。。");
}
}
/**
* 限时
*/
public class TimeLimitedDiscount extends DiscountStrategy {
@Override
public void shipping() {
System.out.println("享受限时抢购折扣。。。。。。");
}
}
public class PayContext {
private PayStrategy payStrategy;
private DiscountStrategy discountStrategy;
public PayContext(PayStrategy payStrategy, DiscountStrategy discountStrategy) {
this.payStrategy = payStrategy;
this.discountStrategy = discountStrategy;
System.out.println("准备支付了。。。。。。");
}
/**
* 支付类型和打折
*/
public void payment(){
payStrategy.pay();
discountStrategy.shipping();
}
}
/**
* 限量
*/
public class AmountLimitedDiscount extends DiscountStrategy {
@Override
public void shipping() {
System.out.println("享受限量抢购折扣。。。。。。");
}
}
public class Test {
public static void main(String[] args) {
PayStrategy weiXinPay=new WeiXinPay();
PayStrategy aliPay=new AliPay();
DiscountStrategy timeLimited=new TimeLimitedDiscount();
DiscountStrategy amoutLimited=new AmountLimitedDiscount();
//四种组合
//1、微信支付+限时折扣
PayContext context1=new PayContext(weiXinPay,timeLimited);
context1.payment();
System.out.println("---------------------------------------------");
//2、微信支付+限量折扣
PayContext context2=new PayContext(weiXinPay,amoutLimited);
context2.payment();
System.out.println("---------------------------------------------");
//3、支付宝支付+限时折扣
PayContext context3=new PayContext(aliPay,timeLimited);
context3.payment();
System.out.println("---------------------------------------------");
//4、支付宝支付+限量折扣
PayContext context4=new PayContext(aliPay,amoutLimited);
context4.payment();
System.out.println("---------------------------------------------");
}
}
运行结果:
准备支付了。。。。。。
微信支付。。。。。。
享受限时抢购折扣。。。。。。
---------------------------------------------
准备支付了。。。。。。
微信支付。。。。。。
享受限量抢购折扣。。。。。。
---------------------------------------------
准备支付了。。。。。。
支付宝支付。。。。。。
享受限时抢购折扣。。。。。。
---------------------------------------------
准备支付了。。。。。。
支付宝支付。。。。。。
享受限量抢购折扣。。。。。。
---------------------------------------------
Process finished with exit code 0