刚刚看《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
“;
}
} // END class FlyWithWings

/**
* 根本不会飞,瘟鸡一只
*/
class FlyNoWay implements FlyBehavior {
/**
* @see FlyBehavior::fly()
*
*/
function fly() {
echo “FlyNoWay
“;
}
} // END class FlyNoWay

/**
* 鸭子呱呱叫,癞蛤蟆想吃天鹅肉 [这里用TQuack代替Quack::PHP对大小写不敏感]
*/
class TQuack implements QuackBehavior {
/**
* @see QuackBehavior::quack()
*
*/
function quack() {
echo “Quack
“;
}
} // END class Quack

/**
* 橡皮鸭吱吱叫,鼠辈横行
*/
class Squeak implements QuackBehavior {
/**
* @see QuackBehavior::quack()
*
*/
function quack() {
echo “Squeak
“;
}
} // END class Squeak

/**
* 哑巴,多么想说话呀
*/
class MuteQuack implements QuackBehavior {
/**
* @see QuackBehavior::quack()
*
*/
function quack() {
echo “MuteQuack
“;
}
} // END class MuteQuack

/**
* 鸭子类
* 你一定要说鸳鸯也行,实在不行就搞个鸟类
*/
class Duck {
public $quackBehavior; //叫嚣接口变量
public $flyBehavior; //飞翔接口变量

/**
* 构造函数
* Shit! 竟然没事干
*/
public function __construct() {
}

/**
* 鸭子不出意外,天生就可以“游泳”
*/
public function swim() {
echo “Duck::I belive i can swim.
“;
} // END func swim

/**
* 爱美之心鸭皆有之 [原版这里是一个虚函数]
*/
public function display() {
echo “Duck::My dream is be a swan.
“;
} //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 “MallardDuck::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 “ModelDuck::I’m a Model duck.”;
}
} //END class ModelDuck

/**
* 使用接口后的变态类: 火箭推进器
*/
class FlyRocketPowered implements FlyBehavior {
/**
* @see FlyBehavior::fly()
*
*/
function fly() {
echo “I’m flying with a rocket!
“;
}
} //END class FlyRocketPowered

/**
* 以下测试代码:
*/
echo “

测试第一组:野鸭

“;

/**
* 最后,来点绿的,Come On …
*/
$first_duck = new MallardDuck();
$first_duck->perfromQuack();
$first_duck->perfromFly();
unset($first_duck);

echo “

第二组测试:模型鸭

“;

/**
* 这个就是红的了,污染环境
*/
$second_duck = new ModelDuck();
$second_duck->perfromFly();
$second_duck->setFlyBehavior(new FlyRocketPowered());
$second_duck->perfromFly();
unset($second_duck);
?>