設計模式學習筆記-基礎知識篇

1. 設計模式的重要性

  1.1?設計模式解決的是在軟件過程中如何來實現具體的軟件功能。實現同一個功能的方法有很多,哪個設計容易擴展,容易復用,松耦合,可維護?設計模式指導我們找到最優方案。

  1.2?設計中往往會存在設計缺陷,這些缺陷包括:

    僵化性:難以對軟件進行改動,即使在功能上來看是很小的改動

    脆弱性:在進行很小的改動時,可能導致很多地方出現問題

    頑固性:要把系統中某些通用的功能分離出來的努力和風險非常巨大

    粘滯性:當面臨改動時,改動的方案有很多,一些會保持設計,一些會破壞設計,當采用保持設計的方法比用破壞設計的方法更難應付變化時,說明原設計具有較高的粘滯性

    晦澀性:模塊難以理解

    不必要的重復:代碼不能復用,往往通過Copy-Paste來實現相似功能

    不必要的復雜性:設計中包含了沒有用的成分,往往是過度設計導致的

  1.3?如果你覺得在開發過程中發現以上問題(缺陷),那么就需要使用設計模式來改善最初設計,即重構原有的設計。如果你是最初的設計者,那么也需要應用設計模式來找到一個最優方案。設計模式不是編程語言,它修煉的是程序員的內功。因此,對于一個開發者來說,學習設計模式是非常必要的。

2. 對于初學者來說,必要的知識準備還是必須的,沒有這些基礎就很難將這些理解透徹。

  2.1?面向對象基本知識

  設計模式是面向對象編程的設計指導,因此學習設計模式前先要理解什么是面向對象,這里只簡單列出了面向對象的主要概念,要是初學者的話還得查閱相關資料;對已經了解的老手來說,權當復習和梳理一下吧。

    2.1.1 面向對象三大特征:封裝、繼承、多態

    2.1.2 類與實例

    2.1.3 構造(析構)方法

    2.1.4 重載

    2.1.5 訪問修飾符

    2.1.6 屬性/字段/方法

    2.1.7 抽象類

    2.1.8 接口

  2.2?UML類圖

  在學習設計模式時,通常接觸到的只有類圖,因此讀懂UML類圖對理解模式來說有很大幫助。下面來介紹UML類圖中的關系    

  

    2.2.1 依賴關系(Dependency),用虛線加箭頭表示。如上圖動物(Animal)依賴空氣(Air)。表示依賴關系的代碼有以下幾種

      1)作為參數

復制代碼
        public class Air{public void GetOxygen() { Console.WriteLine("Get oxygen from air."); } } public abstract class Animal { /// <summary> /// 動物依賴空氣才能呼吸,作為參數傳入 /// </summary> /// <param name="air"></param> public void Breathe(Air air) { air.GetOxygen(); } }
復制代碼

      2)在方法內部定義    

復制代碼
            /// <summary>/// 動物依賴空氣才能呼吸,在方法內部實例化新對象/// </summary> public void Breathe() { Air air = new Air(); air.GetOxygen(); }
復制代碼

      3)靜態方法調用

復制代碼
            /// <summary>/// 在方法中調用靜態方法/// </summary> public void Test() { ClassName.UseStaticMethode(); }
復制代碼

    2.2.2 繼承關系(Inherit),用實線加空心箭頭表示,如上圖鷹(Eagle)繼承自動物(Animal)    

復制代碼
        /// <summary>/// 鷹繼承自Animal/// </summary> public class Eagle : Animal { }
復制代碼

    2.2.3 實現關系(Realize),用虛線加空心箭頭表示,如上圖鷹(Eagle)實現了飛行能力(IFlyAble)    

復制代碼
        /// <summary>/// 鷹繼承自Animal/// </summary> public class Eagle : Animal, IFlyAble {         //實現IFlyAble接口中定義的方法 public void Fly() { Console.WriteLine("老鷹可以飛翔。"); } }
復制代碼

    2.2.4 組合關系,講組合關系之前不得不談關聯關系與聚合關系

      1)關聯關系(Association):對于兩個相對獨立的對象,當一個對象實例與另一個對象的一些特定實例存在固定的對應關系時,這兩個對象之間的關系為關聯關系。例如:公司與員工的關系      

      

      代碼表現,通過實例字段或屬性來實現

復制代碼
        public class Emplolyee{public string Name{ get; set; }}public class Company { /// <summary> /// 一個公司可以有多個員工 /// </summary> private Emplolyee[] employees; }
復制代碼

      2) 聚合關系(Aggregate): 是關聯關系的一種,是一種較強的關聯關系,強調整體與部分之間的關系。例如:電腦與顯示器的關系,就是整體與部分的關系,即聚合關系      

      

      代碼表現,也是通過實例字段或屬性來實現      

