日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

设计模式——模版方法

發布時間:2024/4/17 asp.net 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 设计模式——模版方法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、首先記住什么模版方法模式(看后面的代碼理解):

模版方法模式指在一個方法,里面包含了一個多步驟的算法骨架,其中一個或者多個步驟允許子類延后實現。允許子類在不修改算法的結構的
前提下,對一個或多個步驟進行自己的實現。

?

二、下面用代碼來創建的咖啡和茶來說明:

第一種情況:

分別創建Cofee.java和Tea,里面分別都有四個步驟:

1.煮水

2.用沸水泡茶 或者 用沸水泡咖啡

3.把茶或者咖啡裝進杯子

4.往杯子加入檸檬或者牛奶

package design.template;public class Cofee {void prepare(){boilWater();chongkaifei();pourInCup();addSugarAndMilk();}//煮沸水private void boilWater() {System.out.println("煮沸水");}//用沸水沖咖啡private void chongkaifei(){System.out.println("用沸水沖咖啡");}//倒入杯子private void pourInCup() {System.out.println("倒入杯子");}//加糖和牛奶private void addSugarAndMilk(){System.out.println("加糖和牛奶");}}package design.template;public class Tea {void prepare(){boilWater();chongcha();pourInCup();addLemon();}//煮水private void boilWater(){System.out.println("煮水");}//用沸水沖茶private void chongcha(){System.out.println("用沸水沖茶");}//把茶裝進被子private void pourInCup(){System.out.println("裝進杯子");}//加檸檬private void addLemon(){System.out.println("加檸檬");} }package design.template;import design.template3.Cofee;//測試類 public class TestTemplate {public static void main(String[] args) {new Cofee().prepare();} } View Code

仔細看,發現泡咖啡和泡茶兩個行為其實有很多相似之處。例如第一和第三步其實都是要把水煮沸,然后把液體倒入被子。

?

第二種情況:

定義一個超類CaffeineBeverage,因為第一步和第三步方法被Tea和Cofee類共享,所以直接在父類實現。

而prepare()方法在每個類中都不一樣,所以定義成抽象方法。

package design.template2; /*** prepare()方法在每個類中都不一樣,所以定義成抽象方法。* boilWater(),pourInCup()被兩個子類所共享,所以被定義在這個超類中* @author lindq3** 2017-2-15*/ public abstract class CaffeineBeverage {//因為prepare在Tea和Cofee類里面都不同,所以定義為抽象方法。在子類里面重寫abstract void prepare();void boilWater(){System.out.println("正在煮水");}void pourInCup(){System.out.println("倒入杯子");} }package design.template2;public class Cofee extends CaffeineBeverage {void prepare(){boilWater();chongkaifei();pourInCup();addSugarAndMilk();}//用沸水沖咖啡private void chongkaifei(){System.out.println("用沸水沖咖啡");}//加糖和牛奶private void addSugarAndMilk(){System.out.println("加糖和牛奶");}} View Code

?

第三種情況(其中這個就是模版方法模式的實現):

進一步觀察,Tea類和Cofee類除了共享第一和第三個方法外,還有一個相似的地方:就是整個泡茶,泡咖啡的“步驟相似”。于是可以考慮把prepare()方法也在父類實現。

prepare()就是一個包含多個步驟的方法,允許里面的步驟部分由父類實現,部分由子類實現。
如果需要控制boilWater()或者pourInCup()不被子類重寫,也可以定義為final public abstract class CaffeineBeverage {//因為2個子類也具備相似的步驟,把prepare法官也在父類定義。//定義為final防止被子類重寫。public final void prepare(){boilWater();mixSth();//沖東西 pourInCup();addSth();//加東西 }//具體沖什么東西由子類決定abstract void mixSth();//具體加東西由子類決定abstract void addSth();//以下2個方法為子類共有private void boilWater() {System.out.println("煮沸水");}private void pourInCup() {System.out.println("倒入杯子");}}

?

package design.template3;public class Cofee extends CaffeineBeverage{@Overridevoid mixSth() {System.out.println("用沸水沖咖啡");}@Overridevoid addSth() {System.out.println("加糖和牛奶");}}

?

第四種情況:對模板方法進行掛鉤

鉤子是一種被聲明在抽象類中的方法,但只有空的或者默認的實現。鉤子的存在,可以讓子類有能力對算法的不同點進行掛鉤。例如咖啡加不加牛奶應該由客戶決定。

具體例子如下:

package design.template4; /*** 咖啡因飲料類* 同時進一步對prepare()方法進行抽象。* 因為不希望prepare被子類覆蓋,所以定義為final類型。* prepare()方法被成為模版方法。為什么?* 這個例子里面:* 1. prepare()是一個方法* 2.它用作一個算法的模板,在這個例子中,算法是用來制作咖啡因飲料的。里面的每一個方法步驟都在prepare里面定義了。* 而且有的方法是由父類提供,有的是由子類提供。* * 簡單地說,模版方法就是提供了一個算法(包含多個方法),允許子類對其中的某幾個方法提供實現。* 模版方法模式指在一個方法,里面包含了一個多步驟的算法骨架,其中一個或者多個步驟允許子類延后實現。允許子類在不修改算法的結構的* 前提下,對一個或多個步驟進行自己的實現。* @author lindq3** 2017-2-15*/ public abstract class CaffeineBeverageWithHook {public final void prepare(){boilWater();mixSth();//沖東西 pourInCup();// 如果顧客“想要”調料,只有這時我們才調用addCondiments()。if(customerWantsCondiments()){addSth();//加東西 }}abstract void mixSth();abstract void addSth();private void boilWater() {System.out.println("煮沸水");}private void pourInCup() {System.out.println("倒入杯子");}//定義一個方法作為hookboolean customerWantsCondiments(){return true;} }package design.template4;public class Cofee extends CaffeineBeverageWithHook{@Overridevoid mixSth() {System.out.println("用沸水沖咖啡");}@Overridevoid addSth() {System.out.println("加糖和牛奶");}//定義一個方法作為hook//客戶不想要加東西boolean customerWantsCondiments(){return false;}} View Code

?

?

三、總結使用模版方法模式的優勢:

?

四、參考:

《 Head first設計模式 》學習筆記 – 模板方法模式 ?2017-02-14?ImportNew

轉載于:https://www.cnblogs.com/codetree/p/6399836.html

總結

以上是生活随笔為你收集整理的设计模式——模版方法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。