java模式之-模板方法模式

模板方法模式是java设计模式常见的模式之一。

《JAVA与模式》中写道:

模板方法模式是类的行为模式。准备一个抽象类,将部分逻辑以具体方法以及具体构造函数的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑。不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现。这就是模板方法模式的用意。

下面是自己写的小demo,便于理解模板方法模式。

1.父类

package com.westward;

public abstract class GoToCity {
    /**
     * 模板方法,必须定义为public final的。子类能够使用,但不能复写
     * 子类都有相同的步骤,但是有些步骤有不同的实现。
     * */
    public final void go(){
        closeDoor();
        if (isLock()) {
            getLock();
        }
        leaveHome();
        onTheWay();
        arrive();
    }

    /**
     * 不同子类不同的行为,将行为延迟到子类实现
     * */
    protected abstract void arrive();

    /**
     * 不同子类不同的行为,将行为延迟到子类实现
     * */
    protected abstract void onTheWay();

    /**
     * 共有的行为,在基类实现,并对子类隐藏
     * */
    private void leaveHome() {
        System.out.println("离开家");
    }

    /**
     * 共有的行为,在基类实现,并对子类隐藏
     * */
    private void closeDoor() {
        System.out.println("关闭家门");
    } 

    /**
     * 共有的行为,在基类实现,并对子类隐藏
     * 有些子类执行,有些不执行。所以用到了钩子方法
     * */
    private void getLock(){
        System.out.println("上锁");
    }

    /**
     * 钩子方法,用来决定一些方法是否执行
     * 子类可以复写此方法,来决定是否执行某方法
     * */
    protected  boolean isLock(){
        return true;
    }
}

2 子类

package com.westward;

public class GoToBeijing extends GoToCity {

    @Override
    protected void arrive() {
        System.out.println("到达目的地:北京");
    }

    @Override
    protected void onTheWay() {
        System.out.println("坐火车");
    }

}
package com.westward;

public class GoToShanghai extends GoToCity {

    @Override
    protected void arrive() {
        System.out.println("到达目的地:上海");
    }

    @Override
    protected void onTheWay() {
        System.out.println("坐飞机");
    }

    @Override
    protected boolean isLock() {

        return false;
    }

}

测试类:我是采用的Junit4单元测试

package com.westward;

import static org.junit.Assert.*;

import org.junit.Test;

public class TemplateMethodTest {

    @Test
    public void test() {
        GoToCity go1= new GoToBeijing();
        GoToCity go2= new GoToShanghai();
        go1.go();
        System.out.println("\n");
        go2.go();
    }

}

output:

关闭家门
上锁
离开家
坐火车
到达目的地:北京

关闭家门
离开家
坐飞机
到达目的地:上海

时间: 2024-08-01 00:33:14

java模式之-模板方法模式的相关文章

菜鸟译文(二)——使用Java泛型构造模板方法模式

