当前位置: 首页 > news >正文

模板方法模式

 

定义一个方法,安排算法的步骤,算法每一步的详细实现策略可以延迟到子类执行。

可以在算法里定义hook,让客户选择性的改变算法的策略,而不需要本身算法的步骤。

 

 代码示例:

 1 package templmethod;
 2 
 3 abstract class Audi {
 4     
 5     protected boolean isWhistle;
 6     
 7     protected void start(){
 8         System.out.println("starting....");
 9     }
10     
11     protected void stop(){
12         System.out.println("stopped....");
13     }
14     
15     protected abstract void driveNormal();
16     
17     protected abstract void driveSlowly();
18     
19     protected void reverse(){
20         setWhistle();
21         if(isWhistle){
22             System.out.println("倒车请注意...倒车请注意...");
23             System.out.println("backing now....");
24         }else{
25             System.out.println("backing now....");
26         }
27     }
28     
29     public void setWhistle(){
30         this.isWhistle = true;
31     }
32         
33     
34 }
View Code
 1 package templmethod;
 2 
 3 public class AudiA4 extends Audi{
 4 
 5     @Override
 6     public void driveNormal() {
 7         System.out.println("A4 high-end driving normally....");
 8     }
 9 
10     @Override
11     public void driveSlowly() {
12         System.out.println("A4 high-end driving slowly....");
13     }
14     
15     @Override
16     public void setWhistle() {
17         isWhistle =  false;
18     }
19 
20 
21 }
View Code
 1 package templmethod;
 2 
 3 public class AudiC5 extends Audi {
 4 
 5     @Override
 6     public void driveNormal() {
 7         System.out.println("C5 stdeady driving normally....");
 8     }
 9 
10     @Override
11     public void driveSlowly() {
12         System.out.println("C5 stdeady driving slowly....");
13     }
14     
15     @Override
16     public void setWhistle() {
17         isWhistle = true;
18     }
19 
20 }
View Code
 1 package templmethod;
 2 
 3 public class Driver {
 4     private Audi myCar;
 5     
 6     /*传说中的定义算法的方法,具体的步骤由它规定,任何人都不可以改变;
 7      * 但是每一步是可以通过子类的延迟实现,来定义的
 8      */
 9     public void driveCar(){
10         myCar.start();
11         myCar.driveNormal();
12         System.out.println("GPS提示:前方90度急转弯....");
13         myCar.driveSlowly();
14         System.out.println("GPS提示:前方无路可走....");
15         myCar.reverse();
16     }
17     
18     public void stopCar(){
19         myCar.stop();
20     }
21     
22     public void buyCar(Audi audi){
23         this.myCar = audi;
24     }
25 }
View Code
 1 package templmethod;
 2 
 3 public class Client {
 4     public static void main(String[] args) {
 5         Driver driver = new Driver();
 6         driver.buyCar(new AudiA4());
 7         driver.driveCar();
 8         
 9         System.out.println("--------------------------------------");
10         
11         driver.buyCar(new AudiC5());
12         driver.driveCar();
13         
14     }
15 }
View Code

输出结果:

starting....
A4 high-end driving normally....
GPS提示:前方90度急转弯....
A4 high-end driving slowly....
GPS提示:前方无路可走....
backing now....
--------------------------------------
starting....
C5 stdeady driving normally....
GPS提示:前方90度急转弯....
C5 stdeady driving slowly....
GPS提示:前方无路可走....
倒车请注意...倒车请注意...
backing now....

  

转载于:https://www.cnblogs.com/tisakong/p/4699214.html

相关文章:

  • Android Studio 简单介绍和使用问题小结
  • Redis内存存储结构分析
  • 数组删除空缺时的多余逗号
  • 图片验证
  • JDBC加载过程
  • 让DIV中文字换行显示
  • hdu 4050 2011北京赛区网络赛K 概率dp ***
  • git stash用法
  • 545E. Paths and Trees
  • hdu 1166 敌兵布阵 ( 线段树或者树状数组)
  • WIN7 自动同步服务器上备份文件
  • swift UI特殊培训38 与滚动码ScrollView
  • Objective-C:在类中设置不同协议
  • React Native 简介:用 JavaScript 搭建 iOS 应用(2)
  • 以ASPX生成静态页
  • 【EOS】Cleos基础
  • 【译】React性能工程(下) -- 深入研究React性能调试
  • android图片蒙层
  • co.js - 让异步代码同步化
  • Cumulo 的 ClojureScript 模块已经成型
  • PyCharm搭建GO开发环境(GO语言学习第1课)
  • Traffic-Sign Detection and Classification in the Wild 论文笔记
  • yii2中session跨域名的问题
  • 多线程事务回滚
  • 互联网大裁员:Java程序员失工作,焉知不能进ali?
  • 小程序滚动组件,左边导航栏与右边内容联动效果实现
  • 验证码识别技术——15分钟带你突破各种复杂不定长验证码
  • 在Docker Swarm上部署Apache Storm:第1部分
  • 自制字幕遮挡器
  • 仓管云——企业云erp功能有哪些?
  • ​ 无限可能性的探索:Amazon Lightsail轻量应用服务器引领数字化时代创新发展
  • #NOIP 2014# day.1 T3 飞扬的小鸟 bird
  • #我与Java虚拟机的故事#连载15:完整阅读的第一本技术书籍
  • $.ajax,axios,fetch三种ajax请求的区别
  • (03)光刻——半导体电路的绘制
  • (react踩过的坑)Antd Select(设置了labelInValue)在FormItem中initialValue的问题
  • (二)JAVA使用POI操作excel
  • (附源码)计算机毕业设计SSM教师教学质量评价系统
  • (附源码)计算机毕业设计大学生兼职系统
  • (论文阅读30/100)Convolutional Pose Machines
  • (转)Oracle 9i 数据库设计指引全集(1)
  • (转)创业家杂志:UCWEB天使第一步
  • ******之网络***——物理***
  • ***微信公众号支付+微信H5支付+微信扫码支付+小程序支付+APP微信支付解决方案总结...
  • 、写入Shellcode到注册表上线
  • .NET “底层”异步编程模式——异步编程模型(Asynchronous Programming Model,APM)...
  • .net6使用Sejil可视化日志
  • .NetCore项目nginx发布
  • .Net环境下的缓存技术介绍
  • .net快速开发框架源码分享
  • .NET面试题(二)
  • .NET项目中存在多个web.config文件时的加载顺序
  • @Tag和@Operation标签失效问题。SpringDoc 2.2.0(OpenApi 3)和Spring Boot 3.1.1集成
  • [ Linux ] Linux信号概述 信号的产生
  • [100天算法】-目标和(day 79)