中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當(dāng)前位置: 首頁(yè) > news >正文

汕頭澄海招聘網(wǎng)搜索引擎優(yōu)化期末考試答案

汕頭澄海招聘網(wǎng),搜索引擎優(yōu)化期末考試答案,南通模板建站多少錢(qián),web前端工作設(shè)計(jì)模式 前言 有一些重要的設(shè)計(jì)原則在開(kāi)篇和大家分享下,這些原則將貫通全文: 面向接口編程,而不是面向?qū)崿F(xiàn)。這個(gè)很重要,也是優(yōu)雅的、可擴(kuò)展的代碼的第一步,這就不需要多說(shuō)了吧。 職責(zé)單一原則。每個(gè)類都應(yīng)該只有一…

設(shè)計(jì)模式

前言

有一些重要的設(shè)計(jì)原則在開(kāi)篇和大家分享下,這些原則將貫通全文:

  • 面向接口編程,而不是面向?qū)崿F(xiàn)。這個(gè)很重要,也是優(yōu)雅的、可擴(kuò)展的代碼的第一步,這就不需要多說(shuō)了吧。

  • 職責(zé)單一原則。每個(gè)類都應(yīng)該只有一個(gè)單一的功能,并且該功能應(yīng)該由這個(gè)類完全封裝起來(lái)。

  • 對(duì)修改關(guān)閉,對(duì)擴(kuò)展開(kāi)放。對(duì)修改關(guān)閉是說(shuō),我們辛辛苦苦加班寫(xiě)出來(lái)的代碼,該實(shí)現(xiàn)的功能和該修復(fù)的 bug 都完成了,別人可不能說(shuō)改就改;對(duì)擴(kuò)展開(kāi)放就比較好理解了,也就是說(shuō)在我們寫(xiě)好的代碼基礎(chǔ)上,很容易實(shí)現(xiàn)擴(kuò)展。

創(chuàng)建型模式比較簡(jiǎn)單,但是會(huì)比較沒(méi)有意思,結(jié)構(gòu)型和行為型比較有意思

每個(gè)代理模式的代碼都必須自己手動(dòng)完成一遍。

創(chuàng)建型模式

創(chuàng)建型模式的作用就是創(chuàng)建對(duì)象,說(shuō)到創(chuàng)建一個(gè)對(duì)象,最熟悉的就是 new 一個(gè)對(duì)象,然后 set 相關(guān)屬性。但是,在很多場(chǎng)景下,我們需要給客戶端提供更加友好的創(chuàng)建對(duì)象的方式,尤其是那種我們定義了類,但是需要提供給其他開(kāi)發(fā)者用的時(shí)候。

工廠模式分為簡(jiǎn)單工廠模式,工廠模式,抽象工廠模式

在工廠模式中,我們?cè)趧?chuàng)建對(duì)象時(shí)不會(huì)對(duì)客戶端暴露創(chuàng)建邏輯,并且是通過(guò)使用一個(gè)共同的接口來(lái)指向新創(chuàng)建的對(duì)象。本質(zhì)就是使用工廠方法代替new操作。

簡(jiǎn)單工廠模式

public class FoodFactory {public static Food makeFood(String name) {if (name.equals("蘭州拉面")) {Food noodle = new LanZhouNoodle();System.out.println("蘭州拉面"+noodle+"出鍋啦");return noodle;} else if (name.equals("黃燜雞")) {Food chicken = new HuangMenChicken();System.out.println("黃燜雞"+ chicken +"出鍋啦");return chicken;} else {System.out.println("不知道你做的什么哦~");return null;}}
}

其中,LanZhouNoodle 和 HuangMenChicken 都繼承自 Food。

public class Cook {public static void main(String[] args) {Food food = FoodFactory.makeFood("黃燜雞");FoodFactory.makeFood("jaja");}
}

