您好,登錄后才能下訂單哦!
這篇文章主要介紹“web設(shè)計模式的七大原則是什么”,在日常操作中,相信很多人在web設(shè)計模式的七大原則是什么問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”web設(shè)計模式的七大原則是什么”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!
設(shè)計模式的七大原則:
1:單一職責(zé)原則
對類來說的,即一個類應(yīng)該只負責(zé)一項職責(zé),如類A負責(zé)兩個不同職責(zé):職責(zé)1,職責(zé)2.
當(dāng)職責(zé)1需求變更而改變A時,可能造成職責(zé)2執(zhí)行錯誤,所以需要將類A的粒度分解為A1,A2
2:接口隔離原則
客戶端不應(yīng)該依賴它不需要的接口,即一個類對另一個類的依賴應(yīng)該建立在最小的接口上行
將接口拆分
package com.yuandatou; public class Segregation1 { public static void main(String[] args) { A a = new A(); B b = new B(); a.depend1(b); //A類通過接口去依賴B類 a.depend2(b); a.depend3(b); } interface InterFace1 { void operation1(); } interface InterFace2 { void operation2(); void operation3(); } interface InterFace3 { void operation4(); void operation5(); } static class B implements InterFace1,InterFace2 { @Override public void operation1() { System.out.println("B實現(xiàn)了operation1"); } @Override public void operation2() { System.out.println("B實現(xiàn)了operation2"); } @Override public void operation3() { System.out.println("B實現(xiàn)了operation3"); } } static class D implements InterFace1,InterFace3 { @Override public void operation1() { System.out.println("D實現(xiàn)了operation1"); } @Override public void operation4() { System.out.println("D實現(xiàn)了operation4"); } @Override public void operation5() { System.out.println("D實現(xiàn)了operation5"); } } static class A{ public void depend1(InterFace1 i){ i.operation1(); } public void depend2(InterFace2 i){ i.operation2(); } public void depend3(InterFace2 i){ i.operation3(); } } static class C{ public void depend1(InterFace1 i){ i.operation1(); } public void depend2(InterFace3 i){ i.operation4(); } public void depend3(InterFace3 i){ i.operation5(); } } }
3:依賴倒轉(zhuǎn)原則
1:高層模塊不應(yīng)該依賴低層模塊,二者都應(yīng)該依賴其抽象
2:抽象不應(yīng)該依賴細節(jié),細節(jié)應(yīng)該依賴抽象
3:依賴倒轉(zhuǎn)(倒置)的中心思想是面向接口編程
4:依賴倒轉(zhuǎn)原則是基于這樣的設(shè)計理念:相當(dāng)于細節(jié)的多變性,抽象的東西要穩(wěn)定的多。
以抽象為基礎(chǔ)搭建的架構(gòu)比以細節(jié)為基礎(chǔ)的架構(gòu)要穩(wěn)定的多。在java中,抽象指的是接口或抽象類
,細節(jié)就是具體的實現(xiàn)類。
5:使用接口或抽象類的目的是制定好規(guī)范,而不涉及任何具體的操作,把展現(xiàn)細節(jié)的任務(wù)交給他們的實現(xiàn)類去完成
package com.yuandatou; public class Yilaidaozhuan { public static void main(String[] args) { Person person = new Person(); person.receive(new Email()); person.receive(new Weixin()); } interface Ireceiver { public String getInfo(); } static class Email implements Ireceiver { @Override public String getInfo() { return "接收到了email消息"; } } static class Weixin implements Ireceiver { @Override public String getInfo() { return "接收到了weixin消息"; } } static class Person { public void receive(Ireceiver i) { System.out.println(i.getInfo()); } } }
4:里氏替換原則
5:開閉原則ocp
1:開閉原則(Open closed principle)是編程中最基礎(chǔ),最重要的設(shè)計原則
2:一個軟件實體如類,模塊和函數(shù)應(yīng)該對擴展開放(對提供方),對修改關(guān)閉(對使用方)。
用抽象構(gòu)建框架,用實現(xiàn)擴展細節(jié)。
3:當(dāng)軟件需要變化時,盡量通過擴展軟件實體的行為來實現(xiàn)變化,而不是通過修改已經(jīng)有的代碼來實現(xiàn)變化
4:編程中遵循其他原則,以及使用設(shè)計模式的目的就是遵循開閉原則。
package com.yuandatou; public class Ocp { public static void main(String[] args) { GraphicEditor graphicEditor = new GraphicEditor(); graphicEditor.drawShape(new A()); graphicEditor.drawShape(new B()); graphicEditor.drawShape(new C()); } } abstract class Draw { abstract void draw(); } class GraphicEditor { public void drawShape(Draw draw) { draw.draw(); } } class A extends Draw { @Override void draw() { System.out.println("繪制了一個A圖形"); } } class B extends Draw { @Override void draw() { System.out.println("繪制了一個B圖形"); } } class C extends Draw { @Override void draw() { System.out.println("繪制了一個C圖形"); } }
6:迪米特法則
7:合成復(fù)用原則
單例模式
簡單工廠模式
1:簡單工廠模式是屬于創(chuàng)建型模式,是工廠模式的一種。簡單工廠模式是由一個工廠對象決定創(chuàng)建出哪一種產(chǎn)品類的實例。簡單工廠模式是工廠模式家族中最簡單實用的模式。
2:簡單工廠模式:定義類一個創(chuàng)建對象的類,由這個類來封裝實例化對象的行為
3:在軟件開發(fā)中,當(dāng)我們會用到大量的創(chuàng)建某種,某類或者某批對象時,就會使用到工廠模式。
工廠方法模式:
工廠方法模式:定義了一個創(chuàng)建對象的抽象方法,由子類決定要實例化的類。工廠方法模式將對象的實例化推遲到子類。
個人理解:就是把幾個簡單工廠模式再封裝一次
抽象工廠模式
1:抽象工廠模式:定義了一個interface用于創(chuàng)建或有依賴關(guān)系的對象簇,而無需指明具體的類
2:抽象工廠模式可以將簡單工廠模式和工廠方法模式進行整個。
3:從設(shè)計層面看,抽象工廠模式就是對簡單工廠模式的改進(或者成為進一步的抽象)
4:將工廠抽象成兩層,AbsFactory(抽象工廠)和具體實現(xiàn)的工廠子類。程序員可以根據(jù)創(chuàng)建對象類型使用相應(yīng)的工廠子類。這樣將單個的簡單工廠變成了工廠簇,更利于代碼的維護和擴展。
原型模式(Prototype Pattern)用于創(chuàng)建重復(fù)的對象,同時又能保證性能。它屬于創(chuàng)建型設(shè)計模式,它提供了一種創(chuàng)建對象的最佳方法。
這種模式是實現(xiàn)了一個原型接口,該接口用于創(chuàng)建當(dāng)前對象的克隆。當(dāng)直接創(chuàng)建對象的代價比較大時,則采用這種模式。例如,一個對象需要在一個高代價的數(shù)據(jù)庫操作之后被創(chuàng)建。我們可以緩存該對象,在下一個請求時返回它的克隆,在需要的時候更新數(shù)據(jù)庫,以此來減少數(shù)據(jù)庫調(diào)用。
淺拷貝的介紹:
1:對于屬于類型是基本數(shù)據(jù)類型的成員變量,淺拷貝會直接進行值傳遞,也就是將該屬性值復(fù)制一份給新的對象
2:對于數(shù)據(jù)類型是引用數(shù)據(jù)類型的成員變量,比如說成員變量是某個數(shù)組,某個類的對象等,那么淺拷貝會進行引用傳遞,也就是只是將該成員變量的引用值(內(nèi)存地址)復(fù)制一份給新的對象。因為實際上兩個對象的該成員變量都指向同一個實例。在這種情況下,在一個對象中修改該成員變量對影響到另一個對象的該成員變量值、
3:前面我們克隆羊就是淺拷貝
4:淺拷貝是使用默認的clone()方法是來實現(xiàn)
深拷貝基本介紹
1:復(fù)制對象的所有基本數(shù)據(jù)類型的成員變量值
2:為所有引用數(shù)據(jù)類型的成員變量申請存儲空間,并復(fù)制每個引用數(shù)據(jù)類型成員變量所引用額對象,直到該對象可達的所有對象。也就是說,對象進行深拷貝要對整個對象進行拷貝
深拷貝實現(xiàn)方式1:重新clone方法來實現(xiàn)深拷貝
深拷貝實現(xiàn)方式2:通過對象序列化實現(xiàn)深拷貝
原型模式在spring的使用
代理模式
個人理解就是一個類實現(xiàn)了一個接口,但是我想通過代理的方式來控制個這個類來實現(xiàn)這個接口,靜態(tài)代理的方法就是創(chuàng)建一個代理工廠,也去實現(xiàn)這個接口,然后通過代理工廠的實例來使得被代理的類來實現(xiàn)接口
靜態(tài)代理的缺點是被代理和代理工廠都要實現(xiàn)這個接口,一個被代理對象對應(yīng)一個代理工廠太麻煩,所以使用了動態(tài)代理
Cglib代理
靜態(tài)代理和JDK搭理模式都要求目標(biāo)對象是實現(xiàn)一個接口,但是有時候目標(biāo)對象只是一個單獨的對象,并沒有實現(xiàn)任何的接口,這個時候可使用目標(biāo)對象子類來實現(xiàn)代理,這就是Cglib代理。
Cglib代理也叫做子類代理,它是在內(nèi)存中構(gòu)建一個子類對象從而實現(xiàn)對目標(biāo)對象功能擴展,有些書也將Cglib代理歸屬到動態(tài)代理
Cglib是一個強大的高性能代碼生成包,他可以在運行期擴展JAVA類與實現(xiàn)java接口,它廣泛的被許多AOP的框架使用,例如Spring AOP,實現(xiàn)方法攔截
在AOP編程中如何選擇代理模式:
目標(biāo)對象需要實現(xiàn)接口,用JDK代理
目標(biāo)對象不需要實現(xiàn)接口,用Cglib代理
Cglib包的底層是通過使用字節(jié)碼處理框架ASM來轉(zhuǎn)換字節(jié)碼并生成新的類
觀察者模式
當(dāng)對象間存在一對多關(guān)系時,則使用觀察者模式(Observer Pattern)。比如,當(dāng)一個對象被修改時,則會自動通知依賴它的對象。觀察者模式屬于行為型模式。
意圖:定義對象間的一種一對多的依賴關(guān)系,當(dāng)一個對象的狀態(tài)發(fā)生改變時,所有依賴于它的對象都得到通知并被自動更新。
主要解決:一個對象狀態(tài)改變給其他對象通知的問題,而且要考慮到易用和低耦合,保證高度的協(xié)作。
何時使用:一個對象(目標(biāo)對象)的狀態(tài)發(fā)生改變,所有的依賴對象(觀察者對象)都將得到通知,進行廣播通知。
如何解決:使用面向?qū)ο蠹夹g(shù),可以將這種依賴關(guān)系弱化。
關(guān)鍵代碼:在抽象類里有一個 ArrayList 存放觀察者們。
應(yīng)用實例: 1、拍賣的時候,拍賣師觀察最高標(biāo)價,然后通知給其他競價者競價。 2、西游記里面悟空請求菩薩降服紅孩兒,菩薩灑了一地水招來一個老烏龜,這個烏龜就是觀察者,他觀察菩薩灑水這個動作。
優(yōu)點: 1、觀察者和被觀察者是抽象耦合的。 2、建立一套觸發(fā)機制。
缺點: 1、如果一個被觀察者對象有很多的直接和間接的觀察者的話,將所有的觀察者都通知到會花費很多時間。 2、如果在觀察者和觀察目標(biāo)之間有循環(huán)依賴的話,觀察目標(biāo)會觸發(fā)它們之間進行循環(huán)調(diào)用,可能導(dǎo)致系統(tǒng)崩潰。 3、觀察者模式?jīng)]有相應(yīng)的機制讓觀察者知道所觀察的目標(biāo)對象是怎么發(fā)生變化的,而僅僅只是知道觀察目標(biāo)發(fā)生了變化。
使用場景:
一個抽象模型有兩個方面,其中一個方面依賴于另一個方面。將這些方面封裝在獨立的對象中使它們可以各自獨立地改變和復(fù)用。
一個對象的改變將導(dǎo)致其他一個或多個對象也發(fā)生改變,而不知道具體有多少對象將發(fā)生改變,可以降低對象之間的耦合度。
一個對象必須通知其他對象,而并不知道這些對象是誰。
需要在系統(tǒng)中創(chuàng)建一個觸發(fā)鏈,A對象的行為將影響B(tài)對象,B對象的行為將影響C對象……,可以使用觀察者模式創(chuàng)建一種鏈式觸發(fā)機制。
注意事項: 1、JAVA 中已經(jīng)有了對觀察者模式的支持類。 2、避免循環(huán)引用。 3、如果順序執(zhí)行,某一觀察者錯誤會導(dǎo)致系統(tǒng)卡殼,一般采用異步方式。
觀察者模式使用三個類 Subject、Observer 和 Client。Subject 對象帶有綁定觀察者到 Client 對象和從 Client 對象解綁觀察者的方法。我們創(chuàng)建 Subject 類、Observer 抽象類和擴展了抽象類 Observer 的實體類。
ObserverPatternDemo,我們的演示類使用 Subject 和實體類對象來演示觀察者模式。
到此,關(guān)于“web設(shè)計模式的七大原則是什么”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注億速云網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。