成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

如何通過模板模式重構代碼?

開發 前端
模板方法模式(Template Method Pattern):定義一個操作中的算法的框架, 而將一些步驟延遲到子類中。使得子類可以不改 變一個算法的結構即可重定義該算法的某些特定步驟。

哈嘍,大家好,我是指北君。

本篇文章給大家介紹日常開發中比較常用的一種設計模式——模板模式。

一、什么是模板模式

Define the skeleton of an algorithm in an operation, deferring some steps to subclasses. Template Method lets subclasses redefine certain steps of an algorithm without changing the algorithm’s structure.

模板方法模式(Template Method Pattern):定義一個操作中的算法的框架, 而將一些步驟延遲到子類中。使得子類可以不改 變一個算法的結構即可重定義該算法的某些特定步驟。

說人話:父類模板方法定義不變的流程,子類重寫流程中的方法。

二、模板模式定義

圖片

1.AbstractClass 抽象模板

基本方法

上面的 baseOperation() 或者 customOperation() 方法,也叫基本操作,是由子類實現的方法,并且在模板方法中被調用。

基本方法盡量設計為protected類型, 符合迪米特法則, 不需要暴露的屬性或方法盡量不要設置為protected類型。實現類若非必要, 盡量不要擴大父類中的訪權限。

②模板方法

上面的 templateMethod() 方法,可以有一個或者幾個,實現對基本方法的調度,完成固定的邏輯。

為了防止惡意操作,通常模板方法都加上 final 關鍵字,不允許覆寫。

2.ConcreteClass 具體模板

實現父類定義的一個或多個抽象方法,也就是父類定義的基本方法在子類中得以實現。

三、模板模式通用代碼

public abstract class AbstractClass {
// 共同的且繁瑣的操作
private void baseOperation() {
// do something
}

// 由子類定制的操作
protected abstract void customOperation();

// 模板方法定義的框架
public final void templateMethod() {
/**
* 調用基本方法,完成固定邏輯
*/
baseOperation();
customOperation();
}

}
public class ConcreteClass1 extends AbstractClass{

@Override
protected void customOperation() {
// 具體模板1 業務邏輯
System.out.println("具體模板1:customOperation()");
}
}
public class ConcreteClass2 extends AbstractClass{
@Override
protected void customOperation() {
// 具體模板2 業務邏輯
System.out.println("具體模板2:customOperation()");
}
}

測試:

public class TemplateClient {
public static void main(String[] args) {
AbstractClass abstractClass1 = new ConcreteClass1();
AbstractClass abstractClass2 = new ConcreteClass2();
applyTemplate(abstractClass1);
applyTemplate(abstractClass2);
}

public static void applyTemplate(AbstractClass abstractClass){
abstractClass.templateMethod();
}
}

四、模板模式優點

1.封裝不變部分, 擴展可變部分

把認為是不變部分的算法封裝到父類實現, 而可變部分的則可以通過繼承來繼續擴展。

2.提取公共部分代碼, 便于維護

3.行為由父類控制, 子類實現

基本方法是由子類實現的, 因此子類可以通過擴展的方式增加相應的功能, 符合開閉原則。

五、模板模式缺點

1.子類執行的結果影響了父類的結果,這和我們平時設計習慣顛倒了,在復雜項目中,會帶來閱讀上的難度。

2.可能引起子類泛濫和為了繼承而繼承的問題

六、回調

為了解決模板模式的缺點,我們可以利用回調函數代替子類繼承。

圖片

public interface Callback {
void customOperation();
}
public class SubCallback implements Callback{
@Override
public void customOperation() {
System.out.println("SubCallback customOperation");
}
}
/**
* 模板類
* 聲明為 final,無法被繼承
*/
public final class Template {
private void baseOperation(){
System.out.println("模板類公共操作");
}

public void templateMethod(Callback callback){
baseOperation();
callback.customOperation();
}
}

測試:

public class TemplateClient {
public static void main(String[] args) {
Template template = new Template();
applyTemplate(template);
}

public static void applyTemplate(Template template){
Callback callback = new SubCallback();
template.templateMethod(callback);
}
}

Template是一個穩定的final類,無法被繼承,不存在子類行為影響父類結果的問題,而Callback是一個接口,為了繼承而繼承的問題消失了。

責任編輯:武曉燕 來源: Java技術指北
相關推薦

2024-09-05 10:17:34

2024-02-22 10:27:00

Python開發

2020-05-19 08:06:57

代碼重構代碼開發

2023-10-27 08:34:46

PythonJava優勢

2021-08-03 08:13:48

重構API代碼

2020-08-04 07:47:59

代碼模板模式

2021-02-11 09:13:27

責任鏈模式業務

2012-07-27 10:30:12

重構

2023-10-27 08:52:03

Python腳本關系

2022-12-26 00:02:24

重構代碼軟件

2019-04-03 08:10:17

代碼架構信息

2022-07-11 08:16:55

策略模式if-else

2023-12-12 11:09:55

模板方法模式python設計模式

2011-09-05 10:30:51

重構代碼庫業務模型

2013-10-21 17:54:00

代碼重構修改

2022-08-02 08:07:24

單元測試代碼重構

2018-08-24 21:25:02

編程語言代碼重構GitHub

2013-11-26 17:15:13

Android設計模式

2012-07-11 08:51:51

設計模式

2018-08-28 07:02:26

網絡重構SDNNFV
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 成人午夜精品 | 91精品国产91久久综合桃花 | 人操人人| 亚洲一区二区中文字幕在线观看 | 亚洲www. | 99精品久久| 亚洲国产成人精品久久 | 欧美精品一区二区三区在线播放 | 国产精品3区| 午夜免费网站 | 亚洲电影第1页 | 亚欧性视频 | 可以免费观看的av | 欧美综合一区 | 欧美日韩久久 | 日韩精品一区二区三区第95 | 成人在线观看免费爱爱 | 国产成人精品免高潮在线观看 | 免费福利视频一区二区三区 | 中文成人在线 | 二区在线视频 | 日韩在线观看一区 | 黄色福利 | 久久三级av | 日本久久精品视频 | 欧美精品91 | 男女视频在线看 | 紧缚调教一区二区三区视频 | 日韩一区中文字幕 | 91精品国产手机 | 国产日韩电影 | 黄网站在线播放 | 日韩精品一区二 | 日韩欧美网 | 91精品国产91久久久久久 | 日日噜噜噜夜夜爽爽狠狠视频97 | 91精品一区二区三区久久久久 | 亚洲成人精品在线 | 日韩欧美专区 | 欧美精品久久久 | 国产区高清 |