【设计模式】模板方法

1.模板方法(Template Method)的定义

模板方法模式是一种行为设计模式,它在超类中定义一个算法的框架,允许子类在不修改结构的情况下重写算法的特定步骤。

模板是对多种事物的结构、形式、行为的模式化总结,而模板方法模式(Template Method)则是对一系列类行为(方法)的模式化。我们将总结出来的行为规律固化在基类中,对具体的行为实现则进行抽象化并交给子类去完成,如此便实现了子类对基类模板的套用。

2.模板方法的结构(转自:https://www.cnblogs.com/netxiaohui/p/15183079.html)

  • 1、抽象类

声明作为算法步骤的方法,以及依次调用它们的实际模板方法。

算法步骤可以被声明为抽象类,默认提供一些实现。

  • 2、具体类

实现抽象方法的类,重写所有步骤,但不能重写模板方法自身。

 (图片转自:https://blog.51cto.com/learningfish/5406974)

3.模板方法的适用场景(转自:https://zhuanlan.zhihu.com/p/566870552)

  • 当你只希望客户端扩展某个特定算法步骤,而不是整个算法或其结构时,可使用模板方法模式。
  • 模板方法将整个算法转换为一系列独立的步骤,以便子类能对其进行扩展,同时还可让超类中所定义的结构保持完整。
  • 当多个类的算法除一些细微不同之外几乎完全一样时,你可使用该模式。但其后果就是,只要算法发生变化,你就可能需要修改所有的类。
  • 在将算法转换为模板方法时,你可将相似的实现步骤提取到超类中以去除重复代码。子类间各不同的代码可继续保留在子类中。

 4.示例

 Hr.java

package com.method;
public abstract class Hr {
    public abstract void resume();
    public abstract void quize();
    public abstract void interview();
    public abstract void conclusion();
    public  void jobhunter() {
        resume();
        quize();        
        interview();       
        conclusion();        
    }   
}

JobHunterLiMing.java

package com.method;

public class JobHunterLiMing extends Hr{
    @Override
    public void conclusion() {
        System.out.println
        ("(4)很抱歉,李明没有得到软件工程师职位。。。。。");
    }

    @Override
    public void interview() {
        System.out.println("(3)李明正与开发部项目经理面谈。。。。");
    }
    
    @Override
    public void quize() {
        System.out.println("(2)李明正在做面相对象的笔试题。。。。");
    }
    
    @Override
    public void resume() {
        System.out.println("(1)李明在网上投递一份简历,申请一个软件工程师职位。。。。");
        
    }    
}

JobHunterZhangYing.java

package com.method;

public class JobHunterZhangYing extends Hr{

    @Override
    public void conclusion() {
        System.out.println
        ("(4)恭喜,张颖得到了行政助理职位。。。。。");
    }

    @Override
    public void interview() {
        System.out.println("(3)张颖正与人事部经理面谈。。。。");
    }
    
    @Override
    public void quize() {
        System.out.println("(2)张颖正在做行政事务的笔试题。。。。");
    }
    
    @Override
    public void resume() {
        System.out.println("(1)李明在网上投递一份简历,申请一个行政助理职位。。。。");
        
    }    
}

Client.java

package com.method;

public class Client {

    public static void main(String[] args) {
        Hr liming = new JobHunterLiMing();
        liming.jobhunter();
        System.out.println("\n ------------------------------------- \n");
        Hr zhangying = new JobHunterZhangYing();
        zhangying.jobhunter();

    }

}

运行结果:

 

 5.模板方法的优缺点(转自:https://zhuanlan.zhihu.com/p/566870552)

  • 你可仅允许客户端重写一个大型算法中的特定部分,使得算法其他部分修改对其所造成的影响减小。
  • 你可将重复代码提取到一个超类中。
  • 部分客户端可能会受到算法框架的限制。
  • 通过子类抑制默认步骤实现可能会导致违反里氏替换原则。
  • 模板方法中的步骤越多,其维护工作就可能会越困难。

 

参考文章:

https://zhuanlan.zhihu.com/p/566870552

https://www.cnblogs.com/netxiaohui/p/15183079.html

posted @ 2023-03-16 16:48  YorkShare  阅读(24)  评论(0编辑  收藏  举报