策略模式

多种算法写在一个类中,根据条件使用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原有的费用计算逻辑。

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

你可能感兴趣的:(策略模式)