1. 程式人生 > >從王者榮耀談設計模式​

從王者榮耀談設計模式​

軟體開發中涉及到的設計模式很多,這裡重點討論工作中常見的一些設計模式,圍繞王者榮耀中的場景進行展開。 1:策略模式 策略模式demo <?php //1:抽象策略介面:王者榮耀 abstract class kingGlory{     abstract function showTime(); } //2:具體策略角色 //魯班 class luban extends kingGlory{     public function showTime(){          echo  '猥瑣發育,躲坦克後面';     } } //王昭君 class wangzhaojun extends kingGlory{ public function showTime(){
         echo '冰杖一技能減速,二技能冰住人才開大';     } } //東皇太一 class dragon extends kingGlory{ public function showTime(){          echo '保護射手,把大留給對方刺客';     } } //小喬 class xiaoqiao extends kingGlory{ public function showTime(){          echo '二技能沒讓對方起飛,不隨便開大入場';     } } //以後再上新什麼角色,在這裡擴充套件方法就好。 //3:環境角色:王者峽谷 class canyonKingGlory{
    private $canyonKingGlory;     //獲取具體策略     public function getKingGlory($hero){         try{             $strategyReflection = new ReflectionClass($hero);             $this->canyonKingGlory = $strategyReflection->newInstance();         }catch(Exception $e){             throw $e;         }       
    }     function showTime(){         $this->canyonKingGlory->showTime();     } } try{     $hero = empty($_GET['hero']) ? '' : trim($_GET['hero']);     $canyonKingGlory = new canyonKingGlory();     $canyonKingGlory->getKingGlory($hero);     $canyonKingGlory->showTime(); }catch(Exception $e){     print_r($e->getMessage()); } ?> 策略模式組成
  • 抽象策略角色: 策略類,通常由一個介面或者抽象類實現。
  • 具體策略角色:包裝了相關的演算法和行為。
  • 環境角色:持有一個策略類的引用,最終給客戶端呼叫。
