版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、設(shè)計(jì)模式設(shè)計(jì)模式(Design Pattern)v解決重復(fù)設(shè)計(jì)問題解決重復(fù)設(shè)計(jì)問題v反復(fù)出現(xiàn)的設(shè)計(jì)問題的解決方案反復(fù)出現(xiàn)的設(shè)計(jì)問題的解決方案v模式被用來在特定場景下,解決一般設(shè)計(jì)問模式被用來在特定場景下,解決一般設(shè)計(jì)問題的類和相互通信的對(duì)象的描述題的類和相互通信的對(duì)象的描述v處理同一類軟件,分析結(jié)果的典型設(shè)計(jì)結(jié)構(gòu)處理同一類軟件,分析結(jié)果的典型設(shè)計(jì)結(jié)構(gòu) 面向?qū)ο竺嫦驅(qū)ο蟮钠叽蟮钠叽笤O(shè)計(jì)原則設(shè)計(jì)原則1.開放封閉原則OCP2.單一職責(zé)SRP3.里氏代換LSP4.依賴倒轉(zhuǎn)DIP5.迪米特法則LOD6.接口隔離ISP7.合成聚合復(fù)用原則CARP對(duì)擴(kuò)展開放,修改封閉對(duì)擴(kuò)展開放,修改封閉職責(zé)的分離,低耦合職
2、責(zé)的分離,低耦合 is-a,子類替換父類,子類替換父類僅通過接口和抽象類產(chǎn)生依賴僅通過接口和抽象類產(chǎn)生依賴最少知識(shí),最少相關(guān)最少知識(shí),最少相關(guān)盡可能小的單獨(dú)的接口盡可能小的單獨(dú)的接口合成合成/聚合優(yōu)先于繼承聚合優(yōu)先于繼承問題問題(Problem)(Problem)v實(shí)現(xiàn)計(jì)算器 要求輸入2個(gè)數(shù)和運(yùn)算符,得到結(jié)果控制臺(tái)的代碼,可復(fù)用其他項(xiàng)目?控制臺(tái)的代碼,可復(fù)用其他項(xiàng)目?問題問題(Problem)(Problem)static void Main(string args) Console.Write(請(qǐng)輸入數(shù)字A:); string strNumberA = Console.ReadLine();
3、 Console.Write(請(qǐng)選擇運(yùn)算符號(hào)(+、-、*、/):); string strOperate = Console.ReadLine(); Console.Write(請(qǐng)輸入數(shù)字B:); string strNumberB = Console.ReadLine(); string strResult = ; switch (strOperate) case +: strResult = (double.Parse(strNumberA) + double.Parse(strNumberB).ToString(); break; case -: strResult = (double.
4、Parse(strNumberA) - double.Parse(strNumberB).ToString(); break; case *: strResult = (double.Parse(strNumberA) * double.Parse(strNumberB).ToString(); break; case /: if (strNumberB != 0) strResult = (double.Parse(strNumberA) / double.Parse(strNumberB).ToString(); else strResult = 除數(shù)不能為0; break; Consol
5、e.WriteLine(結(jié)果是: + strResult); Console.ReadLine();問題問題(Problem)(Problem)v實(shí)現(xiàn)計(jì)算器 Ctrl+C 和 Ctrl+V 維護(hù)的時(shí)候,帶來災(zāi)難 盡可能的辦法去避免重復(fù)通過面向?qū)ο笤O(shè)計(jì),通過面向?qū)ο笤O(shè)計(jì),讓讓數(shù)據(jù)計(jì)算數(shù)據(jù)計(jì)算和和用戶交互方式用戶交互方式分開分開單一職責(zé)原則單一職責(zé)原則數(shù)據(jù)計(jì)算數(shù)據(jù)計(jì)算和和用戶交互方式用戶交互方式分開分開 class Operation public static double GetResult(double numberA, double numberB, string operate) dou
6、ble result = 0; switch (operate) case +: result = numberA + numberB; break; case -: result = numberA - numberB; break; case *: result = numberA * numberB; break; case /: result = numberA / numberB; break; return result; static void Main(string args) try Console.Write(請(qǐng)輸入數(shù)字A:); string strNumberA = Co
7、nsole.ReadLine(); Console.Write(請(qǐng)選擇運(yùn)算符號(hào)(+、-、*、/):); string strOperate = Console.ReadLine(); Console.Write(請(qǐng)輸入數(shù)字B:); string strNumberB = Console.ReadLine(); string strResult = ; strResult = Operation.GetResult(double.Parse(strNumberA), double.Parse(strNumberB), strOperate).ToString(); Console.WriteLi
8、ne(結(jié)果是: + strResult); Console.ReadLine(); catch (Exception ex) Console.WriteLine(您的輸入有錯(cuò): + ex.Message); 單一職責(zé)原則單一職責(zé)原則數(shù)據(jù)計(jì)算數(shù)據(jù)計(jì)算和和用戶交互方式用戶交互方式分開分開 private void btnNum_Click(object sender, EventArgs e) if (bOperate) textBox1.Text = “; bOperate = false; textBox1.Text = textBox1.Text + (Button)sender).Text
9、; private void btnOpertor_Click(object sender, EventArgs e) if (textBox1.Text != ) operate = (Button)sender).Text; numberA = double.Parse(textBox1.Text); bOperate = true; private void btnEqu_Click(object sender, EventArgs e) if (textBox1.Text != ) numberB = double.Parse(textBox1.Text); textBox1.Text
10、 = Operation.GetResult( numberA, numberB, operate ).ToString(); bOperate = true; bool bOperate = false;double numberA = 0;double numberB = 0;string operate = ;單一職責(zé)原則單一職責(zé)原則數(shù)據(jù)計(jì)算數(shù)據(jù)計(jì)算和和用戶交互方式用戶交互方式分開分開擴(kuò)展問題擴(kuò)展問題(Problem)(Problem)添加添加平方根運(yùn)算平方根運(yùn)算v緊耦合緊耦合 vs 松耦合松耦合 Switch中添加一個(gè)分支,搞定! 缺點(diǎn):運(yùn)算 + - * / 的代碼GetResult是
11、正確的,卻需要在修改的時(shí)候暴露? 如何修改或添加新運(yùn)算,不影響其它的運(yùn)算代碼?對(duì)擴(kuò)展開放,對(duì)修改關(guān)閉:對(duì)擴(kuò)展開放,對(duì)修改關(guān)閉:不被修改的前提下被擴(kuò)展不被修改的前提下被擴(kuò)展所有面向?qū)ο笤瓌t的核心。軟件設(shè)計(jì)本身所追求的目標(biāo)就是封裝變化、降低耦合,而開放封閉原則正是對(duì)這一目標(biāo)的最直接體現(xiàn)。開放封閉原則開放封閉原則(OCP,Open Closed Principle)其核心的思想是:其核心的思想是:軟件實(shí)體應(yīng)該是可擴(kuò)展,而不可修改的。對(duì)擴(kuò)展開放對(duì)擴(kuò)展開放,意味著有新的需求或變化時(shí),可以對(duì)意味著有新的需求或變化時(shí),可以對(duì)現(xiàn)有代碼進(jìn)行擴(kuò)展,以適應(yīng)新的情況?,F(xiàn)有代碼進(jìn)行擴(kuò)展,以適應(yīng)新的情況。 對(duì)修改封閉對(duì)修
12、改封閉,意味著類一旦設(shè)計(jì)完成,就可以獨(dú)立,意味著類一旦設(shè)計(jì)完成,就可以獨(dú)立完成其工作,而不要對(duì)類進(jìn)行任何修改。完成其工作,而不要對(duì)類進(jìn)行任何修改。 實(shí)現(xiàn)開放封閉的核心思想核心思想就是對(duì)抽象編程對(duì)抽象編程,而不對(duì)具體編程,因?yàn)槌橄笙鄬?duì)穩(wěn)定。 讓編程依賴于固定的抽象依賴于固定的抽象,所以對(duì)修改就是封閉的;而通過面向?qū)ο蟮睦^承和對(duì)多態(tài)機(jī)制,可以實(shí)現(xiàn)對(duì)抽象體的繼承繼承,通過覆寫其方法來改變固有行為,實(shí)現(xiàn)新的擴(kuò)展方法實(shí)現(xiàn)新的擴(kuò)展方法,所以對(duì)于擴(kuò)展就是開放的。開放封閉原則開放封閉原則不被修改的前提下被擴(kuò)展不被修改的前提下被擴(kuò)展添加新的運(yùn)算,滿足開放封閉原則!添加新的運(yùn)算,滿足開放封閉原則!不被修改的前提下
13、被擴(kuò)展不被修改的前提下被擴(kuò)展 class Operation private double _numberA = 0; private double _numberB = 0; public double NumberA get return _numberA; set _numberA = value; public double NumberB get return _numberB; set _numberB = value; public virtual double GetResult() return 0; 不被修改的前提下被擴(kuò)展不被修改的前提下被擴(kuò)展 / 加法類 class Op
14、erationAdd : Operation public override double GetResult() double result = 0; result = NumberA + NumberB; return result; / 減法類 class OperationSub : Operation public override double GetResult() double result = 0; result = NumberA - NumberB; return result; / 乘法類 class OperationMul : Operation public ov
15、erride double GetResult() double result = 0; result = NumberA * NumberB; return result; / 除法類 class OperationDiv : Operation public override double GetResult() double result = 0; if (NumberB = 0) throw new Exception(除數(shù)不能為0。); result = NumberA / NumberB; return result; 問題問題(Problem)(Problem) static v
16、oid Main(string args) try Console.Write(請(qǐng)輸入數(shù)字A:); string strNumberA = Console.ReadLine(); Console.Write(請(qǐng)選擇運(yùn)算符號(hào)(+、-、*、/):); string strOperate = Console.ReadLine(); Console.Write(請(qǐng)輸入數(shù)字B:); string strNumberB = Console.ReadLine(); string strResult = ; / strResult = Operation.GetResult( double.Parse(str
17、NumberA), double.Parse(strNumberB), strOperate).ToString(); if (strOperate = +) OperationAdd add = new OperationAdd(); add.NumberA = double.Parse(strNumberA); add.NumberB = double.Parse(strNumberB); strResult = add.GetResult().ToString(); Console.WriteLine(結(jié)果是: + strResult); Console.ReadLine(); catc
18、h (Exception ex) Console.WriteLine(您的輸入有錯(cuò): + ex.Message); 新問題:雖然滿足了開放封閉原則,單新問題:雖然滿足了開放封閉原則,單一職責(zé)原則,一職責(zé)原則, 但是眾多類,使用起來非常不方便但是眾多類,使用起來非常不方便對(duì)象的創(chuàng)建和使用的分離對(duì)象的創(chuàng)建和使用的分離對(duì)象的創(chuàng)建和使用的分離對(duì)象的創(chuàng)建和使用的分離 class OperationFactory public static Operation createOperate(string operate) Operation oper = null; switch (operate) cas
19、e +: oper = new OperationAdd(); break; case -: oper = new OperationSub(); break; return oper; 負(fù)責(zé)對(duì)象創(chuàng)建負(fù)責(zé)對(duì)象創(chuàng)建對(duì)象的創(chuàng)建和使用的分離對(duì)象的創(chuàng)建和使用的分離 static void Main(string args) try Console.Write(請(qǐng)輸入數(shù)字A:); string strNumberA = Console.ReadLine(); Console.Write(請(qǐng)選擇運(yùn)算符號(hào)(+、-、*、/):); string strOperate = Console.ReadLine();
20、 Console.Write(請(qǐng)輸入數(shù)字B:); string strNumberB = Console.ReadLine(); string strResult = ; Operation oper; oper = OperationFactory.createOperate(strOperate); oper.NumberA = Convert.ToDouble(strNumberA); oper.NumberB = Convert.ToDouble(strNumberB); strResult = oper.GetResult().ToString(); Console.WriteLin
21、e(結(jié)果是: + strResult); Console.ReadLine(); catch (Exception ex) Console.WriteLine(您的輸入有錯(cuò): + ex.Message); 只需簡單參數(shù)即可獲得所需對(duì)象,只需簡單參數(shù)即可獲得所需對(duì)象,實(shí)現(xiàn)對(duì)象的創(chuàng)建和使用的分離實(shí)現(xiàn)對(duì)象的創(chuàng)建和使用的分離負(fù)責(zé)對(duì)象使用負(fù)責(zé)對(duì)象使用簡單工廠模式簡單工廠模式(Simple Factory)(Simple Factory) 根據(jù)自變量的不同,返回不同的類的實(shí)例。 簡單工廠模式專門定義一個(gè)類,來負(fù)責(zé)創(chuàng)建其它類的實(shí)例,被創(chuàng)建的實(shí)例通常都具有共同的父類。 模式動(dòng)機(jī):考慮一個(gè)簡單場景,多個(gè)外觀不同
22、的按鈕,都源自同一個(gè)基類,不同的子類修改了部分屬性,從而可以呈現(xiàn)不同的外觀;如果我們希望不需要知道這些具體按鈕類的名字,只需要知道按鈕類的一個(gè)參數(shù),并提供一個(gè)調(diào)用方便的方法,把該參數(shù)傳入方法,即可返回一個(gè)相應(yīng)的按鈕對(duì)象。簡單工廠模式簡單工廠模式(Simple Factory)(Simple Factory)v模式結(jié)構(gòu) CreateOperate(string operate)return new ConcreteProduct簡單工廠模式簡單工廠模式(Simple Factory)(Simple Factory)v 優(yōu)點(diǎn)優(yōu)點(diǎn): 工廠類含有必要的判斷邏輯,可以決定在什么時(shí)候創(chuàng)建哪一個(gè)產(chǎn)品類的實(shí)例
23、,客戶端可以免除直接創(chuàng)建產(chǎn)品對(duì)象的責(zé)任,而僅僅“消費(fèi)”產(chǎn)品。簡單工廠模式通過這種做法實(shí)現(xiàn)了對(duì)象創(chuàng)建和使用的分離。 客戶端代碼簡潔,無需知道所創(chuàng)建具體產(chǎn)品的類名,只需知道對(duì)應(yīng)的參數(shù),可以減少使用者的記憶量。v 缺點(diǎn)缺點(diǎn) 工廠類集中了所有產(chǎn)品創(chuàng)建邏輯,一旦不能正常工作,整個(gè)系統(tǒng)都要受到影響。 增加了類的數(shù)量,增加了系統(tǒng)的復(fù)雜度和理解難度。 系統(tǒng)擴(kuò)展困難,一旦添加新產(chǎn)品就不得不修改工廠邏輯,有可能造成工廠邏輯過于復(fù)雜,不利于擴(kuò)展。 簡單工廠模式通常使用靜態(tài)工廠方法,造成工廠角色無法形成基于繼承的等級(jí)結(jié)構(gòu)。簡單工廠模式簡單工廠模式(Simple Factory)(Simple Factory)v模式應(yīng)
24、用 根據(jù)各類算法的密碼生成器。 根據(jù)各類數(shù)據(jù)進(jìn)行圖表繪制。問題:問題:用戶要求增加新運(yùn)算 class OperationFactory public static Operation createOperate(string operate) Operation oper = null; switch (operate) case +: oper = new OperationAdd(); break; case -: oper = new OperationSub(); break; case return oper; 修改類代碼,違背了開放封閉原則!修改類代碼,違背了開放封閉原則!模式動(dòng)機(jī)
25、: 簡單工廠模式如果需要增加新類型,那么需要修改工廠類的代碼,違反了“開放封閉原則”。 定義一個(gè)抽象的工廠類,而定義具體的工廠類來實(shí)現(xiàn)這個(gè)抽象按鈕工廠類中定義的方法。 父類(抽象工廠類)負(fù)責(zé)定義創(chuàng)建對(duì)象的公共接口,而子類則負(fù)責(zé)生成具體的對(duì)象,將類的實(shí)例化操作,延遲到子類中完成,即由子類來決定究竟應(yīng)該實(shí)例化(創(chuàng)建) 哪一個(gè)類。故此模式也叫多態(tài)模式。工廠方法模式工廠方法模式(Factory Method)(Factory Method)簡單工廠模式簡單工廠模式(Simple Factory) (Simple Factory) -使用頻率最高的設(shè)計(jì)模式之一,使用頻率最高的設(shè)計(jì)模式之一,是很多開源框架
26、和是很多開源框架和API類庫的核心模式。類庫的核心模式。工廠方法模式工廠方法模式(Factory Method)(Factory Method)簡單工廠模式簡單工廠模式(Simple Factory) (Simple Factory) -工廠方法模式工廠方法模式(Factory Method)(Factory Method) / 抽象工廠方法 interface IFactory Operation CreateOperation(); / 專門負(fù)責(zé)生產(chǎn)“*”的工廠 class MulFactory : IFactory public Operation CreateOperation() r
27、eturn new OperationMul(); / 專門負(fù)責(zé)生產(chǎn)“/”的工廠 class DivFactory : IFactory public Operation CreateOperation() return new OperationDiv(); / 專門負(fù)責(zé)生產(chǎn)“+”的工廠 class AddFactory : IFactory public Operation CreateOperation() return new OperationAdd(); / 專門負(fù)責(zé)生產(chǎn)“-”的工廠 class SubFactory : IFactory public Operation Crea
28、teOperation() return new OperationSub(); 工廠方法模式工廠方法模式(Factory Method)(Factory Method) static void Main(string args) try Console.Write(請(qǐng)輸入數(shù)字A:); string strNumberA = Console.ReadLine(); Console.Write(請(qǐng)輸入數(shù)字B:); string strNumberB = Console.ReadLine(); string strResult = ; IFactory operFactory = new AddF
29、actory(); Operation oper = operFactory.CreateOperation(); oper.NumberA = Convert.ToDouble(strNumberA); oper.NumberB = Convert.ToDouble(strNumberB); strResult = oper.GetResult().ToString(); Console.WriteLine(結(jié)果是: + strResult); Console.ReadLine(); catch (Exception ex) Console.WriteLine(您的輸入有錯(cuò): + ex.Me
30、ssage); 工廠方法模式工廠方法模式(Factory Method)(Factory Method)v模式結(jié)構(gòu) return new ConcreteProduct抽象工廠抽象工廠具體工廠具體工廠工廠方法模式工廠方法模式(Factory Method)(Factory Method)v優(yōu)點(diǎn)如下 創(chuàng)建與使用分離,還向客戶隱藏了創(chuàng)建產(chǎn)品的細(xì)節(jié),甚至無需知道產(chǎn)品類的類名。 基于工廠角色和產(chǎn)品角色的多態(tài)性設(shè)計(jì),能夠使工廠可以自主確定創(chuàng)建何種產(chǎn)品對(duì)象,而如何創(chuàng)建這個(gè)對(duì)象的細(xì)節(jié)則完全封裝在具體工廠內(nèi)部。v缺點(diǎn)如下 添加新產(chǎn)品時(shí),需要編寫新的具體產(chǎn)品類,及對(duì)應(yīng)的具體工廠類,類成對(duì)增加,運(yùn)行時(shí)系統(tǒng)會(huì)有額外
31、的開銷。 考慮到系統(tǒng)的可擴(kuò)展性,需要引入抽象層,增加了系統(tǒng)的抽象性和理解難度,增加了系統(tǒng)的實(shí)現(xiàn)難度。工廠方法模式工廠方法模式(Factory Method)(Factory Method)v模式使用: 不能清楚知道所必須創(chuàng)建的對(duì)象的類。 一個(gè)類希望由它的子類來指定它所創(chuàng)建的對(duì)象。 將創(chuàng)建對(duì)象的職責(zé)委托給多個(gè)子類中的某一個(gè),且不同子類提供不同實(shí)現(xiàn)。設(shè)計(jì)模式設(shè)計(jì)模式分類分類 根據(jù)其目的(模式是用來做什么的)可分為創(chuàng)建型(Creational),結(jié)構(gòu)型(Structural)和行為型(Behavioral)三種: 創(chuàng)建型模式主要用于創(chuàng)建對(duì)象。 結(jié)構(gòu)型模式主要用于處理類或?qū)ο蟮慕M合。 行為型模式主要用
32、于描述對(duì)類或?qū)ο笤鯓咏换ズ驮鯓臃峙渎氊?zé)。設(shè)計(jì)模式意圖描述設(shè)計(jì)模式意圖描述一、創(chuàng)建型模式一、創(chuàng)建型模式 單例模式(Singleton)保證一個(gè)類僅有一個(gè)實(shí)例,并提供一個(gè)訪問它的全局訪問點(diǎn)。原型模式(Prototype)用原型實(shí)例指定創(chuàng)建對(duì)象的種類,并且通過拷貝這些原型創(chuàng)建新的對(duì)象工廠方法(FactoryMethod)定義一個(gè)用于創(chuàng)建對(duì)象的接口,讓子類決定實(shí)例化哪一個(gè)類。抽象工廠(AbstractFactory)提供一個(gè)創(chuàng)建一系列相關(guān)或相互依賴對(duì)象的接口,而無需指定它們具體的類。建造者(Builder)將一個(gè)復(fù)雜對(duì)象的構(gòu)建與它的表示分離,使得同樣的構(gòu)建過程可以創(chuàng)建不同的表示。設(shè)計(jì)模式意圖描述設(shè)計(jì)模式意圖描述二二、結(jié)構(gòu)型模式、結(jié)構(gòu)型模式 適配器模式(Adapter)將一個(gè)類的接口轉(zhuǎn)換成客戶希望的另外一個(gè)接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些類可以一起工作。橋接模式(Bridge)將抽象部分與它的實(shí)現(xiàn)部分分離,使它們都可以獨(dú)立地變化。組合模式(Compsite)將對(duì)象組合成樹形結(jié)構(gòu)以表示部分-整體
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 基金登記與服務(wù)協(xié)議詳解
- 廣告牌租賃合同范本2024年
- 兼職合同模板集成
- 債權(quán)轉(zhuǎn)讓合同協(xié)議范本
- 產(chǎn)品供銷合作協(xié)議
- 廣告主與平臺(tái)間的合同范本
- 建筑裝飾裝修合同樣本示例
- 2024年貴州省公務(wù)員考試《行測(cè)》真題及答案解析
- 店面租用協(xié)議書范本
- 2024年新版裝修現(xiàn)場安全管理協(xié)議
- 大水學(xué)校德育活動(dòng)記錄
- 消防部隊(duì)水源手冊(cè)范本
- 政策工具視角下的中國教育扶貧政策文本研究
- 教育部新版本科專業(yè)目錄(2012年)
- 七年級(jí)英語上培優(yōu)扶差記錄表
- 二級(jí)減速器箱體蓋工藝卡片
- 互聯(lián)網(wǎng)高速專線電路開通測(cè)試報(bào)告[寶典]
- 乳頭溢液的診斷及處理ppt課件
- 虎牌電飯煲中文使用說明書
- 《相信自己,我是最棒的》主題班會(huì)說課稿
- 人像攝影布光PPT優(yōu)秀課件
評(píng)論
0/150
提交評(píng)論