如果你发现你有很多重复的代码,你可能会考虑用模板方法消除容易出错的重复代码.这里有一个例子:下面的两个类,完成了几乎相同的功能: 实例化并初始化一个Reader来读取CSV文件: 读取每一行并解析: 把每一行的字符填充到Product或Customer对象: 将每一个对象添加到Set里: 返回Set. 正如你看到的,只有有注释的地方是不一样的.其他所有步骤都是相同的. ProductCsvReader.java public class ProductCsvReader {       Set<

Android设计模式之命令模式、策略模式、模板方法模式

命令模式是其它很多行为型模式的基础模式.策略模式是命令模式的一个特例,而策略模式又和模板方法模式都是算法替换的实现,只不过替换的方式不同.下面来谈谈这三个模式. 命令模式 将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化:对请求排队或记录请求日志,以及支持可撤消的操作. java中传递(注入)对象很容易,但是却不支持直接传递行为(即传递函数或者说传递方法),只能间接的通过传递(注入)一个对象,再调用它的行为来实现.如果把这样的行为抽取出来为一个类,称作命令类,它的具体实现都是命令

建造者模式和模板方法模式扩展篇

建造者模式和模板方法模式扩展篇 UML 与抽象工厂模式比较 本模式可以看出与抽象工厂非常类似,都是产生不同的产品,怎么区分这两种设计的使用场景呢 - 建造者模式关注的是基本方法的调用顺序,而零件(基本方法)已经准备好 - 抽象工厂关注的零件的生产(基本方法的实现),而组装顺序已经确定 实现 产品抽象 public abstract class Product { public abstract void doSomeThing(); } 产品A public class AProduct ext

Java设计模式之模板方法模式或者说模板设计模式(属于行为型)

抽象类,不变的代码写了,要变化的部分留给子类去实现: package 行为型_模板方法模式; //模板设计模式的意思是把不变定位部分写出来,变化的部分留给子类去实现 public abstract class GetTime { public long getTime() throws Exception{ long start = System.currentTimeMillis();//开始时间 /* //for循环 for(int i=0;i<10000;i++){ System.out.

Java抽象类应用—模板方法模式

模板方法模式(Templete method) 定义一个操作中的算法的骨架,而将一些可变部分的实现延迟到子类中,模板方法模式使得子类可以不改变一个算法的结构即可重新定义该算法的某些特定的步骤. 例: 1 package practice1; 2 3 import java.util.Random; 4 5 public class Test8 { 6 public static void main(String []args){ 7 Games g=new Girl(); 8 g.play();

java设计模式7.策略模式、模板方法模式、观察者模式

策略模式 策略模式的用意,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换.策略模式使得算法可以在不影响到客户端的情况下发生变化. 环境角色:持有一个抽象策略角色的引用. 抽象策略角色:给出所有的具体策略类所要实现的接口. 具体策略角色:包装相关的算法或行为. 模板方法模式 模板方法的用意,使用一个抽象类,将部分逻辑以具体方法以及具体构造子的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑.不同的子类可以用不同的方式来实现这些抽象方法. 抽象模板角色:1. 定义一个或多

java设计模式(模板方法模式)

模板方法模式 定义一个操作中的算法的骨架,而将一些步骤延迟到子类中. 模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤.通俗的说的就是有很多相同的步骤的,在某一些地方可能有一些差别适合于这种模式,例如想要泡一杯茶或者一杯咖啡,第一步都是将水煮沸,第二部是加入咖啡或者茶,第三部就是将饮料倒入杯子中,第四部就是加入各种调味料.其中第一步和第三部都是一样的,这个就可以定义在基类,而第二步和第四步就是他们之间的差异就可以在具体的子类中去实现.下面就是代码实现. 定义抽象基类,为所有

java设计模式之模板方法模式

注意 本博客摘录于秦小波老师写的<设计模式之禅> 模板方法模式 汽车厂造悍马 假设我们是一个汽车公司,现在有客户来了,要求我们造悍马! 既然上级下来命令那就造呗,但是造悍马你得告诉我们汽车有什么功能啊,客户说了:"能启动车,能停止车,能响,能跑."好,功能出来了,开始造汽车了.类图如下: 抽象悍马模型代码如下: public abstract class HummerModel { /* * 首先,这个模型要能够被发动起来,别管是手摇发动,还是电力发动,反正 * 是要能够发

Java设计模式之模板方法模式(Template Method)

本文继续介绍23种设计模式系列之模板方法模式. 概述 模板方法模式是类的行为模式.准备一个抽象类,将部分逻辑以具体方法以及具体构造函数的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑.不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现.这就是模板方法模式的用意. 比如定义一个操作中的算法的骨架,将步骤延迟到子类中.模板方法使得子类能够不去改变一个算法的结构即可重定义算法的某些特定步骤. 模式中的角色 抽象类(AbstractClass):实现了模板方法,定义了算法的