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

一,定義

定義一個操作中的算法的框架,而將一些步驟延遲到子類中,使得子類可以不改變一個算法的結構即可重定義該算法的某些特定步驟。

在面向對象的開發過程中,通常會遇到這樣一個問題,我們知道一個算法所需的關鍵步驟,并確定了這些步驟的執行順序,但是,某些步驟的具體實現是未知的,或者說某些步驟的實現是會隨著環境的變化而改變的,例如,執行程序的流程大致如下:

1,檢查代碼的正確性

2,鏈接相關的類庫

3,編譯相關代碼

4,執行程序

對于不同的程序設計語言,上述四個步驟都是不一樣的,但是,他們的執行流程是固定的,這類問題的解決方案就是模板方法模式。

模板方法實際上是封裝一個固定流程,就像是一套執行模板一樣,第一步該做什么,第二步該做什么都已經在抽象類中定義好。而子類可以有不同的算法實現,在框架不被修改的情況下實現某些步驟的算法替換。

二,使用場景

1,多個子類有公有的方法,并且邏輯基本相同時。

2,重要,復雜的算法,可以把核心算法設計為模板方法,周邊的相關細節功能則由各個子類實現。

3,重構時,模板方法模式是一個經常使用的模式,把相同的代碼抽取到父類中,然后通過鉤子函數約束其行為。

角色介紹:

抽象類:定義了一套算法框架

具體實現類:實現具體算法框架

三,使用案例

在英雄聯盟游戲中,玩家要開始一場排位游戲,需要先1,進入匹配隊列? 2,進入banpick界面3,禁用英雄 4,選擇英雄 5,選擇符文和召喚師技能 6,進入游戲

如果使用模板模式,怎么來實現呢?

首先定義一個抽象模板類:

public class AbsRank {public void startMate(){System.out.println("進入匹配隊列");}public void startBp(){System.out.println("進入bp界面");}public void startBan(){System.out.println("開始禁用英雄");}public void select(){System.out.println("選擇英雄");}public void selectSkill(){System.out.println("選擇符文和召喚師技能");}public void begin(){System.out.println("開始游戲");}public final void playGame(){startMate();startBp();startBan();select();selectSkill();begin();}
}

定義兩個玩家類:

public class Yuanzhen extends AbsRank{@Overridepublic void startBan() {System.out.println("禁用亞索");}@Overridepublic void select() {System.out.println("選擇劍圣");}@Overridepublic void selectSkill() {System.out.println("選擇懲戒和閃現");}
}
public class Xiaoming extends AbsRank{@Overridepublic void startBan() {System.out.println("禁用趙信");}@Overridepublic void select() {System.out.println("選擇蠻王");}@Overridepublic void selectSkill() {System.out.println("選擇疾跑和閃現");}
}

使用 :

Yuanzhen yuanzhen =new Yuanzhen();
yuanzhen.playGame();
Xiaoming xiaoming =new Xiaoming();
xiaoming.playGame();

最后結果:

四,總結

模板方法模式用四個字概括就是:流程封裝。也就是把某個固定的流程封裝到一個final函數中 ,并且讓子類能夠定制這個流程中的某些或者所有步驟,這就要求父類提取共用的代碼,提升代碼的復用率,同時也帶來了更好的可擴展性。

優點:

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

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

缺點:

模板方法會帶來代碼閱讀的難度,會讓用戶覺得難以理解

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/161904.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/161904.shtml
英文地址,請注明出處:http://en.pswp.cn/news/161904.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

MR導游情景英語虛擬仿真實訓系統應用

MR導游情景英語虛擬仿真實訓系統應運而生。系統旨在為學生提供一種全新的培訓方式。 系統采用先進的MR混合現實技術,通過虛擬現實技術創建逼真的旅游場景,讓學生能夠身臨其境地體驗各種旅游活動。學生可以在系統中扮演導游的角色,與其他同學…

docker報錯standard init linux.go:228 exec user process caused: exec format error

1、報錯 使用Dockerfile自己做的服務鏡像,docker run時啟動失敗,報錯如下: standard init linux.go:228 exec user process caused: exec format error2、原因一 當前服務器的CPU架構和構建鏡像時的CPU架構不兼容。比如做鏡像是在arm機器下…

競賽選題 車道線檢測(自動駕駛 機器視覺)

0 前言 無人駕駛技術是機器學習為主的一門前沿領域,在無人駕駛領域中機器學習的各種算法隨處可見,今天學長給大家介紹無人駕駛技術中的車道線檢測。 1 車道線檢測 在無人駕駛領域每一個任務都是相當復雜,看上去無從下手。那么面對這樣極其…

云原生正在重塑軟件的整個生命周期(內附資料)

隨著企業數字化轉型進程的發展,企業面臨著新舊商業形態的劇變,顛覆和重構時刻都在發生。 企業需要更加快速地感知用戶側的需求變化并做出調整,才有可能在競爭中持續積累優勢。業務的個性化、敏捷化、智能化需求日益突顯,數字化應…

git merge 和 git rebase

一、是什么 在使用 git 進行版本管理的項目中,當完成一個特性的開發并將其合并到 master 分支時,會有兩種方式: git merge git rebasegit rebase 與 git merge都有相同的作用,都是將一個分支的提交合并到另一分支上,…

模版模式 設計模式

