设计模式--策略模式

Java工程源码

类图
这里写图片描述


定义
定义一组算法,将每个算法封装起来,并且使它们之间可以互换


优点
- 算法可以自由切换
- 避免使用多重条件判断
- 扩展性良好

缺点
- 策略类数量增多 每个策略一个类,复用的可能性很小,类数量增多
- 所有的策略多需要对外暴露


使用场景
- 多个类只有在算法或行为上稍有不同的场景
- 算法需要自由切换的场景
- 需要屏蔽算法规则的场景


注意事项
如果一个系统中策略家族的具体策略数量超过4个,则需要考虑使用混合模式,解决策略类膨胀和对外暴露的问题


抽象策略角色

public interface Strategy {
    /**
     * 策略模式的运算准则
     */
    void doSomething();
}

具体策略1

public class ConcreteStrategy1 implements Strategy {

    @Override
    public void doSomething() {
        System.out.println("具体策略1的运算法则");
    }
}

具体策略2

public class ConcreteStrategy2 implements Strategy {

    @Override
    public void doSomething() {
        System.out.println("具体策略2的运算法则");
    }
}

上下文对象

public class Context {
    /**
     * 策略
     */
    private Strategy strategy = null;

    /**
     * 设置具体策略
     *
     * @param strategy 策略
     */
    public void setStrategy(Strategy strategy) {
        this.strategy = strategy;
    }

    /**
     * 封装后的策略方法
     */
    public void doSomething() {
        this.strategy.doSomething();
    }
}

场景类

public class Client {
    public static void main(String[] args) {
        // 声明具体的策略
        Strategy strategy1 = new ConcreteStrategy1();
        Strategy strategy2 = new ConcreteStrategy2();
        // 声明上下文对象
        Context context = new Context();
        // 设置策略
        context.setStrategy(strategy1);
        context.doSomething();
        // 切换策略
        context.setStrategy(strategy2);
        context.doSomething();
    }
}

运行结果

具体策略1的运算法则
具体策略2的运算法则
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值