策略模式
策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改,在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。策略对象改变 context 对象的执行算法
比如在一个可变流程中,每个流程都是独立互不影响的,我们想任意替换流程中的某个步骤,或者某个流程的执行者,我们只需要把这部分流程塞到一个上下文Context里,需要就塞进去执行,不需要就删掉,保证流程的灵活性
又比如诸葛亮的锦囊,就类似一个上下文Context,用来装策略,诸葛亮可以根据状况各种组合锦囊里的策略
示例场景:电商系统中的商家和消费者的交易流程——商品上架,用户内容推荐,用户下单,用户支付,这几个策略形成了一个完整的交易过程,而这个过程中,用户内容推荐不是必要的,想随时拿掉的时候,代码的设计上需要满足这样的灵活性
定义一个策略接口
/** * 策略接口 * @author test11 */ public interface IStrategy { /** * 策略的具体执行,策略支持多种实现 */ public void operate(); }
交易过程的策略实现
/** * 电商商家端策略一,上架商品 * @author test11 */ public class Produce implements IStrategy{ @Override public void operate() { System.out.println("上架商品"); } }
/** * 内容推荐 * @author test11 */ public class Recommend implements IStrategy{ @Override public void operate() { System.out.println("用户内容推荐"); } }
/** * 下单 * @author test11 */ public class Order implements IStrategy{ @Override public void operate() { System.out.println("客户下单"); } }
/** *支付 * @author test11 */ public class Pay implements IStrategy{ @Override public void operate() { System.out.println("支付"); } }
对该交易流程的组织,用户内容推荐这个策略是随时可以拿掉的,只需要注释掉极少量代码即可
/** * 测试策略模式 * @author test11 */ public class Demo { public static void main(String[] args) { //上架 Context context = new Context(new Produce()); context.operate(); // //用户内容推荐 // context = new Context(new Recommend()); // context.operate(); //下单 context = new Context(new Order()); context.operate(); //支付 context = new Context(new Pay()); context.operate(); } }