资讯专栏INFORMATION COLUMN

设计模式之策略模式

番茄西红柿 / 907人阅读

摘要:一定义定义维基百科策略模式作爲一種軟件設計模式,指對象有某個行爲,但是在不同的場景中,該行爲有不同的實現算法。二策略模式图我们看看策略模式是有怎样设计结构的。如中创建线程池,线程池任务满时,对提交的任务做处理就使用了策略模式。

以前完整的看过《大话设计模式》,虽然完整看过,也做过笔记,但现在依然很多已经很模糊。这段时间趁着离职,有时间,打算重新过一遍,该篇将介绍策略模式。

一、定义

定义(维基百科):策略模式作爲一種軟件設計模式,指對象有某個行爲,但是在不同的場景中,該行爲有不同的實現算法。比如每個人都要“交個人所得稅”,但是“在美國交個人所得稅”和“在中國交個人所得稅”就有不同的算稅方法。

策略模式,从模式名称中我们就可以窥探一二。无非就是一个动作可以有不同的策略,有不同的计算方法,我们将计算方法进行封装。如上的例子,美国税务计算、中国的税务计算采用了不同的计算方式(不同策略)。还有一个《大话设计模式》中的例子也很好的说明该设置模式,商场折扣,上次可能是满减,这次可能是直接打折,这就是两种不同的策略,那么我们在代码里该怎样设计,才会更清晰抽象这个问题呢?接下来我们就来看看策略模式是怎么抽象该类型的问题的。

二、策略模式UML图

我们看看策略模式是有怎样设计结构的。图片来源于维基百科。可以看到,策略模式定义了一个策略的接口Stragegy,该接口定义了一个方法,即为该策略的操作方法。再实现不同的策略类ConcreteStrategyA、ConcreteStrategyB,继承自策略接口。接着在上下文类Context类持有策略的引用,调用策略。


三、以商场打折为例子,我们来实现先策略模式。

1、先定义策略接口

package com.design.strategy;

/** * 商场打折接口 */
public interface IShopDiscountStrategy {    
    public int discount(int count);
}

2、再定义具体的策略

package com.design.strategy;
/** * 满减计算策略 */
public class DiscountFull implements IShopDiscountStrategy 
{    
    //满的金额    
    private int fullCount;    
    //减的金额    
    private int disCash;    
    public DiscountFull(int fullCount,int disCash){         
        this.fullCount = fullCount;        
        this.disCash = disCash;    
    }    
    @Override    
    public int discount(int count) {            
        if (count >= fullCount){            
            return count -disCash;        
        }        
        return count;    
    }
}

package com.design.strategy;
/** * 打折策略,打7折 */
public class DiscountPercent implements IShopDiscountStrategy 
{    
    //折扣率    
    private float disPer;    
    public DiscountPercent(float disPer){        
        this.disPer = disPer;    
    }    
    @Override    
    public int discount(int count) {        
        return (int) (count * disPer);    
    }
}

3、再定义上下文类,持有具体的策略引用。

package com.design.strategy;
public class DiscountContext {    
    private IShopDiscountStrategy iShopDiscountStrategy;    
    public DiscountContext(IShopDiscountStrategy iShopDiscountStrategy) {        
        this.iShopDiscountStrategy = iShopDiscountStrategy;    
    }    
    public int discount(int count){        
        return iShopDiscountStrategy.discount(count);    
    }
}

到此,策略模式编写的打折场景已经编写完毕,在来看看怎么调用

package com.design.strategy;public class StrategyTestMain {
    public static void main(String[] args) {        
        //使用满减策略计算实收总额        
        DiscountContext discountContext = new DiscountContext(new DiscountFull(200, 100));
        System.out.println(discountContext.discount(200));        
        //使用折扣策略计算实收总额        
        DiscountContext discountContext1 = new DiscountContext(new DiscountPercent(0.7f)); 
        System.out.println(discountContext1.discount(200));    
    }
}

四、优缺点

优点

1、简化单元测试

从例子我们就可以看出来每个策略都有多带带的类来实现,我们可以当度对策略进行测试。

2、扩展性好

我们要定义新的策略,只需要编写一个新的策略,并对新策略进行测试即可,不修改原来已经存在策略的代码。

3、避免使用多重条件转移语句

策略模式中使用的策略是有客户端选择的,策略相关的类不需要通过多重条件去选择策略。

缺点

1、客户端需自行决定使用的策略

客户端必须知道所有的策略类,并自行决定使用哪一个策略类。

2、定义的类比较多

每个策略都得定义一个类来实现。

结语

策略模式暂时总结到这里。看起来策略模式还是比较简单的,就是将不同的策略进行封装。实际适用于一个操作有不同的策略的应用场景中。如JDK中创建线程池,线程池任务满时,对提交的任务做处理就使用了策略模式。可以在创建线程池时,传入相应的处理策略。如下,最后一个参数传入一个处理策略。策略接口为RejectedExecutionHandler,具体的实现有:DiscardOldestPolicy,AbortPolicy....

public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,
        long keepAliveTime,TimeUnit unit,
        BlockingQueue workQueue,
        RejectedExecutionHandler handler)


文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/7103.html

相关文章

  • PHP面试常考设计模式——策略模式

    摘要:策略模式介绍策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。使用策略模式的好处策略模式提供了管理相关的算法族的办法。使用策略模式可以避免使用多重条件转移语句。 你好,是我琉忆,PHP程序员面试笔试系列图书的作者。 本周(2019.3.11至3.15)的一三五更新的文章如下: 周一:PHP面试常考之设计模式——工...

    Drinkey 评论0 收藏0
  • JavaScript设计模式策略模式

    摘要:设计模式与开发实践读书笔记。策略模式可以有效避免多重条件选择语句。当然,策略模式也有一些缺点增加了许多策略类或者策略对象。要使用策略模式,必须了解所有的,违反了最少知识原则。至此,回家咯附设计模式之发布订阅模式观察者模式 《JavaScript设计模式与开发实践》读书笔记。这本书挺好的,推荐。 俗话说,条条大路通罗马。在现实生活中,我们可以采用很多方法实现同一个目标。比如我们先定个小目...

    go4it 评论0 收藏0
  • 设计模式策略模式

    摘要:一定义定义维基百科策略模式作爲一種軟件設計模式,指對象有某個行爲,但是在不同的場景中,該行爲有不同的實現算法。二策略模式图我们看看策略模式是有怎样设计结构的。如中创建线程池,线程池任务满时,对提交的任务做处理就使用了策略模式。以前完整的看过《大话设计模式》,虽然完整看过,也做过笔记,但现在依然很多已经很模糊。这段时间趁着离职,有时间,打算重新过一遍,该篇将介绍策略模式。一、定义定义(维基百科...

    番茄西红柿 评论0 收藏0
  • 设计模式策略模式

    摘要:一定义定义维基百科策略模式作爲一種軟件設計模式,指對象有某個行爲,但是在不同的場景中,該行爲有不同的實現算法。二策略模式图我们看看策略模式是有怎样设计结构的。如中创建线程池,线程池任务满时,对提交的任务做处理就使用了策略模式。以前完整的看过《大话设计模式》,虽然完整看过,也做过笔记,但现在依然很多已经很模糊。这段时间趁着离职,有时间,打算重新过一遍,该篇将介绍策略模式。一、定义定义(维基百科...

    MangoGoing 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<