美文网首页
1、策略模式

1、策略模式

作者: slowwalkerlcr | 来源:发表于2019-10-18 15:09 被阅读0次

    策略模式

    一、基本概念

    策略模式是行为型设计模式。

    其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换

    策略模式使得算法可以在不影响到客户端的情况下发生变化。

    二、结构

    下面是基本结构:

    image.png

    三类角色:

    • 环境(Context)角色:持有一个Strategy的引用。
    • 抽象策略(Strategy)角色:这是一个抽象角色,通常由一个接口或抽象类实现。此角色给出所有的具体策略类所需的接口。
    • 具体策略(ConcreteStrategy)角色:包装了相关的算法或行为。

    三、案例

    案例实现:

    定义一族算法,可以实现对两个数的操作,例如+、-、*、/等。

    实现代码整体框架图:

    image.png

    具体代码实现:

    Context类:

    /**
     * Context 是一个使用了某种策略的类。 实现了 Strategy 接口的实体策略类
     */
    public class Context {
    
        private Strategy strategy;
    
        public Context(Strategy strategy) {
            this.strategy = strategy;
        }
    
        public int executeStrategy(int num1, int num2){
            return strategy.doOperation(num1, num2);
        }
    }
    

    Strategy接口:

    /**策略的公共接口*/
    public interface Strategy {
        int doOperation(int num1, int num2);
    }
    

    三种对应的算法实现:

    /** 算法1: 实现加法 */
    public class OperationAdd implements Strategy {
        @Override
        public int doOperation(int num1, int num2) {
            return num1 + num2;
        }
    }
    
    /** 算法2:实现减法 */
    public class OperationSubstract implements Strategy{
        @Override
        public int doOperation(int num1, int num2) {
            return num1 - num2;
        }
    }
    
    /** 算法3: 实现乘法 */
    public class OperationMultiply implements Strategy{
        @Override
        public int doOperation(int num1, int num2) {
            return num1 * num2;
        }
    }
    

    测试类:

    public class MyTest {
        public static void main(String[] args) {
    
            Context context = new Context(new OperationAdd());
    
            System.out.println("10 + 5 = " + context.executeStrategy(10, 5));
    
            context = new Context(new OperationSubstract());
            System.out.println("10 - 5 = " + context.executeStrategy(10, 5));
    
            context = new Context(new OperationMultiply());
            System.out.println("10 * 5 = " + context.executeStrategy(10, 5));
        }
    }
    

    程序输出:

    10 + 5 = 15
    10 - 5 = 5
    10 * 5 = 50
    

    四、总结

    • 策略模式的重心不是如何实现算法,而是如何组织、调用这些算法;
    • 策略模式一个很大的特点就是各个策略算法的平等性。对于一系列具体的策略算法,大家的地位是完全一样的,正因为这个平等性,才能实现算法之间可以相互替换;
    • 使用策略模式可以避免使用多重条件(if-else)语句;

    相关文章

      网友评论

          本文标题:1、策略模式

          本文链接:https://www.haomeiwen.com/subject/kyjnsctx.html