簡(jiǎn)單地說(shuō),簡(jiǎn)單工廠模式通常就是這樣,一個(gè)工廠類 XxxFactory,里面有一個(gè)靜態(tài)方法,根據(jù)我們不同的參數(shù),返回不同的派生自同一個(gè)父類(或?qū)崿F(xiàn)同一接口)的實(shí)例對(duì)象。

我們強(qiáng)調(diào)職責(zé)單一原則,一個(gè)類只提供一種功能,FoodFactory 的功能就是只要負(fù)責(zé)生產(chǎn)各種 Food。

在此例中可以看出,Cook 類在使用 FoodFactory 時(shí)就不需要 new 任何一個(gè)對(duì)象,這就是簡(jiǎn)單工廠模式的好處,封裝了 new 的部分,做到的代碼易用性。

工廠模式

簡(jiǎn)單工廠模式很簡(jiǎn)單,如果它能滿足我們的需要,我覺(jué)得就不要折騰了。之所以需要引入工廠模式,是因?yàn)槲覀兺枰褂脙蓚€(gè)或兩個(gè)以上的工廠。

public interface FoodFactory {Food makeFood(String name);
}
public class ChineseFoodFactory implements FoodFactory {@Overridepublic Food makeFood(String name) {if (name.equals("A")) {return new ChineseFoodA();} else if (name.equals("B")) {return new ChineseFoodB();} else {return null;}}
}
public class AmericanFoodFactory implements FoodFactory {@Overridepublic Food makeFood(String name) {if (name.equals("A")) {return new AmericanFoodA();} else if (name.equals("B")) {return new AmericanFoodB();} else {return null;}}
}

其中,ChineseFoodA、ChineseFoodB、AmericanFoodA、AmericanFoodB 都派生自 Food。

客戶端調(diào)用:

public class APP {public static void main(String[] args) {// 先選擇一個(gè)具體的工廠FoodFactory factory = new ChineseFoodFactory();// 由第一步的工廠產(chǎn)生具體的對(duì)象,不同的工廠造出不一樣的對(duì)象Food food = factory.makeFood("A");}
}

雖然都是調(diào)用 makeFood(“A”) 制作 A 類食物,但是,不同的工廠生產(chǎn)出來(lái)的完全不一樣。

第一步,我們需要選取合適的工廠,然后第二步基本上和簡(jiǎn)單工廠一樣。

核心在于,我們需要在第一步選好我們需要的工廠。比如,我們有 LogFactory 接口,實(shí)現(xiàn)類有 FileLogFactory 和 KafkaLogFactory,分別對(duì)應(yīng)將日志寫(xiě)入文件和寫(xiě)入 Kafka 中,顯然,我們客戶端第一步就需要決定到底要實(shí)例化 FileLogFactory 還是 KafkaLogFactory,這將決定之后的所有的操作。

抽象工廠模式

當(dāng)涉及到產(chǎn)品族的時(shí)候,就需要引入抽象工廠模式了。 一個(gè)經(jīng)典的例子是造一臺(tái)電腦 。

當(dāng)涉及到這種產(chǎn)品族的問(wèn)題的時(shí)候,就需要抽象工廠模式來(lái)支持了。我們不再定義 CPU 工廠、主板工廠、硬盤(pán)工廠、顯示屏工廠等等,我們直接定義電腦工廠,每個(gè)電腦工廠負(fù)責(zé)生產(chǎn)所有的設(shè)備,這樣能保證肯定不存在兼容問(wèn)題。

當(dāng)然,抽象工廠的問(wèn)題也是顯而易見(jiàn)的,比如我們要加個(gè)顯示器,就需要修改所有的工廠,給所有的工廠都加上制造顯示器的方法。這有點(diǎn)違反了對(duì)修改關(guān)閉,對(duì)擴(kuò)展開(kāi)放這個(gè)設(shè)計(jì)原則。

本節(jié)要介紹的抽象工廠模式將考慮多等級(jí)產(chǎn)品的生產(chǎn),將同一個(gè)具體工廠所生產(chǎn)的位于不同等級(jí)的一組產(chǎn)品稱為一個(gè)產(chǎn)品族,圖 1 所示的是海爾工廠和 TCL 工廠所生產(chǎn)的電視機(jī)與空調(diào)對(duì)應(yīng)的關(guān)系圖。

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-tXbTibvX-1691644382209)(images/3-1Q1141559151S.gif)]

