【筹划模式】模板方法模式 在java中的应用

[复制链接]
发表于 2025-12-23 19:17:24 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
筹划模式
筹划模式是对软件筹划中广泛存在(反复出现)的各种标题,所提出的办理方案。这个术语是由Erich Gamma等人在1995年的书《筹划模式:可复用面向对象软件的根本》中初次引入的。筹划模式可以加快开发过程,提供一种通用的、重复使用的、优雅的办理方案,用于在特定的上下文中处置处罚常见的筹划标题。
筹划模式可以分为三大类:创建型、布局型和活动型。创建型模式关注怎样创建对象,布局型模式关注怎样组合对象,而活动型模式则关注对象之间的通讯。
模板方法模式
模板方法模式是一种活动筹划模式,它在一个方法中界说了一个算法的骨架,并允许子类为一个或多个步调提供实现。模板方法使得子类可以在不改变算法布局的情况下,重新界说算法的某些步调。
在模板方法模式中,我们将稳定的活动移至父类,将可变的活动留给子类实现。父类中的模板方法可以界说一系列的算法步调,而且可以提供一个默认的实现。如许,子类在须要时可以覆盖这些方法,但是改变的是步调的详细实现,而不是步调的实行次序。
模板方法模式是一种非常机动的模式,它可以用来处置处罚很多常见的编程标题,比方代码重用、代码构造和控制复杂性。
模板方法模式的界说
模板方法模式是一种活动筹划模式,它在一个方法中界说了一个算法的骨架,并允许子类为一个或多个步调提供实现。模板方法使得子类可以在不改变算法布局的情况下,重新界说算法的某些步调。
模板方法模式的重要特点

  • 代码复用和封装:模板方法模式通过将公共代码提取到父类中,实现了代码的复用。同时,它封装了详细步调和数据,掩护了算法的完备性和安全性。
  • 提供同一的接口:父类提供了一个模板方法,界说了算法的骨架。这个模板方法对外提供了同一的接口,使得客户端不必要关心详细的实现细节。
  • 支持变革:模板方法模式允许子类重写父类的某些步调,这使得算法可以在不改变其布局的情况下,有选择地改变其活动。
  • 控制子类的扩展:模板方法模式通过在模板方法中预界说钩子函数,可以控制子类的扩展。钩子是一种特别的方法,它在父类中声明并给出默认实现,子类可以选择是否覆盖它。
  • 耽误实现:模板方法模式中的详细步调可以在子类中实现,如允许以耽误到子类中举行实现。这是所谓的“好莱坞原则”——别打电话给我们,我们会打电话给你。这种原则可以防止“依靠腐败”。
模板方法模式是一种非常机动的模式,它可以用来处置处罚很多常见的编程标题,比方代码重用、代码构造和控制复杂性。
模板方法模式的根本布局
模板方法模式重要包罗以下几个部分:

  • 抽象类(AbstractClass):这个类界说了一系列的方法,包罗模板方法和一些根本方法。模板方法界说了算法的骨架,根本方法是算法中的一个步调,可以是抽象的,也可以有默认的实现。
  • 详细类(ConcreteClass):这个类继承抽象类,并实现抽象类中的抽象方法,这些方法是算法中的详细步调。
UML图表明
  1. -----------------
  2. | AbstractClass |
  3. -----------------
  4. | +templateMethod() |
  5. | #primitiveOperation1() |
  6. | #primitiveOperation2() |
  7. -----------------
  8.         ^
  9.         |
  10. -----------------
  11. | ConcreteClass |
  12. -----------------
  13. | #primitiveOperation1() |
  14. | #primitiveOperation2() |
  15. -----------------
复制代码
在这个UML图中:

  • AbstractClass 是一个抽象类,它界说了一个模板方法 templateMethod,以及两个根本方法 primitiveOperation1 和 primitiveOperation2。模板方法 templateMethod 界说了算法的骨架,根本方法 primitiveOperation1 和 primitiveOperation2 是算法中的一个步调,可以是抽象的,也可以有默认的实现。
  • ConcreteClass 是一个详细类,它继承了 AbstractClass,并实现了 primitiveOperation1 和 primitiveOperation2。这些方法是算法中的详细步调。
实例配景先容
假设我们正在开发一个工具库,此中有一个DataParser类,这个类的使命是读取数据,剖析数据,然后处置处罚数据。我们有两种范例的数据源:一种是从文件中读取的数据,另一种是从数据库中读取的数据。只管读取数据的方式差别,但剖析和处置处罚数据的方式是雷同的。
实例筹划与实现
起首,我们界说一个抽象的DataParser类,这个类界说相识析数据的模板方法,模板方法中的一些步调是抽象的,必要在子类中实现。
  1. public abstract class DataParser {
  2.     // Template method
  3.     public final void parseDataAndGenerateReport() {
  4.         readData();
  5.         processData();
  6.         writeReport();
  7.     }
  8.     // Abstract methods
  9.     protected abstract void readData();
  10.     protected abstract void processData();
  11.     // Common method
  12.     public void writeReport() {
  13.         System.out.println("General Report Generation");
  14.     }
  15. }
