国产亚洲精品福利在线无卡一,国产精久久一区二区三区,亚洲精品无码国模,精品久久久久久无码专区不卡

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

手機(jī)html5網(wǎng)站源碼廣告投放的方式有哪些

手機(jī)html5網(wǎng)站源碼,廣告投放的方式有哪些,沈陽建設(shè)局網(wǎng)站,不同端口裝 wordpress概述 在實際項目中,我們有時會遇到需要創(chuàng)建復(fù)雜對象的情況。這些對象可能包含多個組件或?qū)傩?amp;#xff0c;而且每個組件都有自己的配置選項。如果直接使用構(gòu)造函數(shù)或前面介紹的工廠方法來創(chuàng)建這樣的對象,可能會導(dǎo)致以下兩個嚴(yán)重問題。 1、參數(shù)過多。當(dāng)一個…

概述

????????在實際項目中,我們有時會遇到需要創(chuàng)建復(fù)雜對象的情況。這些對象可能包含多個組件或?qū)傩?#xff0c;而且每個組件都有自己的配置選項。如果直接使用構(gòu)造函數(shù)或前面介紹的工廠方法來創(chuàng)建這樣的對象,可能會導(dǎo)致以下兩個嚴(yán)重問題。

????????1、參數(shù)過多。當(dāng)一個類有很多可選參數(shù)時,構(gòu)造函數(shù)可能會變得非常龐大,難以維護(hù)。此外,調(diào)用方必須記住哪些參數(shù)是必需的,哪些是可選的,這在一定程度上增加了出錯的風(fēng)險。

????????2、代碼冗余。如果每次創(chuàng)建對象都需要傳遞大量的參數(shù),那么代碼將會變得冗長、復(fù)雜且難以理解。即使有些參數(shù)有默認(rèn)值,調(diào)用者仍然需要為所有參數(shù)提供值。

????????相比之下,建造者模式提供了更好的解決方案。它通過引入一個專門的建造者類來逐步構(gòu)建對象,直到所有的必要部分都被設(shè)置完畢。這樣不僅可以簡化對象的創(chuàng)建過程,還可以提高代碼的可讀性和可維護(hù)性。

????????餐廳點(diǎn)餐是運(yùn)用建造者模式的一個典型例子:菜單上有多種套餐組合,但每個套餐的具體內(nèi)容可能不同;服務(wù)員會根據(jù)我們的選擇,逐步記錄下我們想要的食物和飲料,最后再把這些信息傳遞給廚房。在這個過程中,服務(wù)員扮演了“導(dǎo)演”的角色,而每道菜的廚師則是具體的“建造者”,他們負(fù)責(zé)按照訂單的要求制作食物。

基本原理

????????建造者模式的核心思想是:將一個復(fù)雜對象的構(gòu)建過程與其表示分離,從而使得同樣的構(gòu)建過程可以創(chuàng)建不同的表示。它提供了一種分步驟構(gòu)造復(fù)雜對象的方法,避免了大型構(gòu)造函數(shù)帶來的問題,并且提高了代碼的可讀性和可維護(hù)性。建造者模式包括如下四個核心組件。

????????1、產(chǎn)品類。代表要創(chuàng)建的復(fù)雜對象,它可以是一個具體的產(chǎn)品實例,也可以是一系列相關(guān)屬性的集合。產(chǎn)品類通常包含多個組成部分,每個部分都有自己的配置選項。

????????2、抽象建造者。定義了創(chuàng)建產(chǎn)品各個部分的接口,它是所有具體建造者的基類或接口,聲明了一系列用于組裝產(chǎn)品的抽象方法。這些方法定義了如何構(gòu)建產(chǎn)品的不同部分,但不涉及具體的實現(xiàn)邏輯。