設計模式 總目錄 https://preparedata.blog.csdn.net/article/details/134512591 文章目錄 設計模式 總目錄一、案例二、抽象類模版 AbstractOrderTemplate(頂層的訂單抽象類)三、執行模版的實現類3.1 默認執行模版 DefaultOrder3.2 其他執行模版 Simlp…

19.悲觀鎖與樂觀鎖解析

1.悲觀鎖 悲觀鎖比較悲觀,它認為如果不鎖住這個資源,別的線程就會來爭搶,就會造成數據結果錯誤,所以悲觀鎖為了確保結果的正確性,會在每次獲取并修改數據時,都把數據鎖住,讓其他線程無法訪問該…

2023年亞太地區數學建模大賽 問題B

玻璃溫室中的微氣候法規 溫室作物的產量受到各種氣候因素的影響,包括溫度、濕度和風速[1]。其中,適宜的溫度和風速是植物生長[2]的關鍵。為了調節玻璃溫室內的溫度、風速等氣候因素,溫室的設計通常采用帶有溫室風扇的通風系統,如…

docker報錯

安裝 docker報錯: Docker Desktop requires the Server service to be enabled. 解決方法: 管理員身份打開cmd,輸入: services.msc開啟 server 服務。 docker啟動報錯: 打開 docker 界面報錯: Docke…

rabbit MQ的延遲隊列處理模型示例(基于SpringBoot延時插件實現)

rabbitMQ安裝插件rabbitmq-delayed-message-exchange 交換機由此type 表示組件安裝成功 生產者發送消息時設置延遲值 消息在交換機滯納至指定延遲后,進入隊列,被消費者消費。 組件注解類: package com.esint.configs;import org.springfra…

OpenAI再次與Altman談判;ChatGPT Voice正式上線

11月22日,金融時報消息,OpenAI迫于超過700名員工聯名信的壓力,再次啟動了與Sam Altman的談判,希望他回歸董事會。 在Sam確定加入微軟后,OpenAI超700名員工簽署了一封聯名信,要求Sam和Greg Brockman&#x…

Java檢測網絡是否正常通訊

Java是一種流行的編程語言,可以用于開發網絡應用程序。在網絡應用程序中,檢測IP地址和端口是否通常是必要的。本文將介紹如何使用Java檢測IP和端口。 Java檢測IP和端口的方法非常簡單。我們可以使用Java的Socket類來實現。下面的代碼片段演示了如何檢測…

用于 syslog 收集的協議:TCP、UDP、RELP

系統日志是從 Linux/Unix 設備和其他網絡設備(如交換機、路由器和防火墻)生成的日志 可以通過將 syslog 聚合到稱為 syslog 服務器、syslog 守護程序或 syslogd 的服務器來集中 syslog。在TCP、UDP和RELP協議的幫助下,系統日志從設備傳輸到系…

「快學Docker」監控和日志記錄容器的健康和性能

「快學Docker」監控和日志記錄容器的健康和性能 1. 容器健康狀態監控2. 性能監控3. 日志記錄幾種采集架構圖 4. 監控工具和平臺cAdvisor(Container Advisor)PrometheusGrafana 5. 自動化運維 1. 容器健康狀態監控 方法1:需要實時監測容器的運…

Zero-Shot Restoration of Back-lit Images Using Deep Internal Learning

ABSTRACT 如何恢復背光圖像仍然是一項具有挑戰性的任務。該領域最先進的方法基于監督學習,因此通常僅限于特定的訓練數據。在本文中,我們提出了一種用于背光圖像恢復的“零樣本”方案,該方案利用深度學習的力量,但不依賴于任何先…

孟德爾隨機化 MR入門基礎-簡明教程-工具變量-暴露

孟德爾隨機化(MR)入門介紹和分章分享(暫時不解讀) 大家好,孟德爾隨機化大火,但是什么是孟德爾隨機化,具體怎么實操呢 這沒有其他教程的繁冗,我這篇講最基礎的孟德爾隨機化的核心步…

Selenium瀏覽器自動化測試框架

介紹 Selenium [1] 是一個用于Web應用程序測試的工具。Selenium測試直接運行在瀏覽器中,就像真正的用戶在操作一樣。支持的瀏覽器包括IE(7, 8, 9, 10, 11),Mozilla Firefox,Safari,Google Chrome&#xff…

STM32_3(GPIO)

GPIO簡介 GPIO(General Purpose Input Output)通用輸入輸出口8種輸入輸出模式輸出模式可控制端口輸出高電平,驅動LED、蜂鳴器、模擬通信協議輸出時許等輸入模式可讀取端口的高低電平或電壓,用于讀取按鍵輸入、外接模塊電平信號輸…

【VRTK】【VR開發】【Unity】8-可交互對象

【概述】 之前我們只是用了一個簡單方塊作為可交互對象。其實可交互對象可以有許多細節設置,包括具體抓握物體的哪個點,指定抓握的方向,指定Secondary Action允許兩手互換抓握,雙手抓握,用兩手改變物體大小等。 【拾取物體】 要讓一個物體能夠被拾取,必須設置它為可互…

mysql解壓版安裝步驟linux

1. MySQL下載就不說了,以5.7版本舉例 2. 解壓安裝包 tar -zxvf mysql-5.7.41-linux-glibc2.12-x86_64.tar.gz 3. 重命名目錄 mv mysql-5.7.41-linux-glibc2.12-x86_64 /usr/local/mysql 4. 創建mysql用戶組和用戶 groupadd mysql useradd -r -g mysql mysql …