京东网站建设目标是什么意思,安装网站时出现dir,做前端网站要注意哪些,做网站多少钱角西宁君博特惠是什么#xff1f; 在我们的实际开发中尝尝会遇到这种问题#xff1a;在设计一个系统时知道了算法所需要的关键步骤#xff0c;而且确定了这些步骤的执行顺序#xff0c;但是某些步骤的具体实现还不知道#xff0c;或者说某些步骤的实现与具体的环境相关#xff0c;例如每…是什么 在我们的实际开发中尝尝会遇到这种问题在设计一个系统时知道了算法所需要的关键步骤而且确定了这些步骤的执行顺序但是某些步骤的具体实现还不知道或者说某些步骤的实现与具体的环境相关例如每个人订车最开始的流程都是相同的预约、到店、取号、排队、办理业务这些流程对于每个客户都是相同的但是办理业务这个流程对于每个客户都可能是不同的比如有的客户是来订车有的客户是来进行保养而有的客户是来更换配饰 因此模板方法模式是定义一个操作中的算法骨架而将算法的一些步骤延迟到子类中使得子类可以不改变该算法结构的情况下重定义该算法的某些特定步骤
结构
抽象类负责给出一个算法的轮廓和骨架它由一个模板方法和若干个基本方法构成 模板方法定义了算法的骨架按某种顺序调用其包含的基本方法 基本方法是实现算法各个步骤的方法是模板方法的组成部分基本方法又可以分为以下三种 抽象方法一个抽象方法由抽象类声明、由其具体子类实现 具体方法一个具体方法由一个抽象类或具体类声明并实现其子类可以进行覆盖也可以直接继承 钩子方法在抽象类中已经实现包括用于判断的逻辑方法和需要子类重写的空方法两种一般钩子方法是用于判断的逻辑方法这类方法名一般为isXxx返回值为boolean类型
具体子类实现抽象类中所定义的抽象方法和钩子方法它们是一个顶级逻辑的组成步骤
实现
抽象类
public abstract class TemplateAbstractCar {/*** 模板方法模式中的抽象类* 已经实现的方法均为基本方法* *///预约服务public void book(){System.out.println(预约服务);};//到店服务public void arrival(){System.out.println(客户到店);};//取号public void takeNumber(){System.out.println(客户取号);};//排队服务public void line(){System.out.println(客户排队);}//客户具体操作protected abstract void buyCar();protected boolean isBuyCar(){return false;};protected abstract void maintain();protected boolean isMaintain(){return false;};//空方法public void hook(){}public final void run(){//启动四个基本方法book();arrival();takeNumber();line();//根据子类是否实现了具体方法和钩子方法来判断是否启动if (isBuyCar()){buyCar();}if (isMaintain()){maintain();}hook();}
}
具体子类
public class Customer extends TemplateAbstractCar{Overrideprotected void buyCar() {System.out.println(客户1买车服务完毕);}Overrideprotected void maintain() {}Overrideprotected boolean isBuyCar() {return true;}
}public class Customer2 extends TemplateAbstractCar{Overrideprotected void buyCar() {}Overrideprotected void maintain() {System.out.println(客户2保养服务完成);}Overrideprotected boolean isMaintain() {return true;}Overridepublic void hook() {System.out.println(客户二最后还回来买了一辆车);}
} 优缺点 优点
1.提高代码的复用性将相同部分的代码放在抽象的父类中而将不同的代码放入不同的子类中
2.实现了反向控制通过一个父类调用其子类的操作通过对子类的具体实现扩展不同的行为实现了反向控制并符合“开闭原则” 缺点
1.对每个不同的实现都需要定义一个子类这会导致类的个数增加系统更加庞大设计也更加抽象
2.父类中的抽象方法由子类实现子类执行的结果会影响父类的结果这导致一种反向的控制结构它提高了代码阅读的难度
使用场景
因此在当算法的整体步骤很固定但其中个别部分容易变时可以使用模板方法模式将容易变的部分抽象出来供子类实现或者是需要通过子类来决定父类算法中的某个步骤是否执行以实现子类对父类的反向控制时也可以使用