马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
筹划模式:
筹划模式是对软件筹划中广泛存在(反复出现)的各种标题,所提出的办理方案。这个术语是由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 method
- public final void parseDataAndGenerateReport() {
- readData();
- processData();
- writeReport();
- }
- // Abstract methods
- protected abstract void readData();
- protected abstract void processData();
- // Common method
- public 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 AsyncTask<String, 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()方法是抽象的,必须在子类中实现,其他的方法都有默认实现,可以在子类中重写。这就是典范的模板方法模式。
模板方法模式的优点:
- 代码复用:模板方法模式通过在抽象类中界说算法的骨架,将详细步调的实现耽误到子类,可以克制代码重复,进步代码复用性。
- 封装稳定部分:模板方法模式封装了稳定的算法步调,包管了算法的稳固性和可靠性。
- 提供扩展点:模板方法模式提供了一个很好的扩展点,即在抽象类中界说的抽象方法,子类可以根据必要重写这些方法,以实现更多的功能。
模板方法模式的缺点:
- 类数量增多:由于模板方法模式必要为每一个详细的算法步调界说一个子类,因此大概会导致类的数量增多。
- 增长了体系的复杂性:模板方法模式固然可以进步代码的复用性,但是由于必要界说多个子类,大概会增长体系的复杂性。
- 对子类的筹划有限定:模板方法模式把根本方法的实行次序写在模板方法里,这就限定了子类的活动。假如子类必要改变根本方法的实行次序,那么就必要修改父类的模板方法,这违反了“开闭原则”。
模板方法模式是一种活动筹划模式,它界说了一个使用中的算法的骨架,而将一些步调耽误到子类中。模板方法使得子类可以在不改变算法布局的情况下,重新界说算法的某些步调。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!qidao123.com:ToB企服之家,中国第一个企服评测及软件市场,开放入驻,技术点评得现金 |