抽象工廠(AbstractFactory)模式的定義:是一種為訪問(wèn)類提供一個(gè)創(chuàng)建一組相關(guān)或相互依賴對(duì)象的接口,且訪問(wèn)類無(wú)須指定所要產(chǎn)品的具體類就能得到同族的不同等級(jí)的產(chǎn)品的模式結(jié)構(gòu)。

抽象工廠模式是工廠方法模式的升級(jí)版本,工廠方法模式只生產(chǎn)一個(gè)等級(jí)的產(chǎn)品,而抽象工廠模式可生產(chǎn)多個(gè)等級(jí)的產(chǎn)品。

使用抽象工廠模式一般要滿足以下條件。

  • 系統(tǒng)中有多個(gè)產(chǎn)品族,每個(gè)具體工廠創(chuàng)建同一族但屬于不同等級(jí)結(jié)構(gòu)的產(chǎn)品。
  • 系統(tǒng)一次只可能消費(fèi)其中某一族產(chǎn)品,即同族的產(chǎn)品一起使用。

抽象工廠模式除了具有工廠方法模式的優(yōu)點(diǎn)外,其他主要優(yōu)點(diǎn)如下。

  • 可以在類的內(nèi)部對(duì)產(chǎn)品族中相關(guān)聯(lián)的多等級(jí)產(chǎn)品共同管理,而不必專門(mén)引入多個(gè)新的類來(lái)進(jìn)行管理。
  • 當(dāng)增加一個(gè)新的產(chǎn)品族時(shí)不需要修改原代碼,滿足開(kāi)閉原則。

其缺點(diǎn)是:當(dāng)產(chǎn)品族中需要增加一個(gè)新的產(chǎn)品時(shí),所有的工廠類都需要進(jìn)行修改。

單例模式

簡(jiǎn)單點(diǎn)說(shuō),就是一個(gè)應(yīng)用程序中,某個(gè)類的實(shí)例對(duì)象只有一個(gè),你沒(méi)有辦法去new,因?yàn)闃?gòu)造器是被private修飾的,一般通過(guò)getInstance()的方法來(lái)獲取它們的實(shí)例。

getInstance()的返回值是一個(gè)對(duì)象的引用,并不是一個(gè)新的實(shí)例,所以不要錯(cuò)誤的理解成多個(gè)對(duì)象。

特點(diǎn)

  • 類構(gòu)造器私有
  • 持有自己類型的屬性
  • 對(duì)外提供獲取實(shí)例的靜態(tài)方法

餓漢式寫(xiě)法

public class Singleton {  private static Singleton instance = new Singleton();  private Singleton (){}  public static Singleton getInstance() {  return instance;  }  
}

弊端:因?yàn)轭惣虞d的時(shí)候就會(huì)創(chuàng)建對(duì)象,所以有的時(shí)候還不需要使用對(duì)象,就會(huì)創(chuàng)建對(duì)象,造成內(nèi)存的浪費(fèi);

飽漢模式最容易出錯(cuò):

public class Singleton {// 首先,也是先堵死 new Singleton() 這條路private Singleton() {}// 和餓漢模式相比,這邊不需要先實(shí)例化出來(lái),注意這里的 volatile,它是必須的private static volatile Singleton instance = null;public static Singleton getInstance() {if (instance == null) {// 加鎖synchronized (Singleton.class) {// 這一次判斷也是必須的,不然會(huì)有并發(fā)問(wèn)題if (instance == null) {instance = new Singleton();}}}return instance;}
}

雙重檢查,指的是兩次檢查 instance 是否為 null。

volatile 在這里是需要的,希望能引起讀者的關(guān)注。

很多人不知道怎么寫(xiě),直接就在 getInstance() 方法簽名上加上 synchronized,這就不多說(shuō)了,性能太差。

