設計模式之歡迎來到設計模式世界(二)

来源:https://www.cnblogs.com/dimple91/archive/2019/03/22/10577460.html
-Advertisement-
Play Games

第一節的內容,不知道大家看的如何。小編在博客園的評論里,找到了第一篇的一個缺點,沒有把動態改變行為的Duck子類列出來,導致有小伙伴有疑問。在這裡說聲抱歉,是我疏忽了,好在有GitHub,讓大家可以進去一窺究竟,在後續的學習中我也會註意此類問題。 先來解答下上次課程留下的思考題,利用繼承來提供Duc ...


第一節的內容,不知道大家看的如何。小編在博客園的評論里,找到了第一篇的一個缺點,沒有把動態改變行為的Duck子類列出來,導致有小伙伴有疑問。在這裡說聲抱歉,是我疏忽了,好在有GitHub,讓大家可以進去一窺究竟,在後續的學習中我也會註意此類問題。

先來解答下上次課程留下的思考題,利用繼承來提供Duck的行為,這會導致哪些缺點。有以下幾個(看看你的答案是否和他吻合呢):

A 代碼再多個子類中重覆

B 運行時的行為不容易改變

D 難以得知所有鴨子的全部行為

F 改變會牽一發動全身,造成其他鴨子不想要的改變

然後我們再來回顧下,上一篇說到的幾個變化,通過類圖再次給大家做下復盤。首先來看下最初是的簡單的模型,此時鴨子只會呱呱叫、有外觀顯示以及游泳的能力。

 

接下來,我們想讓鴨子飛,一開始用了繼承的方式來解決,導致不需要飛行的鴨子類也繼承了這功能, 顯然是不太合理的,也就是開篇說到的繼承存在的幾個缺點。

 

哈哈,所以我們需要通過介面來實現,把飛行和呱呱叫功能封裝成介面,只有需要相應能力的鴨子自行去實現此介面,這樣就能達到按需獲取的情況

 

上圖中的Flyable和Quackable 就是鴨子類需要各自去實現的功能,按需實現。那我不想飛的鴨子就不用飛了,不想叫的鴨子就不需要叫了,讓他靜靜地待著吧。

 

在上圖我們看到了兩個介面是五個實現類,很明確吧,把飛行,不飛行, 呱呱叫,吱吱叫,不叫給你分的清清楚楚,明明白白。

接下來,就是整合鴨子的行為,也就是我在代碼里沒寫明白的部分,實在是對不起各位。

 

在Duck子類創建的時候,先在構造器里預設創建各個行為類,比如你需要呱呱叫,並且是飛行的行為。

 

這就是預設的行為,然後你需要動態改變行為,就如前文所說,用setter方法重新定義你需要創建的行為即可,你創建的鴨子能從不會飛變身成裝上火箭助推器的鴨子般給力

public class FlyRocketPowered implements FlyBehavior {

    public void fly() {

        System.out.println("I'm flying with a rocket!");

    }

}

Duck model = new ModelDuck();
// 第一次調用,不會飛
model.performFly();
// 調用繼承來的setter方法,把火箭動力飛行的行為定到模型鴨中,模型鴨能一飛衝天
model.setFlyBehavior(new FlyRocketPowered());
// 這樣就成功的改變了行為
model.performFly();

整個過程最後的圖就是一個父類的Duck,若幹個Duck的子類,一個飛行行為的介面,一個呱呱叫的介面以及若幹個針對介面的實現

 

好啦,這樣又和大家一起回顧了一遍上一篇的整體流程,你消化了嗎。

在此,我還想聊聊為什麼我們需要設計模式。書中也有提到,大致的意思就是,一個程式員在描述一個功能的時候,巴拉巴拉講了一堆,說要建立一個廣播類來跟蹤所有的對象,只要有更新,就會通知每個傾聽者。這些傾聽者可以隨時加入廣播系統,也可以隨時移除 。結果,一個擁有設計模式的老鳥就隨口說了一句,你用「觀察者模式」來描述剛纔的這個場景,簡單方便,易於溝通,還把所有需要的功能都清楚了,大家相視一笑,哈哈。忽然發現,我有時候也會對我熟悉的設計模式脫口而出,尤其是這個觀察者模式,原來有些東西已經在無形之中影響了我,影響著你。

