设计模式 | 模板方法模式(template method)

定义:

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

结构:(书中图,侵删)

一个定义整体框架的父类
若干不同具体实现的子类

实例:

我瞬间就想到了很多RPG游戏。
不同职业在新手村完成任务,最多就是打的怪名字不一样、不同职业奖励的装备不一样子类的。
基本上都是一个套路。
 
接下来用代码实现:
为了代码简洁,我就设置一个任务,以及两个职业:战士、法师。
 
新手村任务框架类:
package designpattern.templatemethod;

public abstract class NoviceVillage {
    public void Task1() {
        System.out.println("你好,勇士。请帮我杀掉10个" + Task1Aim());
    }
    public void underWay() {
        System.out.println("任务进行中...");
    }
    public void Task1Reward() {
        System.out.println("太好了,勇士!非常感谢,这是您的报酬:金币*50、经验*500、" + Task1RewardWeapon());
    }

    abstract String Task1Aim();

    abstract String Task1RewardWeapon();
}
战士的任务类:
package designpattern.templatemethod;

public class NoviceVillageWarrior extends NoviceVillage{

    @Override
    String Task1Aim() {
        return "老虎怪";
    }

    @Override
    String Task1RewardWeapon() {
        return "新手巨剑*1";
    }

}
法师的任务类:
package designpattern.templatemethod;

public class NoviceVillageWizard extends NoviceVillage{

    @Override
    String Task1Aim() {
        return "猴子精";
    }

    @Override
    String Task1RewardWeapon() {
        return "新手法杖*1";
    }

}
客户端:
package designpattern.templatemethod;

public class Client {
    public static void main(String[] args) {
        // 战士
        NoviceVillage noviceVillageWarrior = new NoviceVillageWarrior();
        noviceVillageWarrior.Task1();
        noviceVillageWarrior.underWay();
        noviceVillageWarrior.Task1Reward();

        System.out.println("==================================");

        // 法师
        NoviceVillage noviceVillageWizard = new NoviceVillageWizard();
        noviceVillageWizard.Task1();
        noviceVillageWizard.underWay();
        noviceVillageWizard.Task1Reward();
    }
}

输出结果:

你好,勇士。请帮我杀掉10个老虎怪
任务进行中...
太好了,勇士!非常感谢,这是您的报酬:金币*50、经验*500、新手巨剑*1
==================================
你好,勇士。请帮我杀掉10个猴子精
任务进行中...
太好了,勇士!非常感谢,这是您的报酬:金币*50、经验*500、新手法杖*1

总结:

感觉这个设计模式在平时多多少少都见到或者用到过,只是不知道这也是一个设计模式。
这个设计模式的精髓就是整体的框架是不变的,但是里面某些细节会有不同,这时候就需要用到模板方法设计模式。
可以大大提高代码的复用性,以及减少代码的大面积重复。

转载于:https://www.cnblogs.com/imoqian/p/10696951.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值