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

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

简单说一下

首先说一下什么是模板方法模式:定义一个操作中的算法骨架,而将算法的一些步骤延迟到子类去实现,使得子类可以不改变该算法结构的情况下重新定义该算法的某些特定步骤(是一种行为性模式)。换句话说就是定义一个模板结构,让这个模板结构里边的部分内容去子类里边实现。

顺便举一下

举个栗子说明,比如你去银行办理业务,需要取号、排队、办理业务、评分,这其中取号排队和评分都是一样的,但是办理业务可以分好多种,如存款取款和转账等。这就和我们刚才说的可以将整个模板结构里边的内容去交给子类实现,模板结构算法不发生改变,如图在这里插入图片描述

简单夸一下

那这么厉害的模板方法有什么优点呢?
1.提取公共代码,便于维护将相同部分的代码放在抽象的父类中,将不同的代码放入不同的自类中,提高代码的复用性
2.行为由父类控制,子类实现通过一个父类调用其子类的操作,通过对子类的具体实现扩展不同的行为,实现了反向控制,符合“开闭原则”
3.封装不变部分,扩展可变部分把认为不变部分的算法代码封装到父类中实现,把可变部分算法由子类继承实现,便于子类继续扩展

它的缺点也捎带脚就在这里说一下吧!
1.每一个不同的实现都需要一个子类来实现,导致类的个数增加,使得系统更加庞大,设计也更加抽象
2.父类的抽象方法由子类实现,子类执行结果会影响到父类的结果,导致一种反向的控制结构,从而提高代码阅读量。

详细讲一下

正所谓工欲善其事必先利其器,要想知道这个模板方法咋么用,还是得先说一下他的内部结构!!!
先附一张网上当下来的图:
在这里插入图片描述

模板方法模式需要注意抽象类与具体子类之间的协作。它用到了虚函数的多态性技术以及“不用调用我,让我来调用你”的反向控制技术,该模板方法由以上几个部分构成:

1.抽象类:(Abstract Class):负责给出一个算法的轮廓和骨架。它由一个模板方法和若干个基本方法构成,定义如下:
① 模板方法:定义了算法的骨架,按某种顺序调用其包含的基本方法

② 基本方法:是整个算法中的一个步骤,包含以下几种类型

抽象方法:在抽象类中申明,由具体子类实现

具体方法:在抽象类中已经实现,在具体子类中可以继承或重写它

钩子方法:在抽象类中已经实现,包括用于判断的逻辑方法和需要子类重写的空方法两种

2.具体子类(Concrete Class):实现抽象类中所定义的抽象方法和钩子方法,它们是一个顶级逻辑的一个组成步骤

多多用一下

再用之前我们先说一下他的使用场景和注一些意事项:
使用场景
1、有多个子类共有的方法,且逻辑相同。
2、重要的、复杂的方法,可以考虑作为模板方法。
注意事项
1.为防止恶意操作,一般模板方法都加上 final 关键词。

接下来我们用代码来讲述一下具体实现:
代码实现
1.创建一个抽象类,它的模板方法被设为final

public abstract class Game {
    abstract void initialize();
    abstract void startPlay();
    abstract void endPlay();
    /*模板方法*/
    public final void play(){
        /*初始化游戏*/
        initialize();
        /*开始游戏*/
        startPlay();
        /*结束游戏*/
        endPlay();
    }
}

2.创建上述类的扩展类Circket.java、Football.java

   public class Circket extends Game{
    @Override
    void initialize() {
        System.out.println("Circket初始化完成,开始玩");
    }
    @Override
    void startPlay() {
        System.out.println("Circket已经开始玩了,玩耍中");
    }
    @Override
    void endPlay() {
        System.out.println("Circket结束了,回家了");
    }
} 
-------------------------------------------
public class FootBall extends Game {
    @Override
    void initialize() {
        System.out.println("football初始化完成,开始玩");
    }
    @Override
    void startPlay() {
        System.out.println("football已经开始了,正在玩");
    }
    @Override
    void endPlay() {
        System.out.println("football结束了,回家了");
    }
}

3.使用Game的模板方法play()来演示游戏的定义方式

public class TemplatePattern {
    public static void main(String[] args) {
        Game game = new Circket();
        game.play();
        Game game1 = new FootBall();
        game1.play();
    }
}

4.结果运行

Circket初始化完成,开始玩
Circket已经开始玩了,玩耍中
Circket结束了,回家了
football初始化完成,开始玩
football已经开始了,正在玩
football结束了,回家了
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值