復制代碼
        public class Displayer{/// <summary>/// 顯示器型號 /// </summary> public string Model { get; set; } } public class Computer { /// <summary> /// 通過字段表示聚合關系 /// </summary> private Displayer displayer; }
復制代碼

      3)組合關系,組合關系是聚合的一種特殊形式,表示一個所有物實例不能同時被兩個所有物所擁有。如上例:鷹擁有一對翅膀,它的翅膀不能同時屬于別的鷹。

      代碼表現,也是通過實例字段或屬性來實現      

復制代碼
        public class Wing{}/// <summary>/// 鷹繼承自Animal /// </summary> public class Eagle : Animal, IFlyAble { private Wing leftWing; private Wing rightWing; public Eagle() { // 在構造函數中實例化翅膀,防止翅膀被改變 leftWing = new Wing(); rightWing = new Wing(); } public void Fly() { Console.WriteLine("老鷹可以飛翔。"); } }
復制代碼

      關聯關系與聚合關系的區別: 關聯關系所涉及的兩個對象是處在同一個層次上的,比如程序員和計算機的關系就是一種關聯關系,而不是聚合關系,因為程序員不是由計算機組成的。聚合關系涉 及的兩個對象處于不平等的層次上,一個代表整體,一個代表部分。如計算機與顯示器的關系就是聚集關系,因為顯示器是計算機的一部分。

      聚合關系與組合關系的區別:聚合關系中處于被持有的對象,可以被別的對象所持有。如多態計算機可以共享同一個顯示器。組合關系中被持有的對象只能被一個對象引用,不能共享給其它對象;而且被持有的對象的生命周期也由所有者控制,當所有者析構了,其所有物必須隨著它一起析構。

轉載于:https://www.cnblogs.com/fly1027/p/4866366.html

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

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

相關文章

JavaScript對象類型詳解

《JavaScript高級程序設計》已經學習到了第四章&#xff0c;不過因為第五章講的都是各種對象類型&#xff0c;所以在進行第五章的學習之前&#xff0c;先深入了解一下對象是有好處的。 JavaScript Objects in Detail 關于對象類型的方方面面在這篇文章里都寫得很清楚了&#xf…

旋轉鏈表

給定一個鏈表&#xff0c;旋轉鏈表&#xff0c;將鏈表每個節點向右移動 k 個位置&#xff0c;其中 k 是非負數。 示例 1: 輸入: 1->2->3->4->5->NULL, k 2輸出: 4->5->1->2->3->NULL解釋:向右旋轉 1 步: 5->1->2->3->4->NULL向…

內心的平靜就是財富本身-Cell組件-用友華表的由來-T君

時至今日&#xff0c;Cell組件仍是應用廣泛的商業報表組件 作者&#xff1a;人生三毒 編者注&#xff1a;本文作者人生三毒為知名網站及網頁游戲公司創始人&#xff0c;此前曾為IT類媒體資深編輯&#xff0c;見證了中國互聯網早期的發展。 認識T君之前先認識的是他的軟件&#…

mybatis06 增刪改差 源碼