嵌套類最經(jīng)典,以后大家就用它吧:

public class Singleton {private Singleton() {}// 主要是使用了 嵌套類可以訪問(wèn)外部類的靜態(tài)屬性和靜態(tài)方法 的特性private static class Holder {private static Singleton instance = new Singleton();}public static Singleton getInstance() {return Holder.instance;}
}

注意,很多人都會(huì)把這個(gè)嵌套類說(shuō)成是靜態(tài)內(nèi)部類,嚴(yán)格地說(shuō),內(nèi)部類和嵌套類是不一樣的,它們能訪問(wèn)的外部類權(quán)限也是不一樣的。

最后,我們說(shuō)一下枚舉,枚舉很特殊,它在類加載的時(shí)候會(huì)初始化里面的所有的實(shí)例,而且 JVM 保證了它們不會(huì)再被實(shí)例化,所以它天生就是單例的。

TODO:

建造者模式

原型模式

結(jié)構(gòu)型模式

前面創(chuàng)建型模式介紹了創(chuàng)建對(duì)象的一些設(shè)計(jì)模式,這節(jié)介紹的結(jié)構(gòu)型模式旨在通過(guò)改變代碼結(jié)構(gòu)來(lái)達(dá)到解耦的目的,使得我們的代碼容易維護(hù)和擴(kuò)展。

代理模式

第一個(gè)要介紹的代理模式是最常使用的模式之一了,用一個(gè)代理來(lái)隱藏具體實(shí)現(xiàn)類的實(shí)現(xiàn)細(xì)節(jié),通常還用于在真實(shí)的實(shí)現(xiàn)的前后添加一部分邏輯。

既然說(shuō)是代理,那就要對(duì)客戶端隱藏真實(shí)實(shí)現(xiàn),由代理來(lái)負(fù)責(zé)客戶端的所有請(qǐng)求。當(dāng)然,代理只是個(gè)代理,它不會(huì)完成實(shí)際的業(yè)務(wù)邏輯,而是一層皮而已,但是對(duì)于客戶端來(lái)說(shuō),它必須表現(xiàn)得就是客戶端需要的真實(shí)實(shí)現(xiàn)。

理解代理這個(gè)詞,這個(gè)模式其實(shí)就簡(jiǎn)單了。 下面上代碼理解。 代理接口:

//要有一個(gè)代理接口讓實(shí)現(xiàn)類和代理實(shí)現(xiàn)類來(lái)實(shí)現(xiàn)。
public interface FoodService {Food makeChicken();
}

被代理的實(shí)現(xiàn)類:

public class FoodServiceImpl implements FoodService {@Overridepublic Food makeChicken() {Food f = new Chicken();f.setChicken("1kg");f.setSpicy("1g");f.setSalt("3g");System.out.println("雞肉加好佐料了");return f;}
}

被代理實(shí)現(xiàn)類就只需要做自己該做的事情就好了,不需要管別的。

代理實(shí)現(xiàn)類:

public class FoodServiceProxy implements FoodService {// 內(nèi)部一定要有一個(gè)真實(shí)的實(shí)現(xiàn)類,當(dāng)然也可以通過(guò)構(gòu)造方法注入private FoodService foodService = new FoodServiceImpl();@Overridepublic Food makeChicken() {System.out.println("開(kāi)始制作雞肉");// 如果我們定義這句為核心代碼的話,那么,核心代碼是真實(shí)實(shí)現(xiàn)類做的,// 代理只是在核心代碼前后做些“無(wú)足輕重”的事情Food food = foodService.makeChicken();System.out.println("雞肉制作完成啦,加點(diǎn)胡椒粉");food.addCondiment("pepper");System.out.println("上鍋咯");return food;}
}

客戶端調(diào)用,注意,我們要用代理來(lái)實(shí)例化接口:

// 這里用代理類來(lái)實(shí)例化
FoodService foodService = new FoodServiceProxy();
foodService.makeChicken();

