设计模式之禅之设计模式-模板方法模式

一:模板方法模式的定义
        --->定义一个操作中的算法的框架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。

       --->模板方法模式确实非常简单,仅仅使用了Java的继承机制,但它是一个应用非常广泛的模式。其中,AbstractClass叫做抽象模板,它的方法分为两类:
        ● 基本方法
                基本方法也叫做基本操作,是由子类实现的方法,并且在模板方法被调用。
        ● 模板方法
                可以有一个或几个,一般是一个具体方法,也就是一个框架,实现对基本方法的调度,完成固定的逻辑。

二:模板方法模式的优点
        ● 封装不变部分,扩展可变部分
        ● 提取公共部分代码,便于维护
        ● 行为由父类控制,子类实现

三:模板方法模式的缺点
        按照我们的设计习惯,抽象类负责声明最抽象、最一般的事物属性和方法,实现类完成具体的事物属性和方法。但是模板方法模式却颠倒了,抽象类定义了部分抽象方法,由子类实现,子类执行的结果影响了父类的结果,也就是子类对父类产生了影响,这在复杂的项目中,会带来代码阅读的难度,而且也会让新手产生不适感。

四:模板方法模式的应用场景
        ● 多个子类有公有的方法,并且逻辑基本相同时。
        ● 重要、复杂的算法,可以把核心算法设计为模板方法,周边的相关细节功能则由各个子类实现。
        ● 重构时,模板方法模式是一个经常使用的模式,把相同的代码抽取到父类中,然后通过钩子函数(见“模板方法模式的扩展”)约束其行为。

五:模板方法模式的例子
        模板方法抽象类(算法框架)

 1 package com.yeepay.sxf.template5;
 2 /**
 3  * 模板类
 4  * (1)封装算法的总实现方法
 5  * (2)核心步骤定义抽象方法,让子类具体实现
 6  *
 7  * @author sxf
 8  *
 9  */
10 public abstract class AbstractTemplate {
11     /**
12      * 核心步骤一
13      */
14     protected abstract void step01();
15     /**
16      * 核心步骤二
17      */
18     protected abstract void step02();
19     /**
20      * 核心步骤三
21      */
22     protected abstract void step03();
23
24     /**
25      * 算法实现类
26      */
27     public void run(){
28         this.step01();
29         this.step02();
30         this.step03();
31     }
32 }

View Code

模板方法实现类(算法实现一)

 1 package com.yeepay.sxf.template5;
 2 /**
 3  * Jack的算法
 4  * @author sxf
 5  *
 6  */
 7 public class JackAlgorithm extends AbstractTemplate{
 8
 9     @Override
10     protected void step01() {
11         System.out.println("JackAlgorithm.step01(==》jack算法第一步)");
12     }
13
14     @Override
15     protected void step02() {
16         System.out.println("JackAlgorithm.step02(==》jack算法第二步)");
17     }
18
19     @Override
20     protected void step03() {
21         System.out.println("JackAlgorithm.step03(==》jack算法第三步)");
22     }
23
24
25 }

View Code

模板方法实现类(算法实现二)

 1 package com.yeepay.sxf.template5;
 2 /**
 3  * Tom的算法
 4  * @author sxf
 5  *
 6  */
 7 public class TomAlgorithm extends AbstractTemplate {
 8
 9     @Override
10     protected void step01() {
11         System.out.println("TomAlgorithm.step01(==》Tom算法第一步)");
12     }
13
14     @Override
15     protected void step02() {
16         System.out.println("TomAlgorithm.step02(==》Tom算法第二步)");
17     }
18
19     @Override
20     protected void step03() {
21         System.out.println("TomAlgorithm.step03(==》Tom算法第三步)");
22     }
23
24
25 }

View Code

客户端实现

 1 package com.yeepay.sxf.template5;
 2 /**
 3  * 测试类
 4  * @author sxf
 5  *
 6  */
 7 public class Client {
 8     public static void main(String[] args) {
 9         //实现Jack的算法
10         AbstractTemplate jack=new JackAlgorithm();
11         jack.run();
12
13         //实现Tom的算法
14         AbstractTemplate tom=new TomAlgorithm();
15         tom.run();
16     }
17 }

View Code

 

时间: 2024-09-20 04:19:47

设计模式之禅之设计模式-模板方法模式的相关文章

C++设计模式编程中Template Method模板方法模式的运用_C 语言

