假冒网站能通过备案登记吗,仿简书WordPress,智能建站价格,东营网站建设推广公司设计模式#xff1a;
设计模式是对软件设计中普遍存在#xff08;反复出现#xff09;的各种问题#xff0c;所提出的解决方案。这个术语是由Erich Gamma等人在1995年的书《设计模式#xff1a;可复用面向对象软件的基础》中首次引入的。设计模式可以加快开发过程#x…设计模式
设计模式是对软件设计中普遍存在反复出现的各种问题所提出的解决方案。这个术语是由Erich Gamma等人在1995年的书《设计模式可复用面向对象软件的基础》中首次引入的。设计模式可以加快开发过程提供一种通用的、重复使用的、优雅的解决方案用于在特定的上下文中处理常见的设计问题。
设计模式可以分为三大类创建型、结构型和行为型。创建型模式关注如何创建对象结构型模式关注如何组合对象而行为型模式则关注对象之间的通信。
模板方法模式
模板方法模式是一种行为设计模式它在一个方法中定义了一个算法的骨架并允许子类为一个或多个步骤提供实现。模板方法使得子类可以在不改变算法结构的情况下重新定义算法的某些步骤。
在模板方法模式中我们将不变的行为移至父类将可变的行为留给子类实现。父类中的模板方法可以定义一系列的算法步骤并且可以提供一个默认的实现。这样子类在必要时可以覆盖这些方法但是改变的是步骤的具体实现而不是步骤的执行顺序。
模板方法模式是一种非常灵活的模式它可以用来处理许多常见的编程问题例如代码重用、代码组织和控制复杂性。
模板方法模式的定义
模板方法模式是一种行为设计模式它在一个方法中定义了一个算法的骨架并允许子类为一个或多个步骤提供实现。模板方法使得子类可以在不改变算法结构的情况下重新定义算法的某些步骤。
模板方法模式的主要特点 代码复用和封装模板方法模式通过将公共代码提取到父类中实现了代码的复用。同时它封装了具体步骤和数据保护了算法的完整性和安全性。 提供统一的接口父类提供了一个模板方法定义了算法的骨架。这个模板方法对外提供了统一的接口使得客户端不需要关心具体的实现细节。 支持变化模板方法模式允许子类重写父类的某些步骤这使得算法可以在不改变其结构的情况下有选择地改变其行为。 控制子类的扩展模板方法模式通过在模板方法中预定义钩子函数可以控制子类的扩展。钩子是一种特殊的方法它在父类中声明并给出默认实现子类可以选择是否覆盖它。 延迟实现模板方法模式中的具体步骤可以在子类中实现这样可以延迟到子类中进行实现。这是所谓的“好莱坞原则”——别打电话给我们我们会打电话给你。这种原则可以防止“依赖腐败”。
模板方法模式是一种非常灵活的模式它可以用来处理许多常见的编程问题例如代码重用、代码组织和控制复杂性。
模板方法模式的基本结构
模板方法模式主要包含以下几个部分 抽象类AbstractClass这个类定义了一系列的方法包括模板方法和一些基本方法。模板方法定义了算法的骨架基本方法是算法中的一个步骤可以是抽象的也可以有默认的实现。 具体类ConcreteClass这个类继承抽象类并实现抽象类中的抽象方法这些方法是算法中的具体步骤。
UML图解释
-----------------
| AbstractClass |
-----------------
| templateMethod() |
| #primitiveOperation1() |
| #primitiveOperation2() |
-----------------^|
-----------------
| ConcreteClass |
-----------------
| #primitiveOperation1() |
| #primitiveOperation2() |
-----------------在这个UML图中 AbstractClass 是一个抽象类它定义了一个模板方法 templateMethod以及两个基本方法 primitiveOperation1 和 primitiveOperation2。模板方法 templateMethod 定义了算法的骨架基本方法 primitiveOperation1 和 primitiveOperation2 是算法中的一个步骤可以是抽象的也可以有默认的实现。 ConcreteClass 是一个具体类它继承了 AbstractClass并实现了 primitiveOperation1 和 primitiveOperation2。这些方法是算法中的具体步骤。
实例背景介绍
假设我们正在开发一个工具库其中有一个DataParser类这个类的任务是读取数据解析数据然后处理数据。我们有两种类型的数据源一种是从文件中读取的数据另一种是从数据库中读取的数据。尽管读取数据的方式不同但解析和处理数据的方式是相同的。
实例设计与实现
首先我们定义一个抽象的DataParser类这个类定义了解析数据的模板方法模板方法中的一些步骤是抽象的需要在子类中实现。
public abstract class DataParser {// Template methodpublic final void parseDataAndGenerateReport() {readData();processData();writeReport();}// Abstract methodsprotected abstract void readData();protected abstract void processData();// Common methodpublic void writeReport() {System.out.println(General Report Generation);}
}然后我们定义两个DataParser的子类CSVDataParser和DatabaseDataParser它们分别实现了读取CSV文件和数据库的方法。
public class CSVDataParser extends DataParser {protected void readData() {System.out.println(Reading data from CSV file);}protected void processData() {System.out.println(Processing data from CSV file);}
}public class DatabaseDataParser extends DataParser {protected void readData() {System.out.println(Reading data from database);}protected void processData() {System.out.println(Processing data from database);}
}代码解析
在上述代码中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()是抽象方法必须在子类中实现其他都是模板方法有默认实现可以根据需要在子类中重写。
以下是一个简单的示例
public class DownloadTask extends AsyncTaskString, Integer, String {protected void onPreExecute() {// 在主线程执行用于进行一些界面上的初始化比如显示一个进度条对话框等。}protected String doInBackground(String... params) {// 在子线程中执行进行耗时操作比如下载文件等。可以调用publishProgress方法来更新任务的进度。return Downloaded file;}protected void onProgressUpdate(Integer... progress) {// 在主线程执行用于更新进度信息。}protected void onPostExecute(String result) {// 在主线程执行用于处理doInBackground方法的结果。}
}在上述代码中doInBackground()方法是抽象的必须在子类中实现其他的方法都有默认实现可以在子类中重写。这就是典型的模板方法模式。
模板方法模式的优点 代码复用模板方法模式通过在抽象类中定义算法的骨架将具体步骤的实现延迟到子类可以避免代码重复提高代码复用性。 封装不变部分模板方法模式封装了不变的算法步骤保证了算法的稳定性和可靠性。 提供扩展点模板方法模式提供了一个很好的扩展点即在抽象类中定义的抽象方法子类可以根据需要重写这些方法以实现更多的功能。
模板方法模式的缺点 类数量增多由于模板方法模式需要为每一个具体的算法步骤定义一个子类因此可能会导致类的数量增多。 增加了系统的复杂性模板方法模式虽然可以提高代码的复用性但是由于需要定义多个子类可能会增加系统的复杂性。 对子类的设计有限制模板方法模式把基本方法的执行顺序写在模板方法里这就限制了子类的行为。如果子类需要改变基本方法的执行顺序那么就需要修改父类的模板方法这违反了“开闭原则”。
模板方法模式是一种行为设计模式它定义了一个操作中的算法的骨架而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下重新定义算法的某些步骤。