所謂代理模式,就是對(duì)被代理方法包裝或者叫增強(qiáng), 在面向切面編程(AOP)中,其實(shí)就是動(dòng)態(tài)代理的過(guò)程。比如 Spring 中,我們自己不定義代理類,但是 Spring 會(huì)幫我們動(dòng)態(tài)來(lái)定義代理,然后把我們定義在 @Before、@After、@Around 中的代碼邏輯動(dòng)態(tài)添加到代理中。

待續(xù)。。。

行為型模式

模板模式

在含有繼承結(jié)構(gòu)的代碼中,模板方法模式是非常常用的。

父類定義了骨架(調(diào)用哪些方法及順序),某些特定方法由子類實(shí)現(xiàn)

模板方法只負(fù)責(zé)定義第一步應(yīng)該要做什么,第二步應(yīng)該做什么,第三步應(yīng)該做什么,至于怎么做,由子類來(lái)實(shí)現(xiàn)。

好處:代碼復(fù)用,減少重復(fù)代碼。除了子類要實(shí)現(xiàn)的特定方法,其他方法及方法調(diào)用順序都在父類中預(yù)先寫(xiě)好

缺點(diǎn): 每一個(gè)不同的實(shí)現(xiàn)都需要一個(gè)子類來(lái)實(shí)現(xiàn),導(dǎo)致類個(gè)數(shù)增加,使系統(tǒng)更加龐大

模板模式的關(guān)鍵點(diǎn):

1、使用抽象類定義模板類,并在其中定義所有的基本方法、模板方法,鉤子方法,不限數(shù)量,以實(shí)現(xiàn)功能邏輯為主。其中基本方法使用final修飾,其中要調(diào)用基本方法和鉤子方法,基本方法和鉤子方法可以使用protected修飾,表明可被子類修改。

2、定義實(shí)現(xiàn)抽象類的子類,重寫(xiě)其中的模板方法,甚至鉤子方法,完善具體的邏輯。

使用場(chǎng)景:

1、在多個(gè)子類中擁有相同的方法,而且邏輯相同時(shí),可以將這些方法抽出來(lái)放到一個(gè)模板抽象類中。

2、程序主框架相同,細(xì)節(jié)不同的情況下,也可以使用模板方法。

架構(gòu)方法介紹

模板方法使得子類可以在不改變算法結(jié)構(gòu)的情況下,重新定義算法中的某些步驟。其主要分為兩大類:模版方法和基本方法,而基本方法又分為:抽象方法(Abstract Method),具體方法(Concrete Method),鉤子方法(Hook Method)。

四種方法的基本定義(前提:在抽象類中定義):

(1)抽象方法:由抽象類聲明,由具體子類實(shí)現(xiàn),并以abstract關(guān)鍵字進(jìn)行標(biāo)識(shí)。

(2)具體方法:由抽象類聲明并且實(shí)現(xiàn),子類并不實(shí)現(xiàn)或者做覆蓋操作。其實(shí)質(zhì)就是普遍適用的方法,不需要子類來(lái)實(shí)現(xiàn)。

(3)鉤子方法:由抽象類聲明并且實(shí)現(xiàn),子類也可以選擇加以擴(kuò)展。通常抽象類會(huì)給出一個(gè)空的鉤子方法,也就是沒(méi)有實(shí)現(xiàn)的擴(kuò)展。它和具體方法在代碼上沒(méi)有區(qū)別,不過(guò)是一種意識(shí)的區(qū)別;而它和抽象方法有時(shí)候也是沒(méi)有區(qū)別的,就是在子類都需要將其實(shí)現(xiàn)的時(shí)候。而不同的是抽象方法必須實(shí)現(xiàn),而鉤子方法可以不實(shí)現(xiàn)。也就是說(shuō)鉤子方法為你在實(shí)現(xiàn)某一個(gè)抽象類的時(shí)候提供了可選項(xiàng),相當(dāng)于預(yù)先提供了一個(gè)默認(rèn)配置。

