现在的位置: 首页 > 综合 > 正文

<二>读<<大话设计模式>>之策略模式

2018年05月24日 ⁄ 综合 ⁄ 共 1793字 ⁄ 字号 评论关闭

       又和大家见面了,能够坚持写出第二篇文章真不错,好好加油。

       <<大话设计模式>>讲解策略模式是以商场收银软件程序开头的,那么问题来了,哪家商场收银软件强,开玩笑了。读过上篇文章《《简单工厂模式》》的知道,它有两个缺点:1、客户端依赖两个类,耦合性高;2、如果算法过多则需要写很多类。解决上面问题的就是策略模式了。

策略模式:它定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的客户。

商场收银软件:单价*打折算法=售价。对于这样的软件来说,需要经常变化的是打折算法,其实用简单工厂模式完全可以的,直接增加打折算法,然后工厂生产实例对象就可以了。

       但是这个模式知识解决对象创建问题,而且由于工厂本身包括了所有收费方式,商场是可能经常更改打折算法的,每次维护或扩展收费方式都要改动这个工厂,这样是非常麻烦也不遵循易扩展、易复用原则。其实分析一下该软件的变化点就是打折算法,我们只要将这个变化点封装起来就可以了,而策略模式能够做到这一点。

好了,上代码了,根据例子学习进步快

1、策略类,定义了所有算法实现的公共方法接口

/*

 *
策略类

 */

publicabstractclass Strategy {

 

    /*

     *
定义所有算法的公共接口

     */

    publicabstractvoid algorithmlnterface();

}

2、维护一个对Strategy类的引用,想调用那个类就调用那个类

/*

 *
维护对strategy
对象的引用

 */

publicclass Context {

 

    Strategystrategy;

    public Context(Strategy strategy){

       this.strategy = strategy;

    }

   

    publicvoid contextInterface(){

       strategy.algorithmlnterface();

    }

}

3、算法a

publicclass ConcreteStrategyAextends Strategy
{

 

    @Override

    publicvoid algorithmlnterface() {

       //TODO Auto-generated method stub

 

       System.out.println("this is algorithm a ;");

    }

 

}

4、算法b

publicclass ConcreteStrategyBextends Strategy
{

 

    @Override

    publicvoid algorithmlnterface() {

       //TODO Auto-generated method stub

 

       System.out.println("this is algorithm b ;");

    }

 

}

5、客户端调用

publicclass StrategyClient {

 

    /**

     * @param args

     */

    publicstaticvoid main(String[] args) {

       //TODO Auto-generated method stub

 

       /*

        *
对比与工厂模式,该客户端仅仅依赖于Context
类,解耦更加彻底

        *
增加一个算法仅仅需要增加一个算法类即可

        */

       Contextcontext =
new
Context(new ConcreteStrategyA());

       context.contextInterface();

       //看到了吧,想要B算法就直接实例一下就可以调用它的方法了

       Contextcontext2 =
new
Context(new ConcreteStrategyB());

       context2.contextInterface();

    }

 

}

总结:策略模式是一种定义一系列算法的方法,从概念上来看,所有这些算法完成的都是相同的工作,只是实现不同,它可以以相同的方式调用所有的算法,减少了各种算法类与使用算法类之间的耦合。

附上代码地址:http://download.csdn.net/detail/jzhf2012/8084405

抱歉!评论已关闭.