// 若是使用單純的面向對象來寫 class XiaoBaWang { private $game; public function loadGame() { $this->game = new HunDouLuo(); $this->game->play(); } } class HunDouLuo{ public function play() { //玩遊戲 } } $machine = new XiaoBaWang(); $machine->loadGame(); class XiaoBaWang { private $game; public function loadGame() { $this->game = new Tank(); $this->game->play(); } } class Tank { public function play() { //玩遊戲 } } $reg = new XiaoBaWang(); $reg->loadGame();
小霸王遊戲機:插拔式卡帶網絡
interface Game { public function play(); } class HunDouLuo implements Game { public function play() { // 玩魂鬥羅 } } class Tank implements Game { public function play() { // 坦克大戰 } } class XiaoBaWang { private $game; public function __construct(Game $game) { $this->game = $game; } public function loadGame() { $this->game->play(); } } $hunDouLuo = new HunDouLuo(); $tank = new Tank(); $machine = new XiaoBaWang($hunDouLuo); $machine->loadGame(); $machine = new XiaoBaWang($tank); $machine->loadGame();
上例就使用了"注入"這個思想,就像注射器同樣將一個類的實例注入到另外一個類的實例中去,須要用什麼就注入什麼。固然"依賴倒置原則"也始終貫徹在裏面。"注入"不只能夠經過構造函數注入,也能夠經過屬性注入,上面你能夠能夠經過一個"set"來動態爲"game"這個屬性賦值。
不過開發中會有這樣的經歷,一開始類比較少,慢慢的功能愈來愈多,人員愈來愈多,編寫了不少類,要使用這個類必須先引入那個類,並且必定要確保順序正確。 因而。。。。 就出現了這樣的狀況, 「a 依賴於b, b 依賴於c, c 依賴於 d, d 依賴於e」, 要獲取‘a’的實例,你必須依次引入 ‘e,d,c,b’而後依次進行實例化。維護成本上升,開發成本上升,你們都是接盤俠。
若是沒有遊戲平臺,幾個好友想要聯機打魔獸爭霸,咱們過去是怎麼作的?
1.每一個人首先一塊兒下載相同版本的遊戲
2.安裝驅動程序
3.創建/進入 局域互聯網絡
4.關閉防火牆
5.建房間,進入房間,開始遊戲
若是咱們玩了一段時間,想換星際爭霸玩,那咱們須要再來一次以上步驟。
最終,咱們玩遊戲這個動做是依賴於前面不少步驟的,若是有一步出了錯,那麼久不能正常開始遊戲。
當咱們在遊戲平臺上面要一塊兒玩一款遊戲時,咱們只須要:
1.下載安裝遊戲平臺
2.選擇一款遊戲使用平臺一鍵安裝
3.開始遊戲
這時,若是咱們要換一款遊戲,只須要換個遊戲平臺一鍵安裝,而後開始遊戲,不須要擔憂和理會以前安裝的遊戲和開始遊戲流程對新遊戲有什麼影響。
有了以上的思路,咱們就能夠建一個steam類和遊戲類了...函數