准备一个抽象类,将部分逻辑以具体方法以及具体构造子的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑.不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现.这就是模版方法模式的用意. 很多人可能没有想到,模版方法模式实际上是所有模式中最为常见的几个模式之一,而且很多人可能使用过模版方法模式而没有意识到自己已经使用了这个模式.模版方法模式是基于继承的代码复用的基本技术,模版方法模式的结构和用法也是面向对象设计的核心. 模版方法模式需要开发抽象类和具体子类的设计师之间的协作

Java设计模式(十四)----模板方法模式

模板方法模式 一.概述 二.结构 三.具体案例 四.优缺点和设计思想 一.概述 模板方法模式是类的行为模式.准备一个抽象类,将部分逻辑以具体方法以及具体构造函数的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑.不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现.这就是模板方法模式的用意 二.结构 模板方法模式是所有模式中最为常见的几个模式之一,是基于继承的代码复用的基本技术. 模板方法模式需要开发抽象类和具体子类的设计师之间的协作.一个设计师负责给出一个算法的轮廓和

设计模式之禅之设计模式-建造者模式

一:建造者模式的定义        --->建造者模式(Builder Pattern)也叫做生成器模式,其定义如下:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示        ● Product产品类                通常是实现了模板方法模式,也就是有模板方法和基本方法,这个参考模板方法模式.例子中的BenzModel和BMWModel就属于产品类.        ● Builder抽象建造者                规范产品的组建,一般是由子类

设计模式之禅之设计模式-责任链模式

一:责任链模式的定义        --->使多个对象都有机会处理请求,从而避免了请求的发送者和接受者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止.        --->责任链模式的重点是在"链"上,由一条链去处理相似的请求在链中决定谁来处理这个请求,并返回相应的结果        --->一般会有一个封装类对责任模式进行封装,也就是替代Client类,直接返回链中的第一个处理者,具体链的设置不需要高层次模块关系,这样,更简化了

设计模式之禅之设计模式-命令模式

一:命令模式的定义        --->命令模式是一个高内聚的模式        --->将一个请求封装成一个对象,从而让你使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能.        --->命令模式的角色                ● Receive接收者角色==>该角色就是干活的角色,命令传递到这里是应该被执行的                ● Command命令角色==>需要执行的所有命令都在这里声明         

设计模式之禅之设计模式-桥梁模式

一:桥梁模式定义        --->桥梁模式(Bridge Pattern)也叫做桥接模式,是一个比较简单的模式        --->将抽象和实现解耦,使得两者可以独立地变化. 二:桥梁模式角色 ● Abstraction--抽象化角色        它的主要职责是定义出该角色的行为,同时保存一个对实现化角色的引用,该角色一般是抽象类.● Implementor--实现化角色        它是接口或者抽象类,定义角色必需的行为和属性.● RefinedAbstraction--修正抽象

设计模式之禅之设计模式-装饰者模式

一:装饰模式的定义        --->动态地给一个对象添加一些额外的职责.就增加功能来说,装饰模式相比生成子类更为灵活.        --->如果大家还记得代理模式,那么很容易看懂这个类图,装饰类的作用也就是一个特殊的代理类.        --->在装饰模式中,必然有一个最基本.最核心.最原始的接口或抽象类充当Component抽象构件 二:装饰模式的角色        ● Component抽象构件                Component是一个接口或者是抽象类,就是定

设计模式之禅之设计模式-策略模式

一:策略模式的定义        --->是一种比较简单的模式,也叫做政策模式        --->定义一组算法,将每个算法都封装起来,并且使它们之间可以互换 二:策略模式的三个角色 ● Context封装角色        --->它也叫做上下文角色,起承上启下封装作用,屏蔽高层模块对策略.算法的直接访问,封装可能存在的变化.● Strategy抽象策略角色        --->策略.算法家族的抽象,通常为接口,定义每个策略或算法必须具有的方法和属性● ConcreteStr

设计模式之禅之设计模式-迭代器模式

一:迭代器模式的定义        --->迭代器模式(Iterator Pattern)目前已经是一个没落的模式,基本上没人会单独写一个迭代器,除非是产品性质的开发        --->它提供一种方法访问一个容器对象中各个元素,而又不需暴露该对象的内部细节.        --->迭代器是为容器服务的,那什么是容器呢? 能容纳对象的所有类型都可以称之为容器,例如Collection集合类型.Set类型等,迭代器模式就是为解决遍历这些容器中的元素而诞生的        --->迭