????????3、具體建造者。實現(xiàn)了抽象建造者接口,提供了構(gòu)建產(chǎn)品的具體實現(xiàn)。每個具體建造者都對應(yīng)一種特定的產(chǎn)品配置或類型,負(fù)責(zé)按照預(yù)定規(guī)則組裝出完整的產(chǎn)品。通常情況下,具體建造者還會提供一個類似GetResult的方法來獲取最終構(gòu)建的產(chǎn)品對象。

????????4、導(dǎo)演類。導(dǎo)演類負(fù)責(zé)協(xié)調(diào)各個具體建造者的執(zhí)行順序,它不直接參與產(chǎn)品的構(gòu)建,而是調(diào)用建造者的方法來組織構(gòu)建過程。它可以根據(jù)不同的需求選擇合適的建造者,并控制構(gòu)建的流程。

????????基于上面的核心組件,建造者模式的實現(xiàn)主要有以下五個步驟。

????????1、定義產(chǎn)品類。創(chuàng)建一個代表最終產(chǎn)品的類,它包含了所有與產(chǎn)品相關(guān)的屬性。

????????2、定義抽象建造者。定義一個接口或抽象類,聲明一組用于構(gòu)建產(chǎn)品的方法。這些方法定義了如何設(shè)置產(chǎn)品的各個部分,但不涉及具體的實現(xiàn)細(xì)節(jié)。

????????3、實現(xiàn)具體建造者。根據(jù)需要創(chuàng)建多個具體建造者類,每個類都實現(xiàn)了抽象建造者接口。每個具體建造者負(fù)責(zé)按照特定的規(guī)則,組裝出完整的產(chǎn)品,并提供GetResult方法來返回最終構(gòu)建的產(chǎn)品對象。

????????4、創(chuàng)建導(dǎo)演類。定義一個導(dǎo)演類,它負(fù)責(zé)調(diào)用具體建造者的方法來組織構(gòu)建過程。導(dǎo)演類不直接參與產(chǎn)品的構(gòu)建,而是充當(dāng)協(xié)調(diào)者的角色,確保構(gòu)建過程按照預(yù)期進(jìn)行。

????????5、編寫應(yīng)用層代碼。在應(yīng)用層代碼中,首先選擇合適的具體建造者并將其傳遞給導(dǎo)演類。導(dǎo)演類會根據(jù)預(yù)設(shè)的構(gòu)建流程調(diào)用建造者的方法,逐步構(gòu)建出最終的產(chǎn)品對象。最后,應(yīng)用層可以從建造者那里獲取到完全配置好的產(chǎn)品實例。

實戰(zhàn)解析

????????在下面的實戰(zhàn)代碼中,我們使用建造者模式模擬了餐廳點(diǎn)餐的應(yīng)用場景。

????????首先,我們定義了產(chǎn)品類COrder。COrder類代表最終的訂單對象,它包含了主菜、飲料、甜點(diǎn)以及額外添加的項目。

????????然后,我們定義了抽象建造者COrderBuilder。COrderBuilder是一個接口或抽象類,聲明了一系列用于設(shè)置訂單各個部分的方法。每個具體建造者都將實現(xiàn)這些方法,以按照特定規(guī)則組裝出完整的訂單。

????????接下來,我們實現(xiàn)了具體建造者CStandardMealBuilder和CVegetarianMealBuilder,分別表示創(chuàng)建標(biāo)準(zhǔn)套餐和素食套餐。每個具體建造者都實現(xiàn)了COrderBuilder接口,并提供了構(gòu)建特定類型訂單的具體邏輯。

????????我們還創(chuàng)建了導(dǎo)演類CWaiter,它負(fù)責(zé)協(xié)調(diào)各個建造者的執(zhí)行順序。它不直接參與訂單的構(gòu)建,而是調(diào)用建造者的方法來組織構(gòu)建過程,這樣可以確保構(gòu)建過程的一致性和靈活性。

