多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國內(nèi)最全I(xiàn)T社區(qū)平臺(tái) 聯(lián)系我們 | 收藏本站
阿里云優(yōu)惠2
您當(dāng)前位置:首頁 > 互聯(lián)網(wǎng) > Android 設(shè)計(jì)模式之模板方法模式

Android 設(shè)計(jì)模式之模板方法模式

來源:程序員人生   發(fā)布時(shí)間:2014-09-27 04:22:51 閱讀次數(shù):2003次

模板方法模式的定義:在一個(gè)方法中定義一個(gè)算法的骨架,而將一些步驟延遲到子類中,模板方法使得子類可以在不改變算法結(jié)構(gòu)的情況下,重新定義算法中的某些步驟。

設(shè)計(jì)原則:別調(diào)用我們,我會(huì)調(diào)用你,(就好比獵頭和求職者,求職者不需要去找獵頭,獵頭只要有工作就會(huì)找到你)稱之為好萊塢原則

引用一個(gè)例子,一個(gè)店中有兩飲料:咖啡和茶,他們的沖泡方法

第一步:都是要用沸水

第二步:用熱水泡咖啡或茶

第三步:把飲料倒進(jìn)杯子

第四步:在飲料中加入適當(dāng)?shù)恼{(diào)料

在上面的步驟中一、三是一樣的,可以抽取出來放在基類中,二、四不一樣,可以抽象出來,讓子類去實(shí)現(xiàn),以下是飲料抽象的父類,父類可以讓未知的子類去做它本身可能完成的不好或者根本完成不了的事情;可以加一個(gè)鉤子函數(shù):custcomerWantsCondiments(),請(qǐng)子類去重寫。

CoffeineBeverageWithHook.java

package com.dzt.template; /** * 由于有的客戶有可能不需要調(diào)料,這時(shí)就需要讓客戶去選擇是否來添加調(diào)料,需要 * * @author Administrator * */ public abstract class CoffeineBeverageWithHook { void prepareRecipe() { boilWater(); brew(); pourInCup(); if (custcomerWantsCondiments()) addCondiments(); } abstract void brew(); // 沖泡 abstract void addCondiments(); // 添加調(diào)料 // 燒開水 void boilWater() { System.out .println("CoffeineBeverageWithHook-------------------->boilWater"); } // 把飲料倒進(jìn)杯子 void pourInCup() { System.out .println("CoffeineBeverageWithHook-------------------->pourInCup"); } /** * 子類可以重載這個(gè)函數(shù) * * @return */ boolean custcomerWantsCondiments() { return true; } }

以下是咖啡類,繼承了上面的飲料父類

CoffeineWithHook.java

package com.dzt.template; public class CoffeineWithHook extends CoffeineBeverageWithHook { @Override void brew() { // TODO Auto-generated method stub System.out.println("CoffeineWithHook-------------------->brew"); } @Override void addCondiments() { // TODO Auto-generated method stub System.out .println("CoffeineWithHook-------------------->addCondiments"); } @Override boolean custcomerWantsCondiments() { // TODO Auto-generated method stub return false; } }

以下是茶類,繼承了上面的飲料父類

TeaWithHook.java

package com.dzt.template; public class TeaWithHook extends CoffeineBeverageWithHook { @Override void brew() { // TODO Auto-generated method stub System.out.println("TeaWithHook-------------------->brew"); } @Override void addCondiments() { // TODO Auto-generated method stub System.out.println("TeaWithHook-------------------->addCondiments"); } @Override boolean custcomerWantsCondiments() { // TODO Auto-generated method stub return true; } }


以上代碼可以去修改custcomerWantsCondiments()函數(shù),由用戶決定是否需要添加調(diào)料

測(cè)試代碼

package com.dzt.template; /** * 模板方法模式 在模板方法中添加鉤子方法,讓用戶決定 * * @author Administrator * @date 2014.08.20 */ public class TemplateMain { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub CoffeineWithHook coffHook = new CoffeineWithHook(); TeaWithHook teaHook = new TeaWithHook(); coffHook.prepareRecipe(); System.out .println("---------------------------------------------------------------"); teaHook.prepareRecipe(); } }

總結(jié):

1、模板方法是一種代碼復(fù)用的基本技術(shù)。它們?cè)陬悗熘杏葹橹匾鼈兲崛×祟悗熘械墓残袨椤?br> 2、模板方法導(dǎo)致一種方向控制結(jié)構(gòu),"好萊塢法則":"Don't call me,i will call you.",即一個(gè)父類調(diào)用子類的操作,而不是相反。
3、模板調(diào)用操作的類型有具體的操作,具體的AbstracClass操作,原語操作,工廠方法,鉤子操作。少定義原語操作。
4、模板方法使用繼承來改變算法的一部分。策略模式使用委托來改變整個(gè)算法。

相關(guān)代碼:http://download.csdn.net/detail/deng0zhaotai/7835511

參考書籍:《Head First 設(shè)計(jì)模式》

生活不易,碼農(nóng)辛苦
如果您覺得本網(wǎng)站對(duì)您的學(xué)習(xí)有所幫助,可以手機(jī)掃描二維碼進(jìn)行捐贈(zèng)
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關(guān)閉
程序員人生
主站蜘蛛池模板: 国产福利三区 | 欧洲xxxxxxxxx69| 不卡的毛片 | 欧美亚洲综合另类成人 | 色综合久久久高清综合久久久 | 久久久久久久国产 | 欧美性bbw| www.免费黄色| 亚洲高清一区二区三区四区 | 久久精品免费一区二区视 | 在线免费激情视频 | 欧美黑人巨大videos免费 | 日韩欧美一区二区三区 | 国产欧美日本在线 | poronovideos德国极品 | 欧美日韩精品一区二区三区四区 | 看看免费a一片欧 | 日韩看片 | 中文字幕第八页 | 高清一区二区三区 | 最近最新中文字幕免费的一页 | 狠狠躁天天躁夜夜躁夜天战 | 欧美a毛片 | 亚洲黄色免费网址 | 五月婷婷在线播放 | 五月婷婷六月丁香综合 | 校园激情亚洲 | 欧美最猛黑人xxxx黑人猛交3p | 欧美日韩视频一区二区三区 | 欧美自拍视频 | 国产精品免费大片一区二区 | 农村女人的一级毛片 | 天天看毛片 | 性色网址| 五月婷婷视频在线观看 | 欧美最猛黑人xxxx黑人 | 精品亚洲综合在线第一区 | 一区二区免费视频 | 亚洲欧美日韩国产综合高清 | 男人天堂亚洲 | 久久亚洲国产精品五月天 |