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

Android設計模式系列--模板方法模式

移動開發 Android
我個人對模板方法的經典思想特別推崇,雖然模板方法在大對數情況下并不被推薦使用,但是這種通過父類調用子類的方法,使用繼承來改變算法的一部分,是面向對象的一種基本認識。

模板方法,和單例模式是我認為GOF的23中最簡單的兩種模式。
但是我個人對模板方法的經典思想特別推崇,雖然模板方法在大對數情況下并不被推薦使用,但是這種通過父類調用子類的方法,使用繼承來改變算法的一部分,是面向對象的一種基本認識。
打比方說父親有很多理想,就行醫救人吧,但是父親醫術不行,只能靠兒子,兒子長大后遵從父親大志,春風拂面,妙手回春,實現了父親的理想,兒子做的事情早在出生前就定下來了,是父親之前久定好的模板。
認識到模板方法的這種思想,父類可以讓未知的子類去做它本身可能完成的不好或者根本完成不了的事情,對框架學習大有幫助。
本文以View中的draw方法為例,展開分析。
模板方法,TemplateMethod,光是學習這個模式,就會對你產生長遠影響的一個模式。

1.意圖
定義一個操作中的算法的骨架,而將一些步驟延遲到子類中,模板方法使得子類可以不改變一個算法的結構即可重定義該算法的某些特定步驟。 
熱門詞匯:骨架 步驟 結構 延遲到子類 

2.結構 

定義了幾個步驟1,2,3等,在模板方法中按照一定的結構順序執行這些步驟。父類的方法可以有缺省實現,也可以是一個空實現,即所謂的鉤子操作。
結合實際情況,我們畫出View中draw方法涉及到的幾個步驟方法如下:


學習模板方法對于我們了解框架的基類實現,生命周期和流程控制非常有幫助,我覺得是務必要掌握的一個模式。

3.代碼

  1. public class View{  
  2.     /**  
  3.      * 鉤子操作,空實現  
  4.      */ 
  5.     protected void onDraw(Canvas canvas) {  
  6.     }  
  7.    
  8.     /**  
  9.      *鉤子操作,空實現  
  10.      */ 
  11.     protected void dispatchDraw(Canvas canvas) {  
  12.     }  
  13.    
  14.     //算法骨架  
  15.     public void draw(Canvas canvas) {  
  16.        if (!verticalEdges && !horizontalEdges) {  
  17.             // 步驟1  
  18.             if (!dirtyOpaque) onDraw(canvas);  
  19.    
  20.             // 步驟2  
  21.             dispatchDraw(canvas);  
  22.    
  23.             // 步驟3  
  24.             onDrawScrollBars(canvas);  
  25.    
  26.             return;  
  27.         }  
  28.     }  
  29.     //... ...  
  30. }  

 

我們看看系統組件TextView的實現:

 

  1. public class TextView{  
  2.     @Override 
  3.     protected void onDraw(Canvas canvas) {  
  4.         //大量自定義實現代碼  
  5.     }  
  6. }  

如果我們自定義View的話,我們一般也是重寫onDraw方法即可:

  1. public class MyView extends View {  
  2.    
  3.     public MyView(Context context) {  
  4.         super(context);  
  5.     }  
  6.    
  7.     @Override 
  8.     protected void onDraw(Canvas canvas) {  
  9.         super.onDraw(canvas);  
  10.     }  
  11.    
  12.     @Override 
  13.     protected void dispatchDraw(Canvas canvas) {  
  14.         super.dispatchDraw(canvas);  
  15.     }  
  16.        
  17. }  

4.效果
(1).模板方法是一種代碼復用的基本技術。它們在類庫中尤為重要,它們提取了類庫中的公共行為。
(2).模板方法導致一種方向控制結構,"好萊塢法則":"Don't call me,i will call you.",即一個父類調用子類的操作,而不是相反。
(3).模板調用操作的類型有具體的操作,具體的AbstracClass操作,原語操作,工廠方法,鉤子操作。少定義原語操作。
(4).android中對這些重定義操作的命名喜歡在方法前加一個前綴on。
(5).模板方法使用繼承來改變算法的一部分。策略模式使用委托來改變整個算法。

責任編輯:張葉青 來源: 博客園
相關推薦

2013-11-26 16:29:22

Android設計模式

2023-12-12 11:09:55

模板方法模式python設計模式

2012-07-11 08:51:51

設計模式

2013-11-26 15:48:53

Android設計模式SDK

2013-11-26 17:00:08

Android設計模式

2013-11-26 16:20:26

Android設計模式

2024-02-21 12:24:33

模板設計模式框架

2013-11-26 16:39:21

Android設計模式

2013-11-26 17:09:57

Android設計模式

2020-11-04 08:54:54

狀態模式

2020-11-03 13:05:18

命令模式

2020-10-23 09:40:26

設計模式

2022-01-12 13:33:25

工廠模式設計

2020-10-20 13:33:00

建造者模式

2020-10-28 11:56:47

橋接模式

2020-11-09 08:20:33

解釋器模式

2021-10-26 00:21:19

設計模式建造者

2021-10-28 19:09:09

模式原型Java

2012-01-13 15:59:07

2020-11-05 09:38:07

中介者模式
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 色婷婷av一区二区三区软件 | 国产高清视频一区 | 99精品在线观看 | 午夜精品久久久久久久久久久久 | 欧美精品区 | 国产精品爱久久久久久久 | 免费国产视频在线观看 | 成人片免费看 | 亚洲成人在线免费 | 一区二区三区精品视频 | 日韩精品一区二区三区中文在线 | 欧美一级视频免费看 | 九一在线观看 | 久久综合九色综合欧美狠狠 | 操亚洲 | 罗宾被扒开腿做同人网站 | 日韩欧美视频免费在线观看 | 欧美久操网 | 国产夜恋视频在线观看 | 亚洲国产二区 | 亚洲成人精品 | 孕妇一级毛片 | 欧美五月婷婷 | 99综合在线 | 久久这里只有精品首页 | 一区在线观看 | 久久久久一区二区三区 | 韩三级在线观看 | 久久亚洲国产精品 | 中文字幕第二区 | 午夜影院| 成人午夜精品 | 九色综合网 | 欧美在线一区二区三区 | 国产精品日韩一区 | 最新毛片网站 | 亚洲精品视频在线看 | 成人午夜在线 | 99re热精品视频 | 亚洲日韩第一页 | 久久亚洲欧美日韩精品专区 |