设计模式_行为型模式_模板模式(Java)

个人理解:一个模板抽象类(里面有多个方法和模板方法,在模板方法里调用其他方法),创建多个子类继承抽象类,在子类中重写抽象方法。在实现类里创建模板抽象类,调用子类中的方法>

缺点:子类里不能添加其他功能,只能实现抽象父类里的方法

官方一点的文档 -------------------》》》》》

模板模式

在模板模式(Template Pattern)中,⼀个抽象类公开定义了执⾏它的⽅法的⽅式/模板。它的⼦类可以按需要重写⽅法实现,但调⽤将以抽象类中定义的⽅式进⾏。这种类型的设计模式属于行为型模式

介绍

意图:定义⼀个操作中的算法的骨架,⽽将⼀些步骤延迟到⼦类中。模板⽅法使得⼦类可以不改变⼀个算法的结构,即可重定义该算法的某些特定步骤。

主要解决:⽅法通⽤,每⼀个⼦类都重新写了这个⽅法。

何时使⽤:有通⽤的⽅法。

如何解决:将这些通⽤方法抽象出来。

关键代码:在抽象父类设计模板。

应用实例:

1.Spring中对Hibernate的⽀持,将⼀些已经定好的⽅法封装起来,⽐如开启事务、获取Session、关闭Session 等,程序员不重复写那些已经规范好的代码,直接丢⼀个实体就可以保存。

优点:

1.封装不变部分,扩展可变部分。

2.提取公共代码,便于维护。

3.行为由⽗类控制,⼦类实现。

缺点:每⼀个不同的实现都需要⼀个⼦类,导致类的个数增加,使得系统更加庞⼤。

使用场景: 多个⼦类有共有的⽅法,且逻辑相同。

注意事项:为防⽌恶意操作(重写模板方法),⼀般模板⽅法加上final关键词。

实现

我们将创建⼀个定义操作的Game抽象类,其中,模板⽅法设置为final,这样它就不会被重写。Csgo和LOL是扩展了Game的实体类,它们重写了抽象类的⽅法。 TemplatePatternDemo,我们的演示类使⽤Game来演示模板模式的⽤法。

具体实现步骤

1.创建⼀个Java项⽬。

2.创建⼀个抽象类Game,它的模板⽅法被设置为final。

package src.com.设计模式.模板模式;
​
public abstract class Game {
    //初始化游戏
    public abstract void initialize();
    //开始游戏
    public abstract void startPlay();
    //结束游戏
    public abstract void endPlay();
    //模板(初始化,开始游戏,结束游戏)   final保证play方法不被子类重写
    public final void play(){
        initialize();
        startPlay();
        endPlay();
    }
}

3.创建扩展了上述类的实体类Csgo。

package src.com.设计模式.模板模式;
​
public class Csgo extends Game{
    @Override
    public void initialize() {
        System.out.println("Csgo初始化成功");
    }
​
    @Override
    public void startPlay() {
        System.out.println("Csgo正在执行");
    }
​
    @Override
    public void endPlay() {
        System.out.println("Csgo运行结束");
    }
}

4.创建扩展了上述类的实体类LOL。

package src.com.设计模式.模板模式;
​
public class LOL extends Game{
    @Override
    public void initialize() {
        System.out.println("英雄联盟初始化成功");
    }
​
    @Override
    public void startPlay() {
        System.out.println("英雄联盟正在执行");
    }
​
    @Override
    public void endPlay() {
        System.out.println("英雄联盟运行结束");
    }
}

5.使⽤Game的模板⽅法play()来演示游戏的定义⽅式。

package src.com.设计模式.模板模式;
​
public class TemplatePatternDemo {
    public static void main(String[] args) {
        Game game = new Csgo();
        game.play();
        System.out.println("--------------");
        game = new LOL();
        game.play();
    }
}

6.执⾏程序,输出结果。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值