<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                >[info]定義一個操作中的算法骨架,而將算法的一些步驟延遲到子類中,使得子類可以不改變該算法結構的情況下重定義該算法的某些特定步驟。它是一種類行為型模式。 **例如:** 去銀行辦理業務一般要經過以下4個流程:取號、排隊、辦理具體業務、對銀行工作人員進行評分等,其中取號、排隊和對銀行工作人員進行評分的業務對每個客戶是一樣的,可以在父類中實現,但是辦理具體業務卻因人而異,它可能是存款、取款或者轉賬等,可以延遲到子類中實現。 **例如:** 一個人每天會起床、吃飯、做事、睡覺等,其中“做事”的內容每天可能不同。我們把這些規定了流程或格式的實例定義成模板,允許使用者根據自己的需求去更新它,例如,簡歷模板、論文模板、Word 中模板文件等。 **主要優點** 1. 它封裝了不變部分,擴展可變部分。它把認為是不變部分的算法封裝到父類中實現,而把可變部分算法由子類繼承實現,便于子類繼續擴展。 2. 它在父類中提取了公共的部分代碼,便于代碼復用。 3. 部分方法是由子類實現的,因此子類可以通過擴展方式增加相應的功能,符合開閉原則。 **主要缺點** 1. 對每個不同的實現都需要定義一個子類,這會導致類的個數增加,系統更加龐大,設計也更加抽象。 2. 父類中的抽象方法由子類實現,子類執行的結果會影響父類的結果,這導致一種反向的控制結構,它提高了代碼閱讀的難度。 ## **模式的應用場景** 1. 算法的整體步驟很固定,但其中個別部分易變時,這時候可以使用模板方法模式,將容易變的部分抽象出來,供子類實現。 2. 當多個子類存在公共的行為時,可以將其提取出來并集中到一個公共父類中以避免代碼重復。首先,要識別現有代碼中的不同之處,并且將不同之處分離為新的操作。最后,用一個調用這些新的操作的模板方法來替換這些不同的代碼。 3. 當需要控制子類的擴展時,模板方法只在特定點調用鉤子操作,這樣就只允許在這些點進行擴展。 ## **模式的結構** (1) 抽象類(Abstract Class):負責給出一個算法的輪廓和骨架。它由一個模板方法和若干個基本方法構成。這些方法的定義如下。 * ① 模板方法:定義了算法的骨架,按某種順序調用其包含的基本方法。 * ② 基本方法:是整個算法中的一個步驟,包含以下幾種類型。 * 抽象方法:在抽象類中申明,由具體子類實現。 * 具體方法:在抽象類中已經實現,在具體子類中可以繼承或重寫它。 * 鉤子方法:在抽象類中已經實現,包括用于判斷的邏輯方法和需要子類重寫的空方法兩種。 (2) 具體子類(Concrete Class):實現抽象類中所定義的抽象方法和鉤子方法,它們是一個頂級邏輯的一個組成步驟。 ![](https://img.kancloud.cn/ce/6b/ce6b5354034dc9aa1b6d6da8b4e8232a_518x393.png) ``` //抽象類 abstract class AbstractClass { //模板方法 public function TemplateMethod() { $this->SpecificMethod(); $this->abstractMethod1(); $this->abstractMethod2(); } //確定的就直接定義,無需子類實現 //具體方法 public function SpecificMethod() { print_r("抽象類中的具體方法被調用...<br>"); } //不確定的就定義為抽象方法,在子類實現 //抽象方法1 public abstract function abstractMethod1(); //抽象方法2 public abstract function abstractMethod2(); } //具體子類 class ConcreteClass extends AbstractClass { /** * @override */ public function abstractMethod1() { print_r("抽象方法1的實現被調用...<br>"); } /** * @override */ public function abstractMethod2() { print_r("抽象方法2的實現被調用...<br>"); } } class TemplateMethodPattern { public static function main() { $tm=new ConcreteClass(); $tm->TemplateMethod(); } } TemplateMethodPattern::main(); 輸出 抽象類中的具體方法被調用... 抽象方法1的實現被調用... 抽象方法2的實現被調用... ``` 例子 ``` //抽象類: 出國留學 abstract class StudyAbroad { public function TemplateMethod() //模板方法 { $this->LookingForSchool(); //索取學校資料 $this->ApplyForEnrol(); //入學申請 $this->ApplyForPassport(); //辦理因私出國護照、出境卡和公證 $this->ApplyForVisa(); //申請簽證 $this->ReadyGoAbroad(); //體檢、訂機票、準備行裝 $this->Arriving(); //抵達 } public function ApplyForPassport() { print_r("三.辦理因私出國護照、出境卡和公證:"); print_r(" 1)持錄取通知書、本人戶口簿或身份證向戶口所在地公安機關申請辦理因私出國護照和出境卡。"); print_r(" 2)辦理出生公證書,學歷、學位和成績公證,經歷證書,親屬關系公證,經濟擔保公證。"); } public function ApplyForVisa() { print_r("四.申請簽證:"); print_r(" 1)準備申請國外境簽證所需的各種資料,包括個人學歷、成績單、工作經歷的證明;個人及家庭收入、資金和財產證明;家庭成員的關系證明等;"); print_r(" 2)向擬留學國家駐華使(領)館申請入境簽證。申請時需按要求填寫有關表格,遞交必需的證明材料,繳納簽證。有的國家(比如美國、英國、加拿大等)在申請簽證時會要求申請人前往使(領)館進行面試。"); } public function ReadyGoAbroad() { print_r("五.體檢、訂機票、準備行裝:"); print_r(" 1)進行身體檢查、免疫檢查和接種傳染病疫苗;"); print_r(" 2)確定機票時間、航班和轉機地點。"); } public abstract function LookingForSchool();//索取學校資料 public abstract function ApplyForEnrol(); //入學申請 public abstract function Arriving(); //抵達 } //具體子類: 美國留學 class StudyInAmerica extends StudyAbroad { /** * @Override */ public function LookingForSchool() { print_r("一.索取學校以下資料:"); print_r(" 1)對留學意向國家的政治、經濟、文化背景和教育體制、學術水平進行較為全面的了解;"); print_r(" 2)全面了解和掌握國外學校的情況,包括歷史、學費、學制、專業、師資配備、教學設施、學術地位、學生人數等;"); print_r(" 3)了解該學校的住宿、交通、醫療保險情況如何;"); print_r(" 4)該學校在中國是否有授權代理招生的留學中介公司?"); print_r(" 5)掌握留學簽證情況;"); print_r(" 6)該國政府是否允許留學生合法打工?"); print_r(" 8)畢業之后可否移民?"); print_r(" 9)文憑是否受到我國認可?"); } /** * @Override */ public function ApplyForEnrol() { print_r("二.入學申請:"); print_r(" 1)填寫報名表;"); print_r(" 2)將報名表、個人學歷證明、最近的學習成績單、推薦信、個人簡歷、托福或雅思語言考試成績單等資料寄往所申請的學校;"); print_r(" 3)為了給簽證辦理留有充裕的時間,建議越早申請越好,一般提前1年就比較從容。"); } /** * @Override */ public function Arriving() { print_r("六.抵達目標學校:"); print_r(" 1)安排住宿;"); print_r(" 2)了解校園及周邊環境。"); } } class StudyAbroadProcess { public static function main() { $studyAbroad=new StudyInAmerica(); $studyAbroad->TemplateMethod(); } } StudyAbroadProcess::main(); ``` ## **擴展** 在模板方法模式中,基本方法包含:抽象方法、具體方法和鉤子方法,正確使用“鉤子方法”可以使得子類控制父類的行為。如下面例子中,可以通過在具體子類中重寫鉤子方法 HookMethod1() 和 HookMethod2() 來改變抽象父類中的運行結果,其結構圖如圖 ![](https://img.kancloud.cn/5e/63/5e6305fe11fc6ad5bcb6d060142af39b_624x493.png)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看