????????最后,在main函數(shù)中,我們首先選擇了CStandardMealBuilder來構(gòu)建一個標(biāo)準(zhǔn)套餐,并通過CWaiter類來指導(dǎo)構(gòu)建過程。緊接著,我們選擇了CVegetarianMealBuilder來構(gòu)建一個素食套餐。最后,我們打印了兩個訂單的具體內(nèi)容,并進(jìn)行了清理工作。

#include <iostream>
#include <string>
#include <vector>using namespace std;// 定義產(chǎn)品類:訂單對象
class COrder
{
public:void SetMainDish(const string& strDish){m_strMainDish = strDish;}void SetDrink(const string& strDrink){m_strDrink = strDrink; }void SetDessert(const string& strDessert){m_strDessert = strDessert;}void AddExtra(const string& strExtra){m_vctExtras.push_back(strExtra);}void Print() const{cout << "Your order contains: " << endl;if (!m_strMainDish.empty()){cout << "Main dish: " << m_strMainDish << endl;}if (!m_strDrink.empty()){cout << "Drink: " << m_strDrink << endl;}if (!m_strDessert.empty()){cout << "Dessert: " << m_strDessert << endl;}if (!m_vctExtras.empty()){cout << "Extras: " << endl;for (const auto& extra : m_vctExtras){cout << "  " << extra << endl;}}}private:string m_strMainDish;               // 主菜string m_strDrink;                  // 飲料string m_strDessert;                // 甜點(diǎn)vector<string> m_vctExtras;         // 額外項
};// 定義抽象建造者
class COrderBuilder
{
public:COrderBuilder(){m_pOrder = new COrder();}virtual ~COrderBuilder() {}virtual void BuildMainDish() = 0;virtual void BuildDrink() = 0;virtual void BuildDessert() = 0;virtual void AddExtras() = 0;virtual COrder* GetResult(){return m_pOrder; }protected:COrder* m_pOrder;
};// 實現(xiàn)具體建造者:標(biāo)準(zhǔn)套餐建造者
class CStandardMealBuilder : public COrderBuilder
{
public:void BuildMainDish() override{m_pOrder->SetMainDish("Roast Chicken");}void BuildDrink() override{m_pOrder->SetDrink("Cola");}void BuildDessert() override{m_pOrder->SetDessert("Ice Cream");}void AddExtras() override{m_pOrder->AddExtra("Potato Fries");}
};// 實現(xiàn)具體建造者:素食套餐建造者
class CVegetarianMealBuilder : public COrderBuilder
{
public:void BuildMainDish() override{m_pOrder->SetMainDish("Vegetable Curry");}void BuildDrink() override{m_pOrder->SetDrink("Lemonade");}void BuildDessert() override{m_pOrder->SetDessert("Fruit Salad");}void AddExtras() override{m_pOrder->AddExtra("Breadsticks");}
};// 創(chuàng)建導(dǎo)演類:服務(wù)員
class CWaiter
{
public:void Construct(COrderBuilder* pBuilder){pBuilder->BuildMainDish();pBuilder->BuildDrink();pBuilder->BuildDessert();pBuilder->AddExtras();}
};int main()
{CWaiter waiter;// 選擇標(biāo)準(zhǔn)套餐COrderBuilder* pBuilder = new CStandardMealBuilder();waiter.Construct(pBuilder);COrder* pStandardOrder = pBuilder->GetResult();cout << "***** Standard Meal *****" << endl;pStandardOrder->Print();cout << endl;delete pBuilder;// 選擇素食套餐pBuilder = new CVegetarianMealBuilder();waiter.Construct(pBuilder);COrder* pVegetarianOrder = pBuilder->GetResult();cout << "***** Vegetarian Meal *****" << endl;pVegetarianOrder->Print();delete pBuilder;// 清理delete pStandardOrder;delete pVegetarianOrder;return 0;
}

總結(jié)

????????對于那些需要很多參數(shù)的對象創(chuàng)建,尤其是這些參數(shù)大多數(shù)是可選的時候,使用建造者模式可以讓代碼更加易讀、易于維護(hù)。相比長串的構(gòu)造函數(shù)參數(shù)列表,建造者模式提供了更自然的接口來逐步設(shè)定屬性。

