设计模式之模版方法模式
一.模版方法模式
模版方法模式是最为常见的几种设计模式之一,而且你在工作中很可能已经使用过模板方法模式而你却没有意识到自己已经使用过这种模式,模版方法模式需要抽象类和具体子类协调完成,抽象类负责给出一个算法的轮廓和骨架,具体子类负责给出这个算法的各个逻辑步骤既具体子类负责填充这个轮廓和骨架,不同的子类有不同的填充方法;而将这些基本方法总汇起来的方法叫做模版方法,这个模板方法是在抽象类中以具体方法定义的
二.模板方法模式所涉及到得角色:
抽象模版角色:定义了一个或多个抽象操作以便让子类实现,这些抽象操作叫做基本操作,他们是一个顶级逻辑的组成步骤,定义并实现一个模版方法,这个模版方法就是一个具体方法,他给出了一个顶级逻辑的骨架,而逻辑的实现在相应的抽象操作中,推迟到子类中去实现。
具体模版角色:实现父类中定义的一个或多个抽象方法,他们是一个顶级逻辑的组成部分,不同的具体模版都可以给出这些抽象方法的实现,从而使得顶级逻辑的实现各不相同
三.举例:
看过《如何说服女生上床》这部经典文章吗?没看过去百度一下吧,从认识女生到上床的不变步骤是:巧遇,展开追求,牵手,接吻,……后面用不着不说了,一共八大步骤(Template method)这八大步骤是定义好的,你只要按照这八大步骤去实现就行了,但针对每个步骤不同的人不同的情况都有不一样的方法,这就要看你随机应变了,随机应变就是具体实现。
代码:
- /**
- * 抽象模版角色,定义了一个骨架,模版方法,
- * 将要想追到女生,必须遵循的4个步骤抽象成一个顶级逻辑
- * @author Administrator
- *
- */
- public abstract class 如何说服女生上床 {
- public void 模版方法() {
- 巧遇();
- 追求();
- 牵手();
- 接吻();
- }
- public abstract void 巧遇();
- public abstract void 追求();
- public abstract void 牵手();
- public abstract void 接吻();
- }
- /**
- * 读过这本书的读者一展开了自己的行动
- * @author Administrator
- *
- */
- public class 读者一 extends 如何说服女生上床 {
- @Override
- public void 巧遇() {
- System.out.println("读者一自己的巧遇方法。。。");
- }
- @Override
- public void 追求() {
- System.out.println("读者一自己的追求方法。。。");
- }
- @Override
- public void 牵手() {
- System.out.println("读者一自己的牵手方法。。。");
- }
- @Override
- public void 接吻() {
- System.out.println("读者一自己的接吻方法。。。");
- }
- }
- /**
- * 读过这本书的读者二展开了自己的行动
- * @author Administrator
- *
- */
- public class 读者二 extends 如何说服女生上床 {
- @Override
- public void 巧遇() {
- System.out.println("读者二自己的巧遇方法。。。");
- }
- @Override
- public void 追求() {
- System.out.println("读者二自己的追求方法。。。");
- }
- @Override
- public void 牵手() {
- System.out.println("读者二自己的牵手方法。。。");
- }
- @Override
- public void 接吻() {
- System.out.println("读者二自己的接吻方法。。。");
- }
- }
客户端调用:
- public static void main(String[] args) {
- 如何说服女生上床 第一个读该书的人 = new 读者一();
- 第一个读该书的人.模版方法();
- 如何说服女生上床 第二个读该书的人 = new 读者二();
- 第二个读该书的人.模版方法();
- }
四.总结:
准备一个抽象类,将部分逻辑以具体方法的形式实现,然后申明一些抽象方法来迫使子类实现剩余的逻辑。不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现。
继续努力,加油!
如果你喜欢本文, 请长按二维码,关注公众号 分布式编程.
作者:分布式编程
出处:https://zthinker.com/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。