Head First 设计模式: 第一课PHP版鸭子
刚刚看《Head First 设计模式》,第一章讲了一个故事: 设计师Joe设计了只鸭子,但董事会(难道不是执行经理管这事)要求每六个月改变产品; 于是乎什么飞鸭、烤鸭、机器鸭、橡胶鸭……乱七八招的都来了,而且你还不知道下次是什么变态要求! 怎么办? 关于编程的方法:继承多态都无用,因为下次的代码改动量太大,并且需要改动多处原有代码。 那么怎的办!? 呵呵,在这危机时刻(Joe面临炒鱿鱼的危险),设计模式推出了两条原则:
- 找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起。
- 针对接口编程,而不是针对实现编程。
最后奇迹出现,Joe大放异彩!
需要说的是虽然我的”唐诗宋词“插件也是使用类似于设计模式写的(以后加一个模块最少只要5行代码),但那时看的尚学堂的视频,一知半解,也就那样吧。这是我第一次看编程的书能看到这么晚,而且还把书中例子写成代码,此书可谓“头脑风暴”。~0~| 贴上PHP版的源码(看看CoolCode的极限 ^_^):
- < ?php
- /**
- * 飞行行为接口,
- * 只要是飞,都得找它
- */
- interface FlyBehavior {
- // 飞行行为
- function fly();
- } // END inter FlyBehavior
- /**
- * 叫行为接口,
- * 不管你是哭爹还是喊娘,还是得找它
- */
- interface QuackBehavior {
- // 叫行为
- function quack();
- } // END inter QuackBehavior
- /**
- * 随风而飞,燕雀怎知鸿鹄之志
- */
- class FlyWithWings implements FlyBehavior {
- /**
- * @see FlyBehavior::fly()
- *
- */
- function fly() {
- echo "FlyWithWngs<br />";
- }
- } // END class FlyWithWings
- /**
- * 根本不会飞,瘟鸡一只
- */
- class FlyNoWay implements FlyBehavior {
- /**
- * @see FlyBehavior::fly()
- *
- */
- function fly() {
- echo "FlyNoWay<br />";
- }
- } // END class FlyNoWay
- /**
- * 鸭子呱呱叫,癞蛤蟆想吃天鹅肉 [这里用TQuack代替Quack::PHP对大小写不敏感]
- */
- class TQuack implements QuackBehavior {
- /**
- * @see QuackBehavior::quack()
- *
- */
- function quack() {
- echo "Quack<br />";
- }
- } // END class Quack
- /**
- * 橡皮鸭吱吱叫,鼠辈横行
- */
- class Squeak implements QuackBehavior {
- /**
- * @see QuackBehavior::quack()
- *
- */
- function quack() {
- echo "Squeak<br />";
- }
- } // END class Squeak
- /**
- * 哑巴,多么想说话呀
- */
- class MuteQuack implements QuackBehavior {
- /**
- * @see QuackBehavior::quack()
- *
- */
- function quack() {
- echo "MuteQuack<br />";
- }
- } // END class MuteQuack
- /**
- * 鸭子类
- * 你一定要说鸳鸯也行,实在不行就搞个鸟类
- */
- class Duck {
- public $quackBehavior; //叫嚣接口变量
- public $flyBehavior; //飞翔接口变量
- /**
- * 构造函数
- * Shit! 竟然没事干
- */
- public function __construct() {
- }
- /**
- * 鸭子不出意外,天生就可以“游泳”
- */
- public function swim() {
- echo "<span style=\"color:red;\">Duck::I belive i can swim.<br />";
- } // END func swim
- /**
- * 爱美之心鸭皆有之 [原版这里是一个虚函数]
- */
- public function display() {
- echo "<span style=\"color:red;\">Duck::My dream is be a swan.<br />";
- } //END func display
- /**
- * 鸭子可叫乎?然异也
- *
- * @param QuackBehavior $quackBehavior
- */
- public function perfromQuack() {
- $this->quackBehavior->quack(); //“叫”就一个字
- } // END func perfromQuack
- /**
- * 超人鸭 是可以飞的
- *
- * @param FlyBehavior $flyBehavior
- */
- public function perfromFly() {
- $this->flyBehavior->fly(); //即使打飞机也要表现得很豪迈
- } //END func performFly
- /**
- * 设置飞行接口,于是从这一刻起飞机就变得多样化了
- */
- public function setFlyBehavior(FlyBehavior $fb) {
- $this->flyBehavior = $fb;
- } //END func setFlyBehavior
- /**
- * 设置叫接口类型,然后成就了“口技”
- */
- public function setQuackBehavior(QuackBehavior $qb) {
- $this->quackBehavior = $qb;
- } //END func setQuackBehavior
- } //END class Duck
- /**
- * 这是一只野鸭,
- * 野鸭总比家鸭好吃 ── 小心传染病(例如:非典、口蹄疫……)
- */
- class MallardDuck extends Duck {
- /**
- * 构造野鸭,先孵蛋再喂食……
- */
- public function __construct() {
- $this->quackBehavior = new TQuack(); //曾记否:呱呱叫
- $this->flyBehavior = new FlyWithWings(); //I belive i can fly. ^_^
- } //END func __construct
- /**
- * @see Duck::display()
- * 重载display,说明一下这是只特立独行的鸭子
- */
- public function display() {
- echo "<span style=\"blue;\">MallardDuck::</span>I'm a real Mallard duck.";
- } // END func display
- } // class MallardDuck
- /**
- * 这是一只模型鸭
- * 玩具 or 玩偶 or 玩家 ???
- */
- class ModelDuck extends Duck {
- /**
- * 铸模->成型->包装->出货
- */
- public function __construct() {
- $this->flyBehavior = new FlyNoWay(); //模型鸭是不会飞的
- $this->quackBehavior = new TQuack(); //1块钱店里的东西都会叫,何况这个“高”科技
- }
- public function display() {
- echo "<span style=\"blue;\">ModelDuck::</span>I'm a Model duck.";
- }
- } //END class ModelDuck
- /**
- * 使用接口后的变态类: 火箭推进器
- */
- class FlyRocketPowered implements FlyBehavior {
- /**
- * @see FlyBehavior::fly()
- *
- */
- function fly() {
- echo "I'm flying with a rocket!<br />";
- }
- } //END class FlyRocketPowered
- /**
- * 以下测试代码:
- */
- echo "<h3>测试第一组:野鸭</h3>";
- /**
- * 最后,来点绿的,Come On ...
- */
- $first_duck = new MallardDuck();
- $first_duck->perfromQuack();
- $first_duck->perfromFly();
- unset($first_duck);
- echo "<br /><h3>第二组测试:模型鸭</h3>";
- /**
- * 这个就是红的了,污染环境
- */
- $second_duck = new ModelDuck();
- $second_duck->perfromFly();
- $second_duck->setFlyBehavior(new FlyRocketPowered());
- $second_duck->perfromFly();
- unset($second_duck);
- </span></span>
- ?>
如果你是第一次来这儿,欢迎
这个博客。 第一时间看到更多精彩内容,谢谢你的访问!
本文固定链接: http://mifunny.info/phps-duck-of-head-first-design-patterns-88.html
转载请注明出处及链接,非常感谢!
LD on 08月 25th, 2008 | File Under 设计模式 | -
这个博客。 第一时间看到更多精彩内容,谢谢你的访问! 本文固定链接: http://mifunny.info/phps-duck-of-head-first-design-patterns-88.html
转载请注明出处及链接,非常感谢!

说说你的想法
08月 26th, 2008 at 10:45 am
翻到 代码好长…可以只贴重要片段么 嘿嘿
[回复]
LD 回复:
08月 26th, 2008 at 5:50 pm
前200行都是主心骨,设计模式就是第一次代码加倍,以后添功能代码减半再减半
[回复]