美文网首页
策略模式

策略模式

作者: kinglong1984 | 来源:发表于2018-10-13 19:29 被阅读6次

    多种算法写在一个类中,根据条件使用if-else调用的常规做法的替代方案。实现主业务逻辑与算法策略的解耦,对多种策略分而治之,结构更清晰。

    定义

    定义了一系列的算法,并将每一种算法封装起来,使他们还可以互相替换。使算法独立于使用它的客户而独立变化。

    角色

    Context——环境角色:用来操作策略的上下文环境。

    1.内部维护一个Strategy的实例。

    2.提供公共方法,用于设置Strategy实例为某一具体的算法。

    3.负责跟Strategy之间的交互和数据传递。

    Strategy——策略角色:一个接口或一个抽象类。

    定义一个公共接口,Context使用这个接口调用不同的算法。

    ConcreteStrategy——具体策略角色:封装了相关算法和行为的一组类。

    实现了Strategy定义的接口,提供具体的算法实现。

    示例代码

    /**

    *策略角色(Strategy)

    *费用策略

    */

    interface CalculateStrategy{

        public int calculateFee(int days);

    }

    /**

    *具体策略类(ConcreteStrategy)

    *1:乘坐飞机

    */

    public class AirPlaneStrategy implements CalculateStrategy{

        @override

        public int calculateFee(int days){

            return days*500+2*2000;

        }

    }

    /**

    *具体策略类(ConcreteStrategy)

    *2:乘坐高铁

    */

    public class HighSpeedRailStrategy implements CalculateStrategy{

        @override

        public int calculateFee(int days){

            return days*500+2*900;

        }

    }

    /**

    *环境类(Context)

    * 旅行费用计算

    */

    public class TravelFee{

       CalculateStrategy mStrategy;

       public void setStrategy(CalculateStrategy strategy ){

            this.mStrategy  = strategy;

       }

       public int calculateFee(int days){

            return strategy.calculateFee(days)

        }

    }

    /**

    * 旅行使用策略模式计算费用

    */ 

    public class Travel{

        int days;

        public static void main(String[] args){

               //其他业务逻辑

               //计算费用

               days = 3;

               TravelFee travelee = new TravelFee();

                travelee.setStrategy(new AirPlaneStrategy());

                system.out.println("乘坐飞机旅行的费用:"+travelee.calculateFee(days ));

                travelee.setStrategy(new HighSpeedRailStrategy());

                system.out.println("乘坐高铁旅行的费用:"+travelee.calculateFee(days ));

       }

    }

    如果需要新增一种长途巴士出行旅游的方式,只需要增加一个IntercityBusStrategy,实现接口CalculateStrategy即可,不需要修改TravelFee原有的费用计算逻辑。

    如果需求变化,某一种策略的计算方式发生变化,只需要单独修改相应策略类即可,旅行费用类和其他类都不受影响。

    相关文章

      网友评论

          本文标题:策略模式

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