一句話理解 你輸入的引數最後被程式new 成了物件。如:localhost/kingGlory?hero=luban   程式new luban。 策略模式應用 見和工廠模式pk的應用 2:工廠模式 工廠模式demo <?php //1:王者榮耀 abstract class kingGlory{     abstract function showTime();  //擊敗藍buff     public function killBlueBuff(){         echo '減cd';     }     //擊敗主宰     public function killDominate(){         echo '加攻擊力;派出小龍';     } } //魯班 class luban extends kingGlory{     public function showTime(){          echo  '猥瑣發育,躲坦克後面';     }     public function secondSkill(){         $ability = $this->killDominate();//等等     } } //王昭君 class wangzhaojun extends kingGlory{     public function showTime(){          echo '冰杖一技能減速,二技能冰住人才開大';     } } //王者峽谷 class canyonKingGlory{     private $canyonKingGlory;     public function __call($name, $args) {         $this->canyonKingGlory->$name();     }     //獲取具體策略     public function getKingGlory($hero){         try{             $strategyReflection = new ReflectionClass($hero);             $this->canyonKingGlory = $strategyReflection->newInstance();         }catch(Exception $e){             throw $e;         }            } } try{     $hero = empty($_GET['hero']) ? '' : trim($_GET['hero']);     $canyonKingGlory = new canyonKingGlory();     $canyonKingGlory->getKingGlory($hero);     $canyonKingGlory->secondSkill(); }catch(Exception $e){     print_r($e->getMessage()); } ?> 一句話理解 你在框架基類定義了很多公共方法,給大家繼承使用。 工廠模式pk策略模式 這兩個模式很相似,見上面demo就會有感覺。而且兩個模式通常會巢狀在一起使用! 工廠模式:你在框架基類定義了很多公共方法,給大家繼承使用。 策略模式:你在框架寫了很多繼承框架基類的業務程式碼。 工廠模式pk策略模式應用場景 在王者峽谷,新來的英雄繼承峽谷規則:閃現可以穿牆,拿藍bug減cd , 搶龍有金幣經驗等...(這就是工廠模式) 新英雄是隱身,是飛天,是同歸於盡,是死後重生...可以自由發揮設計...新加一個類就行,而不是switch  case 一個個加。(這就是策略模式) 程式碼中,一次請求開始要進行 ip檢查,登入檢查,xss注入轉義,日誌埋點...這就是工廠模式 開發業務的同學在業務程式碼裡搞物流,搞裝修,搞外賣,搞海淘...這就是策略模式 3:介面卡模式 介面卡demo <?php     //王者榮耀行為基類     abstract class kingGloryAct{         //過草叢         public abstract function grassBushes();         //過草叢公共方法         public function grassBushesCommom(){             return '過草叢隱身';         }     }     //魯班     class luban extends kingGloryAct{         public function grassBushes(){             $effect[] = $this->grassBushesCommom();             return $effect;         }     }     //東皇太一 ;之前有bug 暴露它的球球     class dragon extends kingGloryAct{         public function grassBushes(){             $effect[] = $this->grassBushesCommom();             $effect[] = '暴露球球';             return $effect;         }     }     //成吉思汗     class erha extends kingGloryAct{         public function grassBushes(){             $effect[] = $this->grassBushesCommom();             $effect[] = '加速';             return $effect;         }     }     echo '<pre/>';     $luban = new luban;     print_r($luban->grassBushes());     $dragon = new dragon;     print_r($dragon->grassBushes());     $erha = new erha;     print_r($erha->grassBushes()); ?> 注意:程式碼這樣寫肯定不簡潔,應該結合策略模式寫。這裡為了便於理解就這樣寫了。 介面卡精髓 利用繼承,暴露相同介面。 介面卡應用 電源適配,usb適配 典型專案:openapi;微信登入 php,java,C,.net 對接.... 4:單例模式 單例模式demo class singleton{     //1:建立靜態私有的變數儲存該類物件     static private $instance;     public $config;     //2:一個類在一次請求中只能有一個物件 :私有防止被直接例項化;     private function __construct( $config ){         $this->config = $config;     }     //3:該類提供靜態的公有的函式用於建立或獲取它本身的靜態私有物件。     public static function getInstance($config){         //判斷$instance是否是singleton的物件  沒有則建立         if (!self::$instance instanceof self) {             self::$instance = new self($config);          }         return self::$instance;     }     //4:防止克隆物件     private function __clone(){     }     public function getConfig(){         print_r($this->config);     } } //單例,一次請求只會例項化一次。 $singleton = singleton::getInstance( '妲己' );// 妲己 $singleton->getConfig(); $singleton = singleton::getInstance(  '小喬'  );// 妲己 $singleton->getConfig(); 單例模式組成(三私一公)
  • 私有的靜態屬性 (儲存類的例項)
  • 私有的構造方法 (防止類外例項化)
  • 私有的克隆方法 (防止通過克隆生成物件)
  • 公有的靜態方法 (調取這個類相當一個介面 )
單例模式精髓 類只被new一次 單例模式應用 搜尋了很多系統程式碼,只有在資料庫連線時有用到。個人覺得原因如下: 1:資料庫連線消耗資源,一次請求建立多次連線,資料庫扛不住。單例模式可以做到一次請求只會對資料庫建立一次連線,而不是多次。這樣不容易出現 too many connections情況。 2:單例模式 三私一公 寫法相對麻煩,除了資料庫連線外,效果不明顯。 5:外觀模式 外觀模式應用 優秀文章:外觀模式(簡單,不寫了) 外觀模式精髓 一個方法集成了多個動作。 外觀模式應用 妲己蹲草叢,呼叫二技能,大招,一技能收割。就可以封裝個妲己蹲草叢的方法。 刪除商戶,需要刪除店鋪,刪除菜品,刪除點評(邏輯刪除)。就需要封裝刪除商戶的方法。 6:其他 這些設計模式都是圍繞設計原則展開: 開閉原則:對拓展開放,對修改關閉。即:儘量在不修改原有程式碼的情況下進行拓展。(策略模式就是典型) 單一職責原則:一個類只負責一個功能領域中相應的職責。(單例模式就是典型)