小安实现的代码如下:
/**
* @Author: 程序员小安
* @description: 购物车
* @CreateDate: 2019/10/27
* @Version: 1.0
*/
public class ShopCart {
public ShopCart() {
}
public void pay(String payType) {
if (Constant.WEIXIN_PAY.equals(payType)) {
//调用微信支付SDK
System.out.println("您选择的微信支付");
} else if (Constant.ALI_PAY.equals(payType)) {
//调用支付宝支付SDK
System.out.println("您选择的支付宝支付");
} else if (Constant.WEIXIN_FRIEND_PAY.equals(payType)) {
//调用微信好友支付SDK
System.out.println("您选择的找微信好友支付");
} else if (Constant.QQ_PAY.equals(payType)) {
//调用QQ支付SDK
System.out.println("您选择的QQ钱包支付");
} else {
System.out.println("您选择的支付方式暂未开通");
}
}
}
/**
* @Author: 程序员小安
* @description: 购物车常量
* @CreateDate: 2019/10/27
* @Version: 1.0
*/
public class Constant {
public static final String WEIXIN_PAY = "1";//微信支付
public static final String ALI_PAY = "2";//支付宝支付
public static final String WEIXIN_FRIEND_PAY = "3";//找微信好友支付
public static final String QQ_PAY = "4";//QQ钱包支付
}
public class MyClass {
public static void main(String[] args){
ShopCart shopCart = new ShopCart();
shopCart.pay(Constant.WEIXIN_PAY);
}
}
运行结果:
您选择的微信支付
策略模式:
定义了算法簇,分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。
官方定义不太好理解,我翻译一下,在策略模式中,会针对一个行为(比如支付),定义多个实现类,每个类都封装具体的实现算法,并且为了保证他们是同一行为,通常这些实现类,都会实现同一个接口。比如微信支付,支付宝支付,微信好友支付,QQ支付,缺省支付方式都是一个算法。
采用策略模式的UML图:
行为接口:
/**
* @Author: 程序员小安
* @description: 支付接口
* @CreateDate: 2019/10/27
* @Version: 1.0
*/
public interface Payment {
void pay(String price);
}
具体的支付算法:
/**
* @Author: 程序员小安
* @description: 微信支付方式
* @CreateDate: 2019/10/27
* @Version: 1.0
*/
public class WeixinPay implements Payment {
@Override
public void pay(String price) {
//调用微信支付SDK
System.out.println("微信支付金额:" + price);
}
}
/**
* @Author: 程序员小安
* @description: 微信好友支付方式
* @CreateDate: 2019/10/27
* @Version: 1.0
*/
public class WeixinFriendPay implements Payment{
@Override
public void pay(String price) {
//调用微信好友支付SDK
System.out.println("微信好友支付金额:" + price);
}
}
/**
* @Author: 程序员小安
* @description: QQ支付方式
* @CreateDate: 2019/10/27
* @Version: 1.0
*/
public class QQPay implements Payment{
@Override
public void pay(String price) {
//调用QQ支付SDK
System.out.println("QQ支付金额:" + price);
}
}
/**
* @Author: 程序员小安
* @description: 支付宝支付方式
* @CreateDate: 2019/10/27
* @Version: 1.0
*/
public class AliPay implements Payment {
@Override
public void pay(String price) {
//调用支付宝支付SDK
System.out.println("支付宝支付金额:" + price);
}
}
/**
* @Author: 程序员小安
* @description: 无支付方式
* @CreateDate: 2019/10/27
* @Version: 1.0
*/
public class DefaultPay implements Payment{
@Override
public void pay(String price) {
//无支付方式
System.out.println("您选择的支付方式暂未开通");
}
}
购物车代码:
/**
* @Author: 程序员小安
* @description: 购物车
* @CreateDate: 2019/10/27
* @Version: 1.0
*/
public class ShopCart {
private Payment payment;
public ShopCart() {
}
public void setPayment(Payment payment) {
this.payment = payment;
}
public void pay(String price) {
payment.pay(price);
}
}
public class MyClass {
public static void main(String[] args){
ShopCart shopCart = new ShopCart();
WeixinPay weixinPay = new WeixinPay();
shopCart.setPayment(weixinPay);
shopCart.pay("12");
}
}
运行结果:
微信支付金额:12
采用策略模式后,当新增支付方式时,只需要实现一个继承Payment接口的类即可,Shopcart类不需要做任何改动,做到了对修改关闭,对扩展开放的原则,同时也做到针对接口编程,而不是针对实现编程的设计原则。其实真正的项目中,Shopcart是个很复杂的类,里面会有很多业务逻辑,在新增业务不改动旧逻辑,会增加项目的稳定性,也减少测试的工作投入。
策略模式的优点
(1)策略模式提供了管理相关的算法族的办法。策略类的等级结构定义了一个算法或行为族。恰当使用继承可以把公共的代码移到父类里面,从而避免代码重复。
(2)使用策略模式可以避免使用多重条件(if-else)语句。多重条件语句不易维护,它把采取哪一种算法或采取哪一种行为的逻辑与算法或行为的逻辑混合在一起,统统列在一个多重条件语句里面,比使用继承的办法还要原始和落后。
策略模式的缺点
(1)客户端必须知道所有的策略类,并自行决定使用哪一个策略类。这就意味着客户端必须理解这些算法的区别,以便适时选择恰当的算法类。换言之,策略模式只适用于客户端知道算法或行为的情况。
(2)由于策略模式把每个具体的策略实现都单独封装成为类,如果备选的策略很多的话,那么对象的数目就会很可观。
什么时候使用:
某些业务中,某一个行为,会有多个实现类,并且在一次运行中,当前业务只会选择一种实现类。比如商场卖衣服,会有个会员行为,普通会员,银牌会员,金牌会员,客户只能是会员中的一个,不同的人是不同类型的会员,所以他们之间是可以动态替换的。
如有错误欢迎指出来,一起学习。
网友评论