<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                4、組合模式   將對象組合成樹形結構表示“部分-整體”的層次結構。   特點:靈活性強   應用:對象的部分-整體的層次結構,模糊組合對象和簡單對象處理問題 代碼實現 <?php /** * 優才網公開課示例代碼 * * 組合模式 * *@author 優才網全棧工程師教研組 *@see http://www.ucai.cn */ //繼承模式 class UserBaseInfo { private$name; function__construct($name) { $this->name= $name; } public function getName() { return $this->name; } } class User extends UserBaseInfo { private$login = false; public function setLogin($islogin) { $this->login = $islogin; } public function isLogin() { return $this->login; } } $user = new User('張三'); $user->setLogin(true); if ($user->isLogin()) { echo$user->getName()."已經登錄了\n"; } else { echo$user->getName()."還沒有登錄\n"; } //組合模式 class LoginInfo { protected$user; protected$login = false; publicfunction setLogin($user, $isLogin) { $this->user= $user; $this->login= $isLogin; } publicfunction isLogin() { return$this->login; } } $user = new User('張三'); $login = new LoginInfo(); $login->setLogin($user, true); if ($login->isLogin()) { echo$user->getName()."已經登錄了\n"; } else { echo$user->getName()."還沒有登錄\n"; } //部分可以更換,用繼承則不行 class Admin { protected$level; function__construct($level) { $this->level= $level; } functiongetLevel() { return$this->level; } } $admin = new Admin(1); $login->setLogin($admin, true); if ($login->isLogin()) { printf("級別為 %d 的管理員已經登錄了\n",$admin->getLevel()); } else { printf("級別為 %d 的管理員還沒有登錄\n",$admin->getLevel()); } ?>   上面的例子分別展示了使用繼承和組合來處理新功能,在簡單的情況下看似區別不大,但在項目后期越來越復雜的時候組合模式的優勢就越來越明顯了。   例如上面的登錄信息,如果要增加登錄次數、最后登錄時間、登錄ip等信息,登錄本身就會變成一個比較復雜的對象。如果以后有新的需求比如好友信息、用戶的訪問信息等,再要繼承的話,用戶類就會變得非常龐大,難免各父類之間沒有沖突的變量和方法,而外部訪問用戶類的眾多方法也變得很費勁。采用組合模式后,一個類負責一個角色,功能區分非常明顯,擴展方便。 5、外觀模式(門面模式)   為了系統中的一組接口提供一個一致的界面   特點:向上抽取,有共性   應用:內部接口眾多,由統一的接口來調用 <?php /** * 優才網公開課示例代碼 * * 外觀模式,也叫門面模式 * *@author 優才網全棧工程師教研組 *@see http://www.ucai.cn */ class Operation { publicfunction testPlus() { printf("plus:%s\n",(1 + 2 == 3 ? 'true' : 'false')); } publicfunction testMinus() { printf("minus:%s\n", (3 - 2 == 2 ? 'true' : 'false')); } publicfunction testTimes() { printf("times:%s\n", (2 * 3 == 6 ? 'true' : 'false')); } } class Tester { protected$_operation; function__construct() { $this->_operation= newOperation(); } publicfunction testAll() { $this->_operation->testPlus(); $this->_operation->testMinus(); $this->_operation->testTimes(); } } //測試用例,測試全部接口 $tester = new Tester(); $tester->testAll(); ?>   門面模式估計大家在實際代碼中都已經使用到了,接口較多時把相似功能的接口封裝成一個接口供外部調用,這就是門面模式。 6、享元模式   運用共享技術有效地支持大量細粒度對象,采用一個共享來避免大量有相同內容對象的開銷。這種開銷中最直觀的就是內存的損耗。   特點:高效性,共享性   應用:系統底層的設計。例如字符串的創建。如果兩個字符串相同,則不會創建第二個字符串,而是第二個的引用直接指向第一個字符串。$str1=”abc”,$str2=”abc”.則內存存儲中只會創建一個字符串“abc”而引用$str1.$str2都會指向它。 7、代理模式   為其他對象提供一個代理來控制對這個對象的訪問,就是給某一對象提供代理對象,并由代理對象控制具體對象的引用。能夠協調調用者和被調用者,能夠在一定程度上降低系統的耦合性。   特點:低耦合性,獨立性好,安全性   應用:客戶訪問不到或者被訪問者希望隱藏自己,所以通過代理來訪問自己。 代碼實現 ~~~ <?php /** * 優才網公開課示例代碼 * * 代理模式 * *@author 優才網全棧工程師教研組 *@see http://www.ucai.cn */ //內部對象 class User { publicfunctiongetName() { return'張三'; } publicfunctiongetType() { return'付費用戶'; } } //代理接口定義,例如開放平臺 interface UserInterface { functiongetName(); } //代理對象 class UserProxy implements UserInterface { protected$_user; function__construct() { $this->_user= new User(); } publicfunctiongetName() { return$this->_user->getName(); } } //內部調用 $user = new User(); printf("user name:%s\n", $user->getName()); printf("user type:%s\n", $user->getType()); //外部調用 // $user = new UserProxy(); // printf("user name:%s\n", $user->getName()); // printf("user type:%s\n", $user->getType()); //不能訪問,及時知道內部對象有這個方法 ?> ~~~ 三、總結   代理模式、適配器模式、門面模式、裝飾模式的區別   相同之處:都封裝一個內部對象,調用內部對象的方法   不同之處:各自有各自的特性和應用場景,不能相互替代。所以用的時候要仔細分析用那種合適。 關于模式的選用問題   模式的選用要根據實際的業務需求,通過對業務邏輯的仔細分析,再根據模式具有的特性和應用場景進行合理的選擇和區分。大部分情況下業務的場景決定了哪種模式,而不是選擇哪個模式去實現一個業務,少數情況幾種模式確實都能解決問題,那主要就是考慮以后的擴展了。   到這里我們已經了解了7種結構型模式,下一篇我們繼續給大家介紹設計模式的行為型模式,先預覽一下行為型模式的種類吧: 模版方法模式 命令模式 迭代器模式 觀察者模式 終結者模式 備忘錄模式 解釋器模式 狀態模式 策略模式 職責鏈模式 訪問者模式
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看