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

本文介绍了一种使用模板抽象类的设计模式,通过一个虚构的亡灵系列机体实例,展示了如何利用不变的方法、变化的方法和钩子函数来实现不同子类的行为定制。通过继承,子类可以重写特定的方法来改变其行为,同时保留基类的通用功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

文章目录

背景

我方除了很多特机外,其实还需要一批专门送死的杂兵。这就要求杂兵机的造价不能太高。我们选择了亡灵工厂为我们生产这些杂兵机。

广告:亡灵工厂生产各种型号的亡灵机,这些亡灵机都在亡灵原型机的基础上改造,通过这样很好的降低了研发成本,同时亡灵机质量非常棒,能够抵抗10次重力炮的攻击。价格低廉,质量上乘,欢迎各战区大批采购,量大从优!

实现

亡灵原型机

/**
 * 亡灵原型机:亡灵系列是亡灵工厂大规模生产的机体,以其价格低廉,质量上乘成为我方御用的杂兵供应商。
 * 亡灵系列有很多种机型,每种型号的机体会对原型机进行强化。
 * 举个例子:MKII2、MKII3、MKIIR、MKIIS都是该系列的机体
 */
public abstract class Ghost {
    
    /**
     * 不变的武器
     */
    final void fireGun() {
        System.out.println("火神炮!");
    }
    
    /**
     * 不变的武器
     */
    final void wrestle() {
        System.out.println("格斗!");
    }
    
    /**
     * 不变的武器
     */
    final void stifleFist() {
        System.out.println("亡灵压杀拳!");
    }
    
    /**
     * 展示你的真正实力吧!
     */
    final void showYourPower() {
        if (needFireGun()) {
            fireGun();
        }
        if (needWrestle()) {
            wrestle();
        }
        if (needStifleFist()) {
            stifleFist();
        }
        uniqueSkill();
    }
    
    /**
     * 大招,有些后继机体都会有大招
     */
    abstract void uniqueSkill();
    
    /**
     * 钩子函数:是否需要火神炮?
     */
    boolean needFireGun() {
        return true;
    }
    
    /**
     * 钩子函数:是否需要格斗?
     */
    boolean needWrestle() {
        return true;
    }
    
    /**
     * 钩子函数:是否需要亡灵压杀拳?
     */
    boolean needStifleFist() {
        return true;
    }
    
}

亡灵MKII3

/**
 * 亡灵MKII3:古铁的前辈
 * 我都不需要原型机的垃圾武器..
 */
public class MKII3Ghost extends Ghost {

    @Override
    void uniqueSkill() {
        System.out.println("左轮打桩机!");
    }
    
    @Override
    boolean needFireGun() {
        return false;
    }

    @Override
    boolean needStifleFist() {
        return false;
    }
    
    @Override
    boolean needWrestle() {
        return false;
    }
    
}

亡灵MKIIS

/**
 * 亡灵MKIIS:格斗机体
 * 我只需要格斗类型的武器
 */
public class MKIISGhost extends Ghost {

    @Override
    void uniqueSkill() {
        System.out.println("亡灵穿山腿!");
    }
    
    @Override
    boolean needFireGun() {
        return false;
    }

}

亡灵MKIIR

/**
 * 亡灵MKIIR:射击机体
 * 我只需要射击类型的武器
 */
public class MKIIRGhost extends Ghost {

    @Override
    void uniqueSkill() {
        System.out.println("重力冲击炮!");
    }
    
    @Override
    boolean needStifleFist() {
        return false;
    }
    
    @Override
    boolean needWrestle() {
        return false;
    }

}

测试

public class Test {

    public static void main(String[] args) {
        System.out.println("MKII3:古铁的前辈");
        Ghost ghost = new MKII3Ghost();
        ghost.showYourPower();
        System.out.println("---------");
        
        System.out.println("MKIIS:纯格斗机体");
        ghost = new MKIISGhost();
        ghost.showYourPower();
        System.out.println("---------");
        
        System.out.println("MKIIR:纯射击机体");
        ghost = new MKIIRGhost();
        ghost.showYourPower();
        System.out.println("---------");
    }
    
}

测试结果

MKII3:古铁的前辈
左轮打桩机!
---------
MKIIS:纯格斗机体
格斗!
亡灵压杀拳!
亡灵穿山腿!
---------
MKIIR:纯射击机体
火神炮!
重力冲击炮!
---------
总结

模板抽象类提供不变的方法(如一个框架方法)和变化的方法(抽象方法,需子类重写),还提供了钩子函数(子类可决定是否重写),钩子函数常用来做判断。
读过Spring源码和AQS源码的小伙伴可以看出模板抽象方法的广泛使用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值