`

研磨设计模式之策略模式-5

 
阅读更多

接策略模式-4,其实是讲的一个主题,写在一个里面超长了,只好分成了两个,请见谅!

 

 

 

3:扩展示例,实现方式一
        经过上面的测试可以看出,通过使用策略模式,已经实现好了两种支付方式了。如果现在要增加一种支付方式,要求能支付到银行卡,该怎么扩展最简单呢?
        应该新增加一种支付到银行卡的策略实现,然后通过继承来扩展支付上下文,在里面添加新的支付方式需要的新的数据,比如银行卡账户,然后在客户端使用新的上下文和新的策略实现就可以了,这样已有的实现都不需要改变,完全遵循开-闭原则。
        先看看扩展的支付上下文对象的实现,示例代码如下:

 

 

 

/**

 扩展的支付上下文对象

 */

public class PaymentContext2 extends PaymentContext {

    /**

     银行帐号

     */

    private String account = null;

    /**

     构造方法,传入被支付工资的人员,应支付的金额和具体的支付策略

     @param userName 被支付工资的人员

     @param money 应支付的金额

     @param account 支付到的银行帐号

     @param strategy 具体的支付策略

     */

    public PaymentContext2(String userName,double money,

String account,PaymentStrategy strategy){

       super(userName,money,strategy);

       this.account = account;

    }

    public String getAccount() {

       return account;

    }

}

 

然后看看新的策略算法的实现,示例代码如下: 

 

 

/**

 支付到银行卡

 */

public class Card implements PaymentStrategy{

    public void pay(PaymentContext ctx) {

       //这个新的算法自己知道要使用扩展的支付上下文,所以强制造型一下

       PaymentContext2 ctx2 = (PaymentContext2)ctx;

       System.out.println("现在给"+ctx2.getUserName()+""

+ctx2.getAccount()+"帐号支付了"+ctx2.getMoney()+"");

       //连接银行,进行转帐,就不去管了

    }

}

 

最后看看客户端怎么使用这个新的策略呢?原有的代码不变,直接添加新的测试就可以了,示例代码如下: 

 

 

public class Client {

    public static void main(String[] args) {

       //创建相应的支付策略

       PaymentStrategy strategyRMB = new RMBCash();

       PaymentStrategy strategyDollar = new DollarCash();

      

       //准备小李的支付工资上下文

       PaymentContext ctx1 =

new PaymentContext("小李",5000,strategyRMB);

       //向小李支付工资

       ctx1.payNow();

      

       //切换一个人,给petter支付工资

       PaymentContext ctx2 =

new PaymentContext("Petter",8000,strategyDollar);

       ctx2.payNow();

      

       //测试新添加的支付方式

       PaymentStrategy strategyCard = new Card();

       PaymentContext ctx3 = new PaymentContext2(

"小王",9000,"010998877656",strategyCard);

       ctx3.payNow();

    }

}

 

再次测试,体会一下,运行结果如下: 

 

 

现在给小李人民币现金支付5000.0

现在给Petter美元现金支付8000.0

现在给小王的010998877656帐号支付了9000.0

 

4:扩展示例,实现方式二
        同样还是实现上面这个功能:现在要增加一种支付方式,要求能支付到银行卡。
(1)上面这种实现方式,是通过扩展上下文对象来准备新的算法需要的数据。还有另外一种方式,那就是通过策略的构造方法来传入新算法需要的数据。这样实现的话,就不需要扩展上下文了,直接添加新的策略算法实现就好了。示例代码如下: 

 

 

/**

 支付到银行卡

 */

public class Card2 implements PaymentStrategy{

    /**

     帐号信息

     */

    private String account = "";

    /**

     构造方法,传入帐号信息

     @param account 帐号信息

     */

    public Card2(String account){

       this.account = account;

    }

    public void pay(PaymentContext ctx) {

       System.out.println("现在给"+ctx.getUserName()+""

+this.account+"帐号支付了"+ctx.getMoney()+"");

       //连接银行,进行转帐,就不去管了

    }

}

 

(2)直接在客户端测试就可以了,测试示例代码如下:  

 

public class Client {

    public static void main(String[] args) {

       //测试新添加的支付方式

       PaymentStrategy strategyCard2 = new Card2("010998877656");

       PaymentContext ctx4 =

new PaymentContext("小张",9000,strategyCard2);

       ctx4.payNow();

    }

}

 

 

 

运行看看,好好体会一下。


 (3)现在有这么两种扩展的实现方式,到底使用哪一种呢?或者是哪种实现更好呢?下面来比较一下:
        对于扩展上下文的方式:这样实现,所有策略的实现风格更统一,策略需要的数据都统一从上下文来获取,这样在使用方法上也很统一;另外,在上下文中添加新的数据,别的相应算法也可以用得上,可以视为公共的数据。但缺点也很明显,如果这些数据只有一个特定的算法来使用,那么这些数据有些浪费;另外每次添加新的算法都去扩展上下文,容易形成复杂的上下文对象层次,也未见得有必要。
        对于在策略算法的实现上添加自己需要的数据的方式:这样实现,比较好想,实现简单。但是缺点也很明显,跟其它策略实现的风格不一致,其它策略都是从上下文中来获取数据,而这个策略的实现一部分数据来自上下文,一部分数据来自自己,有些不统一;另外,这样一来,外部使用这些策略算法的时候也不一样了,不太好以一个统一的方式来动态切换策略算法。
        两种实现各有优劣,至于如何选择,那就具体问题,具体的分析了。


5:另一种策略模式调用顺序示意图
        策略模式调用还有一种情况,就是把Context当做参数来传递给Strategy,也就是本例示范的这种方式,这个时候策略模式的调用顺序如图4所示:

图4  策略模式调用顺序示意图二

 

 

 

未完待续......

 

 

注:本文转自   http://chjavach.iteye.com

分享到:
评论

相关推荐

    研磨设计模式(完整带书签).part2.pdf

    《研磨设计模式》完整覆盖GoF讲述的23个设计模式并加以细细研磨。初级内容从基本讲起,包括每个模式的定义、功能、思路、结构、基本实现、运行调用顺序、基本应用示例等,让读者能系统、完整、准确地掌握每个模式,...

    研磨设计模式-配套源代码 UTF-8格式

    《研磨设计模式》是一本深入探讨软件设计原则与实践的经典书籍,其配套源代码提供了丰富的实例,帮助读者更好地理解和应用各种设计模式。这个UTF-8格式的压缩包包含了书中介绍的各种设计模式的实现,是学习和研究...

    研磨设计模式--chjavach的博客文章

    研磨设计模式的过程是持续学习和实践的过程,chjavach的博客文章提供了深入探讨这些模式的宝贵资源,值得我们仔细阅读和学习。通过深入理解和运用这些设计模式,可以提升个人的编程技巧,同时也为团队合作和项目维护...

    研磨设计模式PDF

    《研磨设计模式》这本书是陈臣和王斌两位作者合作的成果,专注于讲解软件设计中的模式应用。设计模式是软件工程中的一种最佳实践,它总结了在特定上下文中解决问题的常见方法,使得开发者可以复用这些解决方案,提高...

    研磨设计模式[书签]

    《研磨设计模式》是由陈臣和王斌合著,由清华大学出版社出版的一本深入探讨设计模式的专业书籍。设计模式是软件工程中的一个重要概念,它代表了在特定上下文中解决问题的常见方法,经过时间和实践的验证,具有很高的...

    研磨设计模式-配套源代码.rar

    《研磨设计模式》是一本深入探讨软件设计模式的书籍,配套源代码是作者为了帮助读者更好地理解和应用书中介绍的设计模式而提供的实践示例。设计模式是软件开发中经过实践检验的、解决常见问题的模板,它为软件设计...

    研磨设计模式全部源代码

    这个压缩包“研磨设计模式全部源代码”包含了多种设计模式的实现,这些模式可以帮助开发者写出更可维护、可扩展和可复用的代码。下面将详细讲解其中可能包含的一些重要设计模式及其应用。 1. 工厂模式:这是最简单...

    研磨设计模式.rar

    《研磨设计模式》这本书是软件开发领域中的经典之作,主要关注的是面向对象设计中的设计模式。设计模式是在特定上下文中解决常见问题的最佳实践,它为开发者提供了在类似情况下重复使用解决方案的模板,有助于提高...

    研磨设计模式博文集

    这个“研磨设计模式博文集”显然是一份深入探讨设计模式的资料集合,其中可能包含了对多种设计模式的详细解析、示例代码以及实际应用中的经验分享。在软件开发中,设计模式能够帮助开发者提高代码质量、可读性和可...

    研磨设计模式讲课PPT

    研磨设计模式是一本深入探讨软件设计原则与实践的书籍,其讲课PPT为我们提供了丰富的设计模式知识。设计模式是软件工程中经过实践验证的、解决常见问题的模板,是经验丰富的开发人员智慧的结晶。这些模式可以帮助...

    研磨设计模式 源代码

    《研磨设计模式》是一本深入探讨软件设计模式的经典书籍,源代码包含了书中所讲解的各种设计模式的实际应用示例。设计模式是软件工程中的重要概念,它们是经过反复验证、在特定情境下解决常见问题的有效解决方案。...

    研磨设计模式(完整带书签).part1.pdf

    《研磨设计模式》完整覆盖GoF讲述的23个设计模式并加以细细研磨。初级内容从基本讲起,包括每个模式的定义、功能、思路、结构、基本实现、运行调用顺序、基本应用示例等,让读者能系统、完整、准确地掌握每个模式,...

    研磨设计模式-part2

    《研磨设计模式》完整覆盖GoF讲述的23个设计模式并加以细细研磨。初级内容从基本讲起,包括每个模式的定义、功能、思路、结构、基本实现、运行调用顺序、基本应用示例等,让读者能系统、完整、准确地掌握每个模式,...

    研磨设计模式-part4

    《研磨设计模式》完整覆盖GoF讲述的23个设计模式并加以细细研磨。初级内容从基本讲起,包括每个模式的定义、功能、思路、结构、基本实现、运行调用顺序、基本应用示例等,让读者能系统、完整、准确地掌握每个模式,...

    研磨设计模式-part3

    《研磨设计模式》完整覆盖GoF讲述的23个设计模式并加以细细研磨。初级内容从基本讲起,包括每个模式的定义、功能、思路、结构、基本实现、运行调用顺序、基本应用示例等,让读者能系统、完整、准确地掌握每个模式,...

    研磨设计模式视频课程PPT

    这个名为“研磨设计模式视频课程PPT”的压缩包包含了一份关于23种核心设计模式的详细教学资料,旨在帮助开发者提升软件设计的效率和可维护性。下面将对这些设计模式进行深入解析。 1. **单例模式(Singleton)**:...

    设计模式学习心得(研磨设计模式)

    这篇“设计模式学习心得(研磨设计模式)”博客及其相关的PDF文档,为我们提供了一个深入理解和应用设计模式的宝贵资源。以下将针对单例模式、工厂方法模式、策略模式、命令模式和桥接模式进行详细讲解。 1. **单例...

    X-gen PPT下载——《研磨设计模式》 实战

    《研磨设计模式》实战是IT领域中关于软件设计的一份重要资料,它主要探讨了设计模式在实际项目中的应用。设计模式是软件工程中经过长期实践总结出的通用问题解决方案,是解决常见设计问题的经验总结。这份PPT可能是...

    研磨设计模式.docx

    研磨设计模式系列包括单例模式、工厂方法模式、策略模式、命令模式和桥接模式等多种模式,每种模式都有其特点和应用场景。 单例模式 单例模式是一种创建型模式,用于限制一个类的实例化只能产生一个对象。单例模式...

Global site tag (gtag.js) - Google Analytics