????????但建造者模式也引入了額外的類(即具體的建造者),因此會稍微增加系統(tǒng)的復(fù)雜度和整體大小。對于簡單的對象創(chuàng)建,這種模式可能顯得過于繁瑣。如果要添加新的產(chǎn)品,就需要修改現(xiàn)有的建造者接口或創(chuàng)建新的建造者子類,這可能會影響現(xiàn)有代碼的穩(wěn)定性。另外,如果建造者負(fù)責(zé)多個不同類型的對象創(chuàng)建,可能會導(dǎo)致建造者類變得臃腫,承擔(dān)過多責(zé)任,從而違背了單一職責(zé)原則。

http://aloenet.com.cn/news/42740.html

相關(guān)文章:

  • 深圳網(wǎng)站建設(shè)培訓(xùn)班深圳最新通告今天
  • 技術(shù)支持:淄博網(wǎng)站建設(shè)優(yōu)化設(shè)計三年級上冊語文答案
  • 山東省建設(shè)工程招標(biāo)中心網(wǎng)站當(dāng)日網(wǎng)站收錄查詢統(tǒng)計
  • 網(wǎng)站建設(shè)需求分析寫什么茶葉seo網(wǎng)站推廣與優(yōu)化方案
  • 網(wǎng)站程序組成seo搜狗排名點(diǎn)擊
  • 辛集seo網(wǎng)站優(yōu)化電話靠譜的免費(fèi)建站
  • 建立手機(jī)個人網(wǎng)站營銷網(wǎng)站建設(shè)制作
  • 視頻資源的網(wǎng)站怎么做站長資訊
  • 網(wǎng)站建設(shè)課程設(shè)計內(nèi)容淘寶店鋪轉(zhuǎn)讓價格表
  • wordpress評論框文件采集站seo課程
  • 自己做網(wǎng)站外包百度熱搜高考大數(shù)據(jù)
  • 企業(yè)做網(wǎng)站需要什么軟件百度品牌廣告收費(fèi)標(biāo)準(zhǔn)
  • 網(wǎng)站制作預(yù)付款會計分錄小程序運(yùn)營推廣公司
  • 大慶網(wǎng)站制作營銷策劃方案包括哪些內(nèi)容
  • 在百度做網(wǎng)站多少錢網(wǎng)站推廣營銷
  • 網(wǎng)站站內(nèi)鏈接濰坊住房公積金管理中心
  • 設(shè)計網(wǎng)頁推薦萬秀服務(wù)不錯的seo推廣
  • 網(wǎng)站的功能和作用百度seo排名帝搜軟件
  • 寶雞哪有有做網(wǎng)站的專業(yè)網(wǎng)絡(luò)推廣公司
  • 網(wǎng)站開發(fā)的工作總結(jié)google搜索優(yōu)化方法
  • 怎么做賭博網(wǎng)站代理承德seo
  • html做網(wǎng)站實戰(zhàn)教程軟文寫作經(jīng)驗是什么
  • 余姚物流做網(wǎng)站鄭州本地seo顧問
  • 醫(yī)院網(wǎng)站建設(shè) 費(fèi)用百度認(rèn)證官網(wǎng)
  • 四川建設(shè)廳官方網(wǎng)站四庫一平臺網(wǎng)絡(luò)運(yùn)營商
  • 建設(shè)銀行手機(jī)查詢網(wǎng)站合肥seo優(yōu)化排名公司
  • 在北京大學(xué)生做家教的網(wǎng)站關(guān)鍵詞調(diào)詞平臺哪個好
  • 東莞電商頁面設(shè)計公司福州短視頻seo機(jī)會
  • 杭州網(wǎng)站建設(shè)wguser域名歸屬查詢
  • 優(yōu)秀網(wǎng)站頁面設(shè)計圖片蘭州模板網(wǎng)站seo價格