揭秘设计模式:策略模式(Strategy)的学习与理解

    链接地址:http://www.xx566.com/detail/119.html

    之前在做游戏交易平台的时候,有这样一个需求:不同类型的游戏,根据交易金额收取手续费的比例不同,比如PC端游收取5%,页游收取3%,手游收取0,在 学习设计模式之前,我们可能需要在客户端判断游戏类型进行费用的计算,了解了策略(Strategy)模式,我们知道针对不同的游戏类型有不同的收费策 略,这是典型的策略模式的应用场景,今天就来记录一下策略模式的学习。

 

    策略模式(Strategy)的英文定义是:the Strategy Pattern defines a family of algorithms,encapsulates each one,and makes them interchangeable。Strategy lets the algorithm vary independently from clients that use it。翻译过来就是:策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。 (参见:百度百科)我们通过策略模式的UML图来进行细致的了解。

揭秘设计模式:策略模式(Strategy)的学习与理解_第1张图片

     从上图,我们可以看到,策略模式的构成有三部分:Context环境类,Strategy抽象策略类,ConcreteStrategy具体策略类。其中 Strategy抽象策略类,负责定义所有具体策略算法的抽象,一般使用抽象类或接口,用于定义公共接口。Context环境类可以通过这个抽象类或接 口,来调用具体策略类中的算法。Context环境类,负责维护抽象策略类的引用,同时负责动态设置运行时具体策略类中的算法,它承担着与 Strategy之间交互和数据传递的角色。ConcreteStrategy具体策略类,Strategy抽象策略类的具体实现。


    下面,我们通过一个具体的示例,来加深对策略模式的学习和理解,(开篇需求的简单实现),首先我们定义一个手续费计算接口,提供一个手续费计算的接口,接收交易金额作为参数,代码如下:

package javase.strategy;
 
/**
 * 手续费接口
 * 
 * @Package javase.strategy
 * @ClassName: HandFeeInterface
 * @author Realfighter
 * @date 2014-8-8 下午02:31:09
 */
public interface HandFeeInterface {
 
    /**
     * 手续费计算方法
     * 
     * @Title: countHandFee
     * @author Realfighter
     * @date 2014-8-8 下午02:32:03
     * @param amount
     *            交易金额
     * @return double 应收手续费
     */
    public double countHandFee(double amount);
 
}

    之后我们,新建手续费环境类,内部维护手续费接口的引用,提供手续费计算方法,代码如下:

package javase.strategy;
 
/**
 * 手续费类
 * 
 * @Package javase.strategy
 * @ClassName: HandFee
 * @author Realfighter
 * @date 2014-8-8 下午03:11:12
 */
public class HandFee {
 
    // 手续费规则策略对象
    private HandFeeInterface handFeeInterface;
 
    /**
     * <p>
     * Description: 构造具体的手续费规则对象
     * </p>
     * 
     * @param handFeeInterface
     */
    public HandFee(HandFeeInterface handFeeInterface) {
        this.handFeeInterface = handFeeInterface;
    }
 
    public double countHandFee(double amount) {
        return handFeeInterface.countHandFee(amount);
    }
 
}

    接下来,我们对手续费接口作不同方式的实现,分别是端游、页游和手游,代码如下:

/**
 * 端游手续费规则5%
 * 
 * @Package javase.strategy
 * @ClassName: HandFeeOfPC
 * @author Realfighter
 * @date 2014-8-8 下午02:34:18
 */
class HandFeeOfPC implements HandFeeInterface {
 
    /**
     * 计算手续费
     * 
     * @Title: countHandFee
     * @author Realfighter
     * @date 2014-8-8 下午02:35:05
     * @param amount
     * @return
     */
    public double countHandFee(double amount) {
        return amount * 5 / 100;
    }
 
}
 
/**
 * 页游手续费规则2%
 * 
 * @Package javase.strategy
 * @ClassName: HandFeeOfPage
 * @author Realfighter
 * @date 2014-8-8 下午03:05:05
 */
class HandFeeOfPage implements HandFeeInterface {
 
    /**
     * 计算手续费
     * 
     * @Title: countHandFee
     * @author Realfighter
     * @date 2014-8-8 下午02:35:05
     * @param amount
     * @return
     */
    public double countHandFee(double amount) {
        return amount * 2 / 100;
    }
 
}
 
/**
 * 手游手续费规则0
 * 
 * @Package javase.strategy
 * @ClassName: HandFeeOfMobile
 * @author Realfighter
 * @date 2014-8-8 下午03:05:50
 */
class HandFeeOfMobile implements HandFeeInterface {
 
    /**
     * 计算手续费
     * 
     * @Title: countHandFee
     * @author Realfighter
     * @date 2014-8-8 下午02:35:05
     * @param amount
     * @return
     */
    public double countHandFee(double amount) {
        return 0;
    }
 
}

    接下来,我们简单的建立一个交易中心的客户端,用于测试,代码如下:

package javase.strategy;
 
/**
 * 交易中心
 * 
 * @Package javase.strategy
 * @ClassName: TradeCenter
 * @author Realfighter
 * @date 2014-8-8 下午03:07:54
 */
public class TradeCenter {
 
    public static void main(String[] args) {
        // 假设交易金额500元
        double amount = 500.0;
         
        // 选择合适的手续费规则策略
//      HandFeeInterface handFeeInterface = new HandFeeOfPC();//端游
//      HandFeeInterface handFeeInterface = new HandFeeOfPage();//页游
        HandFeeInterface handFeeInterface = new HandFeeOfMobile();//手游
         
        // 构造相应的手续费规则对象
        HandFee handFee = new HandFee(handFeeInterface);
         
        // 计算相应的手续费规则
        System.out.println(handFee.countHandFee(amount));
    }
 
}

     总结:我们可以通过选择不同的手续费规则策略,计算相应的手续费规则,当有新的手续策略出现时,我们只需要实现手续费接口,在合适的地方应用这些策略就可 以了。策略模式相对比较容易理解和使用,本质上也是面向对象三大特征封装、继承和多态的应用,在日常工作中,一般也是与其他设计模式混合使用,所以说,学 习和理解设计模式真的很关键。

你可能感兴趣的:(java,设计模式,策略模式,strategy)