复制代码
然后,我们界说两个DataParser的子类:CSVDataParser和DatabaseDataParser,它们分别实现了读取CSV文件和数据库的方法。
  1. public class CSVDataParser extends DataParser {
  2.     protected void readData() {
  3.         System.out.println("Reading data from CSV file");
  4.     }
  5.     protected void processData() {
  6.         System.out.println("Processing data from CSV file");
  7.     }
  8. }
  9. public class DatabaseDataParser extends DataParser {
  10.     protected void readData() {
  11.         System.out.println("Reading data from database");
  12.     }
  13.     protected void processData() {
  14.         System.out.println("Processing data from database");
  15.     }
  16. }
复制代码
代码剖析
在上述代码中,DataParser类界说了一个模板方法parseDataAndGenerateReport(),这个方法包罗了读取数据,处置处罚数据和天生陈诉这三个步调。此中,readData()和processData()是抽象方法,必要在子类中实现,而writeReport()是一个详细方法,已经在DataParser类中实现。
CSVDataParser和DatabaseDataParser类分别实现了readData()和processData()方法,它们分别读取CSV文件和数据库中的数据,并处置处罚这些数据。
如许,无论我们的数据来自于CSV文件照旧数据库,我们都可以使用雷同的方式来剖析数据和天生陈诉,这就是模板方法模式的优点。
模板方法模式在Java API的应用
在Java API中,有很多地方使用了模板方法模式。比方,java.io.InputStream、java.io.OutputStream、java.io.Reader和java.io.Writer的全部非抽象方法,都依靠于这些类的抽象方法。比方,InputStream中的read()方法就是一个模板方法,它依靠于read(byte b[], int off, int len)这个抽象方法。
Java中模板方法模式的现实应用案例
一个常见的Java模板方法模式的应用是在Android的AsyncTask类中。AsyncTask是Android提供的一个轻量级的异步类,它可以直接继承使用。AsyncTask中界说了一些方法,如onPreExecute()、doInBackground()、onProgressUpdate()和onPostExecute()。此中doInBackground()是抽象方法,必须在子类中实现,其他都是模板方法,有默认实现,可以根据必要在子类中重写。
以下是一个简朴的示例:
  1. public class DownloadTask extends AsyncTask<String, Integer, String> {
  2.     protected void onPreExecute() {
  3.         // 在主线程执行,用于进行一些界面上的初始化,比如显示一个进度条对话框等。
  4.     }
  5.     protected String doInBackground(String... params) {
  6.         // 在子线程中执行,进行耗时操作,比如下载文件等。可以调用publishProgress方法来更新任务的进度。
  7.         return "Downloaded file";
  8.     }
  9.     protected void onProgressUpdate(Integer... progress) {
  10.         // 在主线程执行,用于更新进度信息。
  11.     }
  12.     protected void onPostExecute(String result) {
  13.         // 在主线程执行,用于处理doInBackground方法的结果。
  14.     }
  15. }
复制代码
在上述代码中,doInBackground()方法是抽象的,必须在子类中实现,其他的方法都有默认实现,可以在子类中重写。这就是典范的模板方法模式。
模板方法模式的优点

  • 代码复用:模板方法模式通过在抽象类中界说算法的骨架,将详细步调的实现耽误到子类,可以克制代码重复,进步代码复用性。
  • 封装稳定部分:模板方法模式封装了稳定的算法步调,包管了算法的稳固性和可靠性。
  • 提供扩展点:模板方法模式提供了一个很好的扩展点,即在抽象类中界说的抽象方法,子类可以根据必要重写这些方法,以实现更多的功能
模板方法模式的缺点

  • 类数量增多:由于模板方法模式必要为每一个详细的算法步调界说一个子类,因此大概会导致类的数量增多。
  • 增长了体系的复杂性:模板方法模式固然可以进步代码的复用性,但是由于必要界说多个子类,大概会增长体系的复杂性。
  • 对子类的筹划有限定:模板方法模式把根本方法的实行次序写在模板方法里,这就限定了子类的活动。假如子类必要改变根本方法的实行次序,那么就必要修改父类的模板方法,这违反了“开闭原则”。
模板方法模式是一种活动筹划模式,它界说了一个使用中的算法的骨架,而将一些步调耽误到子类中。模板方法使得子类可以在不改变算法布局的情况下,重新界说算法的某些步调。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!qidao123.com:ToB企服之家,中国第一个企服评测及软件市场,开放入驻,技术点评得现金
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表