user.java package cn.itcast.mybatis.po;import java.util.Date;public class User {private int id;private String username;// 用戶姓名private String sex;// 性別private Date birthday;// 生日private String address;// 地址public int getId() {return id;}public voi…

socket 編程 基于 select 實現的回射客戶端/服務程序

github 代碼 地址 unp.h #include <stdio.h> #include <unistd.h> #include <arpa/inet.h> #include <string.h> #include <sys/socket.h> #include <stdlib.h> #include <errno.h> #include <sys/wait.h> #include <sys…

MyEclipse的優化

出自&#xff1a;http://blog.csdn.net/u010124571/article/details/41316255?refmyread 第一步: 取消自動validation validation有一堆&#xff0c;什么xml、jsp、jsf、js等等&#xff0c;我們沒有必要全部都去自動校驗一下&#xff0c;只是需要的時候才會手工校驗一下&…

NSlog輸出

NSLog的定義 void NSLog(NSString *format, …); 基本上&#xff0c;NSLog很像printf&#xff0c;同樣會在console中輸出顯示結果。不同的是&#xff0c;傳遞進去的格式化字符是NSString的對象&#xff0c;而不是char *這種字符串指針。 實例 NSLog可以如下面的方法使用&#x…

推理題,會則秒解

你和你的朋友&#xff0c;兩個人一起玩 Nim 游戲&#xff1a;桌子上有一堆石頭&#xff0c;每次你們輪流拿掉 1 - 3 塊石頭。 拿掉最后一塊石頭的人就是獲勝者。你作為先手。 你們是聰明人&#xff0c;每一步都是最優解。 編寫一個函數&#xff0c;來判斷你是否可以在給定石頭…

【圖論】割點、橋、雙連通

連通分量 個數可以通過一次BFS或者DFS得到 割點和橋 可以枚舉刪除每一個點或者每一條邊&#xff0c;判斷連通分量個數是否增加 更好的方法 該算法是R.Tarjan發明的。對圖深度優先搜索&#xff0c;定義DFS(u)為u在搜索樹&#xff08;以下簡稱為樹&#xff09;中被遍歷到的次序號…

奇酷手機顯示Log

1、在桌面點擊撥號&#xff0c;在撥號盤輸入“*20121220#”&#xff0c;進入工程模式;2、看到日志輸出等級&#xff0c;點進去 Log print enable 選 enable Java log level 選 LOGV C and C log level 選 LOGV Kernel log level 選 KERN_DEBUG3、完畢 參考網址&#xff1a;http…

getCanonicalPath getAbsolutePath區別

1、在winows環境下它們的區別是 &#xfeff;&#xfeff;getCanonicalPath是標準路徑&#xff0c;沒有特殊字符&#xff0c;getAbsolutePath是有特殊字符的 2、在AIX系統中它們的區別&#xff1a; 首先編譯&#xff1a;javac com/ai/test/BugTest.java 然后運行&#xff1a;ja…

Hbase與hive整合

//hive與hbase整合create table lectrure.hbase_lecture10(sname string, score int) stored by org.apache.hadoop.hive.hbase.HBaseStorageHandler whth serdeproperties("hbase.columns.mapping" :key,cf1:score)tblproperties("hbase.table.name" &q…

C++實現一個http服務器

一個簡單的博客后端服務器 github地址&#xff0c;持續更新 設計參考 #define MYSQLPP_MYSQL_HEADERS_BURIED #include "httplib.h" #include "rapidjson/document.h" #include <mysql/mysql.h> #include <iostream> #include <string>…

KMP算法的java實現

package com.trs.utils;public class KMPStr {/** 在KMP算法中&#xff0c;最難求的就是next函數&#xff0c;如何理解next函數是一個難題&#xff0c;特別是knext[k]&#xff0c;這里* 需要指出的是當p[i]!p[j]時&#xff0c;我們只有通過回溯將k的值逐漸減小&#xff0c;貌似…

線段分割法實現微信搶紅包

無意間看到的一種實現搶紅包的方法&#xff0c;于是用C實現了一下。 將一個紅包分成 n 份 具體的思路是&#xff0c;將一個紅包看作是一個線段&#xff0c;線段的長就是紅包總金額&#xff0c;然后在這個線段上隨機切 n-1 刀&#xff0c;分成 n 份&#xff0c;然后搶紅包的人依…

JAVA多線程和并發基礎面試問答(轉載)

JAVA多線程和并發基礎面試問答 原文鏈接&#xff1a;http://ifeve.com/java-multi-threading-concurrency-interview-questions-with-answers/ 多線程和并發問題是Java技術面試中面試官比較喜歡問的問題之一。在這里&#xff0c;從面試的角度列出了大部分重要的問題&#xff0c…

Linux的學習--crontab

之前了解過一點crontab&#xff0c;前段時間比較閑&#xff0c;就熟悉了一下&#xff0c;今天總結記錄一下。 crontab命令常見于Unix和類Unix的操作系統之中&#xff0c;用于設置周期性被執行的指令。該命令從標準輸入設備讀取指令&#xff0c;并將其存放于"crontab"…

C++雪花算法實現

看來一下雪花算法的實現方法&#xff0c;用 c試著實現了一下&#xff0c;這里僅僅是實現了算法的流程&#xff0c;但是具體的細節&#xff0c;如并發、多線程訪問等等沒有具體考慮。 雪花算法的簡單講解參考 #include <sys/select.h> #include <iostream> #includ…

CAlayer層的屬性

iOS開發UI篇—CAlayer層的屬性 一、position和anchorPoint 1.簡單介紹 CALayer有2個非常重要的屬性&#xff1a;position和anchorPoint property CGPoint position; 用來設置CALayer在父層中的位置 以父層的左上角為原點(0, 0) property CGPoint anchorPoint; 稱為“定位點”、…

Window Linux下實現指定目錄內文件變更的監控方法

轉自&#xff1a;http://qbaok.blog.163.com/blog/static/10129265201112302014782/ 對于監控指定目錄內文件變更&#xff0c;window 系統提供了兩個未公開API&#xff1a;SHChangeNotifyRegister SHChangeNotifyDeregister 分別用于注冊Notify以及監視。 同時&#xff0c;還提…