• 6-8模板方法设计模式及应用场景(多态的应用)


    抽象类体现的就是一种模板模式的设计,抽象类作为多个子类的通用模
    板,子类在抽象类的基础上进行扩展、改造,但子类总体上会保留抽象
    类的行为方式。

    解决的问题:

    当功能内部一部分实现是确定的,一部分实现是不确定的。这时可以把不确定的部分暴露出去,让子类去实现。

    换句话说,在软件开发中实现一个算法时,整体步骤很固定、通用,这些步骤已经在父类中写好了。但是某些部分易变,易变部分可以抽象出来,供不同子类实现。这就是一种模板模式。

    练习1

    /*
     * 抽象类的应用:模板方法的设计模式
     */
    public class TemplateTest {
    	public static void main(String[] args) {
    		
    		SubTemlate t = new SubTemlate();
    		
    		t.sendTime();
    	}
    }
    abstract class Template{
    	
    	//计算某段代码执行所需花费的时间
    	public void sendTime(){
    		
    		long start = System.currentTimeMillis();
    		
    		code();	//不确定部分,易变的部分
    		
    		long end = System.currentTimeMillis();
    		
    		System.out.println("花费的时间为:" + (end - start));
    	}
    	
    	public abstract void code();
    }
    
    class SubTemlate extends Template{
    	
    	@Override
    	public void code() {
    		
    		for(int i = 2;i <= 1000;i++){
    			boolean isFlag = true;
    			for(int j = 2;j <= Math.sqrt(i);j++){
    				if(i % j == 0){
    					isFlag = false;
    					break;
    				}
    			}
    			if(isFlag){
    				System.out.println(i);
    			}
    		}
    	}
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48

    练习2

    //抽象类的应用:模板方法的设计模式
    public class TemplateMethodTest {
    
    	public static void main(String[] args) {
    		BankTemplateMethod btm = new DrawMoney();
    		btm.process();
    
    		BankTemplateMethod btm2 = new ManageMoney();
    		btm2.process();
    	}
    }
    abstract class BankTemplateMethod {
    	// 具体方法
    	public void takeNumber() {
    		System.out.println("取号排队");
    	}
    
    	public abstract void transact(); // 办理具体的业务 //钩子方法
    
    	public void evaluate() {
    		System.out.println("反馈评分");
    	}
    
    	// 模板方法,把基本操作组合到一起,子类一般不能重写
    	public final void process() {
    		this.takeNumber();
    
    		this.transact();// 像个钩子,具体执行时,挂哪个子类,就执行哪个子类的实现代码
    
    		this.evaluate();
    	}
    }
    
    class DrawMoney extends BankTemplateMethod {
    	public void transact() {
    		System.out.println("我要取款!!!");
    	}
    }
    
    class ManageMoney extends BankTemplateMethod {
    	public void transact() {
    		System.out.println("我要理财!我这里有 2000 万美元!!");
    	}
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45

    模板方法设计模式是编程中经常用得到的模式。各个框架、类库中都有他的
    影子,比如常见的有:
     数据库访问的封装
     Junit单元测试
     JavaWeb的Servlet中关于doGet/doPost方法调用
     Hibernate中模板程序
     Spring中JDBCTemlate、HibernateTemplate等

  • 相关阅读:
    verilog实现分频(奇数分频,偶数分频,且50%占空比,通用版本)
    【手写一个Tomcat】SimpleTomcat-01
    nextTick()方法的使用
    距离度量 —— 汉明距离(Hamming Distance)
    博睿数据一体化智能可观测平台入选中国信通院2022年“云原生产品名录”
    SpringCloud - Spring Cloud Alibaba 之 Skywalking 分布式链路跟踪;下载安装,应用(十二)
    k8s集群CD工具-ArgoCD
    Linux打包发布常用命令
    Python Prim 算法 生成迷宫 通过Pygame可视化
    蓝桥杯备赛Day8——队列
  • 原文地址:https://blog.csdn.net/qq_44774198/article/details/125613295