`

模板模式和策略模式的区别

阅读更多

转载:http://bhsc.happy.blog.163.com/blog/static/104389552200811178630564/

 

 

要感谢这篇文章带来的灵感:对Strategy与Template Method模式的区别的一些讨论,有些地方说,strategy 使用接口.template  使用抽象类,抽象类中包含了一些具体的步骤........................晕,傻子才看不出来一个是接口,一个是抽象类,可是这真的是本质区别嘛?或者说这个区别够深入吗?

    我研究了好久,发现这两个模式很可能就体现在这个一组算法,还是一个算法上,但是始终理不太清楚,现在终于明白。记录一些关键的东西吧:

 

根据《深入浅出设计模式(C#/Java版)》所述,


Strategy模式的应用场景是:
1. 多个类的分别只是在于行为不同
2. 你需要对行为的算法做很多变动
3. 客户不知道算法要使用的数据

 

Template Method模式的应用场景是:
1. 你想将相同的算法放在一个类中,将算法变化的部分放在子类中实现
2. 子类公共的算法应该放在一个公共的类中,避免代码重复

 

仔细体会作者所提出的这几个应用场景,你会发现它们其实没什么区别,用Strategy或Template Method模式都能完成要求.换句话说,作者没抓住这两个模式区别的"痛处"来给予详细讲解.下面我们再换个出发点来看看这两种设计模式.

 

我们知道,设计模式中有这么一个原则: Prefer composition to inheritance.这句话的背景是OO初期大家都把继承看作是万能的,并过度使用继承来实现多态->可扩展.理解原则的时候不能脱离它的背景,不然就成盲从了.Template Method模式应该是伴随着OO的出现而萌生的.它是OO中最直观的思考方式的结果.基类留下可变化的空间给子类,由继承类来决定具体行为.听起来是不错,不过...一旦基类的接口发生了变化,每个继承类都得跟着修改才能够继续使用.这就是所谓高耦合与难维护的说法的来源.

 

Strategy与Template Method模式算是composition与inheritance的典型应用了,如果它们真的在功能上能完全互换,那何必要后者呢,全部都用前者不是很好么? 再怎么说,一个倾向于加深类层次结构的设计通常会使设计变得复杂,令后期维护变得困难.

When deciding between inheritance and composition, ask if you need to upcast to the base type. If not, prefer composition (member objects) to inheritance. This can eliminate the perceived need for multiple base types.

Which should I prefer: composition or private inheritance? Use composition when you can, private inheritance when you have to.

有一个说法总结得不错: 到底该倾向于composition还是inheritance,决定于"变化的是什么".如果基类的接口变化得很频繁,那么使用inheritance绝对是个噩梦;如果只是给基类新增方法,那么坚持使用composition的话就得新增很多个delegate.

这么说来,Strategy与Template Method模式之间的区别,也是在"变化的是什么"这个问题上了.

 

注意到,Strategy模式中,为了让Context类能够调用,Strategy接口里声明的方法一般是公有的.Template Method模式则不然,基类中留下的虚方法并不一定要是公有的,只要保证对继承类可见就行.也就是说,Template Method模式允许编写库的人采取更紧的访问限制,而Strategy模式则很难做到相同等级的限制.假如使用者获得了一个Strategy接口的实现类的实例,他并不一定要将这个实例放入"原本应有"的那个Context,而可以随意使用其中的接口方法.Template Method模式可以利用protected的访问权限,牺牲一点面向对象的封装性,给自己的继承类一定的访问特权,来把一些访问限制在"体系内",从而限制了外部对内的访问.这仍然只是表象,不过我们已经接近问题的本质了.

 

这带来的区别是什么呢? Strategy模式允许外界使用其接口方法,因而可以将这个接口方法认为是"一整个算法";而Template Method模式可以限制所留下的虚方法只对其继承类可见,外部使用者不一定能够直接使用这些虚方法,因而可以将这些虚方法认为是"一个算法的一部分".GoF的设计模式那本书里有这么一句话:"Template methods use inheritance to vary part of an algorithm. Strategies use delegation to vary the entire algorithm.",说的正是这个问题.回到具体问题上,如果我们要封装的算法适合于提供给用户任意使用,是"一整个算法",那么用Strategy模式较好;如果要封装的变化是一个算法中的部分(换言之,大算法的步骤是固定的),而且我们不希望用户直接使用这些方法,那么应该使用Template Method模式.就此,问题的"痛处"算是抓住了.

 

回到书中的例子.为什么使用Template Method模式比较好呢? 我觉得是因为那个format()方法并不应该被用户直接单独调用,因而用protected限制住了对它的访问.这就不适合Strategy模式了(用Strategy意味着默认用户单独去使用算法).

但是话说回来,作者提到了Singleton.要是用了Template Method,这Singleton基本上就泡汤了.但是又没有源代码看看作者到底实现出来的是什么样的,无法猜透他的想法啊.

 

为了这么一个问题,我硬是跟axx大争了一个晚上...我总是觉得Strategy跟Template Method模式在使用中没什么区别,而根据Prefer composition to inheritance原则,Strategy模式相对更合适于较多的场景.axx大则不停重复两种模式带来的访问限制不一样,但一直没能表述得让我明白.幸好axx大脾气好,不然这么争一次还真伤元气 XD

分享到:
评论

相关推荐

    策略模式结合模板方法模式

    * 使用策略模式结合模板方法模式可以使得策略模式更加灵活和可扩展,并且可以更好地解决一些共性问题。 策略模式结合模板方法模式是一种非常有用的设计思路,它可以使得策略模式更加灵活和可扩展,并且可以更好地...

    7.java模板模式与8.策略模式示例

    Java模板模式和策略模式是两种常用的面向对象设计模式,它们在软件开发中有着广泛的应用。模板模式是一种行为设计模式,而策略模式则属于结构型设计模式。这两种模式都是用来处理算法和行为的,但它们的核心理念和...

    java设计模式之策略模式与模板模式

    本篇文章将深入探讨两种重要的设计模式:策略模式和模板模式。通过理解这两种模式,开发者可以更好地组织代码,提高代码的灵活性和可扩展性。 ### 策略模式 策略模式是一种行为设计模式,它使你能在运行时改变对象...

    模板方法模式与策略模式代码示范

    在软件设计模式中,模板方法模式(Template Method Pattern)和策略模式(Strategy Pattern)是两种常用的结构型设计模式,它们都是面向对象设计中行为模式的一种体现。这两种模式可以帮助我们更好地组织代码,提高...

    策略模式 template模式

    策略模式(Template模式) 策略模式是设计模式中的一种 객체行为型模式,它定义了一系列算法,封装每一个算法,并使它们可以互相替换。策略模式使得算法可以独立于使用它的客户而变化。 概述 在软件开发中,经常...

    远程抄表与监控仿真系统(Version 1.5,采用策略模式、工厂模式、模板方法模式实现)

    处理层的设计采用了设计模式中的策略模式、模板方法模式和工厂模式。 Server端和Client端的实现也采用了分层的设计方式,包含自定义的模型层、视图层和控制层。 说明:程序采用配置文件的方式进行初始化,运行时时请...

    设计模式之策略模式与模板模式.rar

    本主题将深入探讨两种重要的设计模式——策略模式和模板模式。 策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。在策略模式中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为...

    JAVA中模板模式、策略模式解析[归类].pdf

    策略模式与模板模式的主要区别在于,模板模式关注的是算法的结构和顺序,而策略模式关注的是算法的可替换性。在模板模式中,算法的框架是固定的,变化的部分由子类实现;而在策略模式中,算法的选择可以在运行时动态...

    详解SpringBoot结合策略模式实战套路

    策略模式是一种常用的设计模式,它可以使我们的代码更加灵活、可维护和可扩展。在SpringBoot项目中,策略模式可以与依赖注入机制相结合,实现更加灵活的业务逻辑处理。在本文中,我们将详细介绍如何使用策略模式在...

    策略模式与模板模式的区别 - Eviltuzki的个人页面 - OSCHINA - 中文开源技术交流社区.mht

    策略模式与模板模式的区别 - Eviltuzki的个人页面 - OSCHINA - 中文开源技术交流社区.mht

    JAVA中模板模式、策略模式解析[文].pdf

    在Java编程中,模板模式和策略模式是两种重要的设计模式,它们主要用于提高代码的灵活性、重用性和可扩展性。 1. **模板模式**: 模板模式是一种行为设计模式,它定义了一个操作中的算法骨架,而将一些步骤延迟到...

    python 项目里常用的设计模式 组合模式 策略模式 抽象工厂 代理模式 工厂模式 观察者模式 简单工厂 建造者模式 模板模式

    python 项目里常用的设计模式 单例模式 组合模式 策略模式 抽象工厂 代理模式 工厂模式 观察者模式简单工厂 建造者模式 模板模式 桥接多维度 桥接模式 适配器模式 外观模式 享元模式 责任链组合模式

    设计模式之策略模式与模板模式.pptx

    总结来说,策略模式关注的是算法的可选择性和替换性,而模板模式关注的是算法的骨架和步骤的定制。两者都是用来处理算法和流程控制的设计模式,但在实际应用中,策略模式更倾向于解决多算法选择的问题,而模板模式则...

    抽象工厂模式+工厂方法模式+策略模式实现手机加工厂

    本案例主要探讨了三种经典的设计模式:抽象工厂模式、工厂方法模式和策略模式,并以手机加工厂为实际应用场景进行阐述。 首先,**抽象工厂模式**是创建型设计模式之一,它提供一个接口,用于创建相关或依赖对象的...

    设计模式之模板方法模式

    模板方法模式的核心组成部分包括抽象类(Abstract Class)和具体类(Concrete Classes)。抽象类中定义了一个模板方法,这个方法通常为final类型,防止被子类覆盖,确保算法的完整性。此外,它还包含了一些钩子方法...

    mvc设计模式和模板模式ppt

    综上所述,MVC模式和模板模式都是在软件开发中广泛应用的设计模式,它们各自解决了特定的设计问题。MVC模式通过分离关注点提高了应用程序的灵活性和可维护性,而模板模式则通过封装变化点来增强代码的复用性。在实际...

    设计模式实战代码-单例、简单工厂、策略、观察者、责任链、模板模式

    在给定的压缩包文件中,我们关注的是六种不同的设计模式:单例模式、简单工厂模式、策略模式、观察者模式、责任链模式以及模板模式。下面将对这六种模式进行详细阐述。 1. 单例模式: 单例模式确保一个类只有一个...

    C#,设计模式,策略模式,鸭子,

    同时,由于行为被封装在单独的类中,鸭子类和其他使用策略模式的类可以保持简洁,遵循了单一职责原则。 在实际开发中,策略模式常用于处理复杂的业务逻辑,例如在电商系统中选择不同的配送策略,或者在游戏中调整...

    3 模板模式-课程内容.rar

    7. **模板模式与其他设计模式的对比**:对比模板模式与策略模式、工厂模式等其他设计模式的异同,帮助学习者理解各种模式间的联系和区别。 8. **实战演练**:可能包含一些练习题或案例分析,让学习者亲手实践模板...

Global site tag (gtag.js) - Google Analytics