模板方法模式

举报
小鲍侃java 发表于 2021/09/10 22:30:46 2021/09/10
【摘要】 定义:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 优点:1.封装不变部分,扩展可变部分            2.提取公共部分代码,便于维护 缺点:1.提高了系统的复杂度。 使用场景:一些方法通...

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

优点:1.封装不变部分,扩展可变部分

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

缺点:1.提高了系统的复杂度。

使用场景:一些方法通用,一些方法不通用,却在每一个子类都重新写了这所有的方法。

类图:

在这里插入图片描述

模板代码:

抽象模板类


  
  1. static abstract class AbstractTemplate {
  2. //公有方法 但是可以复写
  3. protected void operateA() {
  4. System.out.println("A");
  5. }
  6. protected void operateB() {
  7. System.out.println("B");
  8. }
  9. //不同的方法
  10. protected abstract void operateC() ;
  11. // 声明为final方法,避免子类覆写
  12. // 固定的步骤
  13. public final void templateMehthod() {
  14. this.operateA();
  15. this.operateB();
  16. this.operateC();
  17. }
  18. }

具体实现类A


  
  1. static class ConcreteClassA extends AbstractClass {
  2. @Override
  3. protected void operateC() {
  4. System.out.println("C");
  5. }
  6. }

具体实现类B


  
  1. static class ConcreteClassB extends AbstractClass {
  2. @Override
  3. protected void operateB() {
  4. System.out.println("B+");
  5. }
  6. @Override
  7. protected void operateC() {
  8. System.out.println("C");
  9. }
  10. }

栗子

抽象模板类


  
  1. static abstract class AbstractPlayLol {
  2. protected void openComputer() {
  3. System.out.println("开机了");
  4. }
  5. protected void playGame() {
  6. System.out.println("开始玩");
  7. }
  8. //结果不相同
  9. protected abstract void over() ;
  10. // 声明为final方法,避免子类覆写
  11. public final void templateMehthod() {
  12. this.openComputer();
  13. this.playGame();
  14. this.over();
  15. }
  16. }

抽象实现


  
  1. static class ConcreteClassA extends AbstractPlayLol {
  2. @Override
  3. protected void over() {
  4. System.out.println("15投");
  5. }
  6. }

  
  1. static class ConcreteClassB extends AbstractPlayLol {
  2. @Override
  3. protected void openComputer() {
  4. System.out.println("电脑坏了");
  5. }
  6. @Override
  7. protected void playGame() {
  8. System.out.println("没玩上");
  9. }
  10. @Override
  11. protected void over() {
  12. System.out.println("没玩上");
  13. }
  14. }

调用


  
  1. class Client {
  2. public static void main(String[] args) {
  3. AbstractPlayLol playA= new ConcreteClassA();
  4. cookVegetable.cook();
  5. AbstractPlayLol playB= new ConcreteClassB();
  6. cookVegetable.cook();
  7. }

 

文章来源: baocl.blog.csdn.net,作者:小黄鸡1992,版权归原作者所有,如需转载,请联系作者。

原文链接:baocl.blog.csdn.net/article/details/102659949

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。