在書中,這個場景叫「共用模式」。共用模式辭彙威力巨大,總結起來就是:

  • 當你使用模式名稱和其他開發人員或者開發團隊溝通時,你們之間交流的不只是模式名稱,而是一整套模式背後所象徵的質量、特性、約束。

  • 模式能夠讓你用更少的辭彙做更充分的溝通。

  • 當你用模式描述的時候,其他開發人員便很容易地知道你對設計的想法。

  • 將說話的方式保持在模式層次,可以讓你待在「設計圈子」久一點。

  • 使用模式談論軟體系統,可以讓你保持在設計層次,不會被壓低到對象與類這種瑣碎的事情上面。

  • 對於設計模式有深入理解的團隊,彼此之間對於設計的看法不容易產生誤解。

最後聊聊設計模式的工具,書本中叫他為「設計工具箱內的工具

現在我們對設計模式有了一個初步的認識,接下去就要開始進入這個美妙的世界了。但是,先別急,我們需要帶上屬於我們的工具,把設計模式一一修理乾凈。其實你應該已經猜到是什麼了吧。我還是再啰嗦一下

- OO基礎

抽象、封裝、繼承、多態

- OO原則

封裝變化

多用組合,少用繼承

針對介面編程,不針對實現編程

- OO模式

策略』--定義演算法族,分別封裝起來,讓他們之間可以相互替換,此模式讓演算法的變化獨立於使用演算法的客戶。

走進設計模式的世界部分就給大家介紹到這裡,拿起我們的工具,往前進吧。

PS:因為最近幾天項目忙,GayHub的事情稍微有點延遲,周末我好好整理下,會儘快輸出。

 

相關閱讀:設計模式之歡迎來到設計模式世界(一)

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 鏈式編程 多行代碼合併成一行代碼,前提要認清此行代碼返回的是不是對象.是對象才能進行鏈式編程 .html(‘val’).text(‘val’).css()鏈式編程,隱式迭代 鏈式編程註意:$(‘div’).html(‘設置值’).val(‘設置值’);這樣可以,但是$(‘div’).html().t ...
  • 第二章 1.如果我們在控制臺中執行下列語句,結果分別是什麼?為什麼? 2.執行下麵的語句後,v 的值會是什麼? var v = v || 10; 如果將v 分別設置為100、0、null,結果又將是什麼? 100, 10, 10 3.編寫一個列印乘法口訣表的腳本程式。提示:使用嵌套迴圈來實現。 第三 ...
  • walkDOM getElementsByClassName 第六章 6.5 判斷是不是數組 寫一個Reduce 第七章 正則表達式 7.1 匹配url的正則 匹配數字的reg ...
  • ———— 潤物無聲,做一個有個格調的coder 小程式、快應用 現在可謂是家喻戶曉,也更加密切的滲透入我們的生活中,筆者也算是個愛折騰的人,俗話說的好嘛,“不折騰,不前端“(當然是筆者自己的小心聲)。於是在平日里忙碌的工作之餘抽出來時間搞點事(si)情,來寫一個屬於自己的貼身小天氣。說時遲那時快,這 ...
  • 項目地址:https://github.com/xiaoyuqing/react-redux-instagram,喜歡的話動動手指點點贊^-^ 1.初始化項目 IndexRoute是預設路由 2.增加store文件 const history = syncHistoryWithStore(brows ...
  • this 前排提示:this只有在執行的時候才能確認,定義時無法被確認。 1. 作為對象屬性執行 2. 作為構造函數執行 3. 作為普通函數執行 4. call,apply,bind可以改變this的指向 這裡引用下 "追夢子博客" 的一些知識 上面代碼說明瞭,只要構造函數不返回對象,就不會影響新建 ...
  • 今天(已經好些天前了...),群裡面(JS前端開發跳板6群【81501322】)有個群友問了這樣一個問題。 看到這個題,我的內心是崩潰的,這什麼鬼? 不一會就看到有大神給出了幾個答案. 自己的思想也會被開竅的。 細心的童鞋有沒有看到問題??console.log的結果並不是題目給出的 'hello ...
  • 原文地址:http://www.cnblogs.com/jhli/p/6019895.html 1 IoC理論的背景 我們都知道,在採用面向對象方法設計的軟體系統中,它的底層實現都是由N個對象組成的,所有的對象通過彼此的合作,最終實現系統的業務邏輯。 圖1:軟體系統中耦合的對象 如果我們打開機械式手 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...