美文网首页
那些你要知道的设计模式之-策略

那些你要知道的设计模式之-策略

作者: 小巨人Vea | 来源:发表于2018-04-22 12:06 被阅读16次

    一.定义

    定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。

    二.介绍

    策略者模式也是常见的一种模式,在开发过程中无意中就被使用,这次我直接为大家来讲解案例,先看一下策略者模式的基本类图


    策略者模式

    策略者模式分为三个角色

    • Context 封装类
      内部维护一个Strategy的实例,承接上下文启封装作用
      负责跟Strategy之间的交互调用Startegy的具体算法

    • IStrartegy 抽象策略类
      定义各种不同的算法策略(AlgorithmInterface),供Context调用

    • ConcreteStrategy 具体策略类
      实现IStrategy接口,提供具体的算法实现

    三. 应用

    基本的概念已经讲清楚了,接下来用一个案例加深对策略者模式的理解
    背景: 进书店去买书

    VIP半价,普通用户不打折

    步骤一: 定义策略抽象类IStrartegy

    public interface IStrategy {
        //消费
        void  spend(int originalPrice);
    }
    

    步骤二: 声明策略抽象类的两个实现类

    public class VIPStrategy implements IStrategy {
    
        @Override
        public void spend(int originalPrice) {
            System.out.println("会员购买"+originalPrice+"$的书花费"+originalPrice+"$");
        }
    }
    
    public class CommonStartegy  implements IStrategy {
    
        @Override
        public void spend(int originalPrice) {
            System.out.println("普通用户购买"+originalPrice+"$的书花费"+originalPrice+"$");
        }
    }
    

    步骤三: 定义封装类,让会员和普通用户清楚该消费多少

    public class Context {
    
        private IStrategy strartegy;
    
        public Context(IStrategy strartegy) {
            this.strartegy = strartegy;
        }
    
        public void spend(int originalPrice){
            this.strartegy.spend(originalPrice);
        }
    
    }
    

    通过下面这个场景我们来看一下会员和普通用户在购买100$价格的书的时候,该消费多少

     public static void main(String[] args) {
    
            IStrategy strategy = new VIPStrategy();
            //VIP买书
            Context context = new Context(strategy);
            //花费原价的一半
            context.spend(100);
    
            //不是会员买书
            context = new Context(new CommonStartegy());
            //不打折
            context.spend(100);
        }
    

    其运行结果:
    会员购买100$的书花费100$
    普通用户购买100$的书花费100$


    四 总结

    好处

    • 避免使用多重条件判断if else 语句。简化操作易于维护
    • 应对不同的变更,更加易于扩展,通过封装对外,

    缺点

    • 策略不同,策略类会增加,类的数量会增加,而且策略类是对外暴露的

    使用场景

    • 几个类它们的行为属于一个方向,只是它们的算法不同,可以使用策略者模式封装成不同的算法,让这些类选择

    相关文章

      网友评论

          本文标题:那些你要知道的设计模式之-策略

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