策略模式,是对谁和谁的解耦?
策略模式,怎么用?
策略模式(Strategy Pattern),定义了一系列算法并分别封装起来,算法间可以互换。它是一种行为型模式。
特点:对算法和算法使用者进行解耦。
业务场景:对算法和算法使用者进行分离的场景。
关键代码:一个策略接口类及一系列算法实现。
下面看UML类图:
类图说明:支付策略接口类IPayStrategy,它有两个实现类AliyunPay阿里云支付类、WxinPay微信支付类,还可以扩展更多的其他支付类;Order订单类,算法的使用者,最终只使用一种支付算法。
下面看代码实现:
1.支付策略接口类;
/**
* 1.支付策略接口类
* @author 程就人生
* @Date
*/
public interface IPayStrategy {
/**
* 支付
* @param money 支付金额
*/
public void pay(double money);
}
2.支付具体实现类;
/**
* 2.1 阿里云支付
* @author 程就人生
* @Date
*/
public class AliyunPay implements IPayStrategy{
@Override
public void pay(double money) {
System.out.println("使用支付宝支付:" + money + "元");
}
}
/**
* 2.2 微信支付
* @author 程就人生
* @Date
*/
public class WxinPay implements IPayStrategy{
@Override
public void pay(double money) {
System.out.println("使用微信支付:" + money + "元");
}
}
3.订单类,支付策略的使用者;
/**
* 3.订单简单实现
* @author 程就人生
* @Date
*/
public class Order {
private IPayStrategy payStrategy;
private double orderPrice;
public Order(IPayStrategy payStrategy) {
this.payStrategy = payStrategy;
}
public void pay(){
payStrategy.pay(orderPrice);
}
public double getOrderPrice() {
return orderPrice;
}
public void setOrderPrice(double orderPrice) {
this.orderPrice = orderPrice;
}
}
4.测试代码;
public static void main(String[] argo){
// 生成的订单,使用支付宝支付
Order order1 = new Order(new AliyunPay());
order1.setOrderPrice(100);
order1.pay();
// 生成的订单,使用微信支付
Order order2 = new Order(new WxinPay());
order2.setOrderPrice(200);
order2.pay();
}
运行结果:
使用支付宝支付:100.0元
使用微信支付:200.0元
这段代码的意思是:在网上下了两个订单,一个使用支付宝支付,一个使用微信支付。一个订单,要么使用微信支付,要么使用支付宝支付,当然还可以扩展其他类型的支付,任凭客户选择其中的一种支付方式。这就是策略模式的简单使用。
最后总结
策略模式,是对算法和算法使用者的解耦。从代码优化上来看,可以避免多重条件判断if else 、switch等。有利于扩展,只需增加策略的实现类,符合开闭原则。
在你的项目中,有类似于支付这样的场景吗?
如果有,你是怎么处理的?是否还有优化的空间?











网友评论