(4)模板方法:定義了一個(gè)方法,其中定義了整個(gè)邏輯的基本骨架。

public abstract class AbstractTemplate {// 這就是模板方法public void templateMethod() {init();apply(); // 這個(gè)是重點(diǎn)end(); // 可以作為鉤子方法}//這是具體方法protected void init() {System.out.println("init 抽象層已經(jīng)實(shí)現(xiàn),子類也可以選擇覆寫(xiě)");}// 這是抽象方法,留給子類實(shí)現(xiàn)protected abstract void apply();//這是鉤子方法,可定義一個(gè)默認(rèn)操作,或者為空protected void end() {}
}
http://www.risenshineclean.com/news/47065.html

相關(guān)文章:

  • 南京網(wǎng)站開(kāi)發(fā)注冊(cè)app國(guó)外直播平臺(tái)tiktok
  • 網(wǎng)站廣告費(fèi)一般多少錢(qián)網(wǎng)頁(yè)生成app
  • 在本地用dedecms做好的網(wǎng)站如何上傳到服務(wù)器?外貿(mào)網(wǎng)站平臺(tái)都有哪些
  • 六安網(wǎng)站建設(shè)企業(yè)seo優(yōu)化系統(tǒng)
  • 全景網(wǎng)站如何建設(shè)站長(zhǎng)之家
  • 藍(lán)韻官方網(wǎng)站海外aso優(yōu)化
  • php自適應(yīng)網(wǎng)站最近發(fā)生的新聞
  • 網(wǎng)站建設(shè)知識(shí)百度官方網(wǎng)站下載安裝
  • 做除塵環(huán)保的如何推廣自己的網(wǎng)站seo收錄查詢工具
  • 2022年最新血糖標(biāo)準(zhǔn)權(quán)威發(fā)布徐州seo外包
  • 上海平臺(tái)網(wǎng)站制作公司新東方在線網(wǎng)上課程
  • 找做網(wǎng)站的朋友短視頻營(yíng)銷成功的案例
  • 網(wǎng)站正在建設(shè)中 html企業(yè)培訓(xùn)有哪些方面
  • 企業(yè)加盟網(wǎng)站建設(shè)百家號(hào)權(quán)重查詢站長(zhǎng)工具
  • 哈爾濱網(wǎng)站備案手續(xù)費(fèi)廣告聯(lián)盟官網(wǎng)
  • web前端設(shè)計(jì)模板seo優(yōu)化師是什么
  • 郴州建網(wǎng)站百度熱搜seo
  • 哪里網(wǎng)站開(kāi)發(fā)好國(guó)產(chǎn)免費(fèi)crm系統(tǒng)有哪些在線
  • 騰訊云動(dòng)態(tài)加速WordPress網(wǎng)站頁(yè)面怎么優(yōu)化
  • 裝修設(shè)計(jì)網(wǎng)站哪個(gè)好前端性能優(yōu)化有哪些方法
  • 網(wǎng)站建設(shè)教程模板網(wǎng)站排名seo軟件
  • 仿 wordpress簡(jiǎn)述seo的應(yīng)用范圍
  • 電腦關(guān)鍵字被限制 購(gòu)物網(wǎng)站明星百度指數(shù)在線查詢
  • 動(dòng)漫主題WordPressseo服務(wù)運(yùn)用什么技術(shù)
  • 電子商務(wù)網(wǎng)站開(kāi)發(fā)實(shí)戰(zhàn)長(zhǎng)春seo排名扣費(fèi)
  • 網(wǎng)站目錄文件查看在線一鍵免費(fèi)生成網(wǎng)頁(yè)網(wǎng)站
  • 自己的電腦做網(wǎng)站服務(wù)器嗎北京網(wǎng)站建設(shè)制作開(kāi)發(fā)
  • 食品公司名字大全上海網(wǎng)站seo
  • vs做動(dòng)態(tài)網(wǎng)站登錄青島百度快速排名優(yōu)化
  • 西安做網(wǎng)站推廣營(yíng)銷型網(wǎng)站建設(shè)方案