书中的例子相当容易理解,但因为外国人是外国人写的,例证的习惯并不是很接近中国的特点。偶尔,它可能看起来很尴尬,语言习惯不是中国风。当然,读完这本书后,你可以深刻理解设计模式能为你解决什么问题,以及哪些问题不能为你解决,例如不能代替你的编码。
我把这本书的一部分改成了PHP,这样读代码和匹配概念就比较容易了。

策略模式
复制代码代码如下所示:
< PHP

*政策模式
*定义了一系列单独封装的算法,以便相互替换。
*这种模式使算法的变化独立于使用该算法的客户。
* /
飞行行为接口
FlyBehavior {接口
公共功能飞();
}
嘎嘎行为接口
QuackBehavior {接口
公共功能嘎嘎();
}
{ /翅膀}
类flywithwings实现flybehavior {
公共功能飞(){
回声我在飞翔!!;
}
}
无法飞行
类flynoway实现flybehavior {
公共功能飞(){
我不能飞!;
}
}
类flyrocketpowered实现flybehavior {
公共功能飞(){
我在火箭上飞行!;
}
}
类qquack实现QuackBehavior {
公共函数嘎嘎(){
回声嘎嘎;
}
}
类实现了QuackBehavior {尖叫
公共函数嘎嘎(){
回声吱吱;
}
}
类mutequack实现QuackBehavior {
公共函数嘎嘎(){

}
}
抽象类鸭子{
保护quack_obj美元;
保护fly_obj美元;
公共抽象函数显示();

公共功能performquack(){
这quack_obj美元-> ->嘎嘎();
}
公共功能performfly(){
这fly_obj美元-> ->飞();
}
公共功能游泳({){
回声鸭浮,甚至诱饵!;
}
公共功能setflybehavior(flybehavior $ FB){
美元-> fly_obj = $ FB;
}
公共功能setquackbehavior(QuackBehavior为QB){
美元-> quack_obj = $ QB;
}
}

类modelduck延伸鸭{
公共功能__construct(){
美元-> fly_obj =新flynoway();
美元-> quack_obj =新MuteQuack();
}
公共函数显示(){
我是一只模型鸭!;
}
}

模式=新modelduck(美元);
元模型-> performfly();
元模型-> performquack();
提供新功能
元模型-> setflybehavior(新flyrocketpowered());
元模型-> setquackbehavior(新佳乐());
元模型-> performfly();
元模型-> performquack();

>

单例模式
复制代码代码如下所示:
< PHP

*单模式
*确保一个类只有一个实例,并提供一个全局访问点。
* /
类{
私有静态uniqueinstance美元;
私有函数__construct(){

}
公共静态函数getInstance(){
如果(自::= = null uniqueinstance美元){
自::uniqueinstance美元=新MyClass();
}
回归自我::uniqueinstance美元;
}
}
$ myClass = MyClass::getInstance();
var_dump(合班);
$ myClass = MyClass::getInstance();
var_dump(合班);
>

工厂方法模式
复制代码代码如下所示:
< PHP
抽象类pizzastore {
公共功能orderpizza(合型){
比萨=美元美元-> createpizza(合型);

美元比萨-准备();
美元-烘烤();
美元比萨-削减();
美元比萨盒();
归还比萨饼;
}

公共createpizza抽象函数(合型);
}
类nypizzastore延伸pizzastore {
公共功能createpizza(合型){
如果($ =奶酪){
返回新的nystylecheesepizza();
} elseif(合型= =素食){
返回新的nystyleveggiepizza();
} elseif(合型= =蛤){
返回新的nystyleclampizza();
} elseif(合型= = papperoni){
返回新的nystylepapperonipizza();
{人}
返回null;

}
}
}
类chicagopizzastore延伸pizzastore {
公共功能createpizza(合型){
如果($ =奶酪){
返回新的chicagostylecheesepizza();
} elseif(合型= =素食){
返回新的chicagostyleveggiepizza();
} elseif(合型= =蛤){
返回新的chicagostyleclampizza();
} elseif(合型= = papperoni){
返回新的chicagostylepapperonipizza();
{人}
返回null;
}
}
}
抽象类比萨{
公开名称;
公共面团;
大众酱;
公共配料=阵列(美元);

公共函数准备(){
准备。$这个名称。;
回声yossing面团…;
加酱油…;
回声添加配料:;
为($我= 0;美元美元我浇头);i++){
。美元->配料{我}。;
}
}

公共函数烘焙(){
350分钟烤25分钟;
}

公共函数切割(){
将比萨饼切成对角片。;
}

公共函数框(){
回声的地方官员pizzastore比萨盒;
}

公共职能getName(){
返回$这个名称;
}
}

类nystylecheesepizza延伸比萨{
公共功能__construct(){
这个名字纽约风格的沙司和奶酪比萨饼;
这个面团=薄面团;
美元->酱=蕃茄酱;

美元->配料{ } =磨碎的巴马干酪奶酪;
}
}

类nystyleveggiepizza延伸比萨{
公共功能__construct(){
这个名字纽约风格的酱和蔬菜比萨;
这个面团=薄面团;
美元->酱=蕃茄酱;

美元->配料{ } =磨碎的巴马干酪素食;
}
}
类nystyleclampizza延伸比萨{
公共功能__construct(){
这个名字叫纽约风格的酱和蛤披萨;
这个面团=薄面团;
美元->酱=蕃茄酱;

美元->配料{ } =磨碎的巴马干酪蛤蜊;
}
}
类nystylepapperonipizza延伸比萨{
公共功能__construct(){
美元->名称=纽约风格酱和papperoni披萨;
这个面团=薄面团;
美元->酱=蕃茄酱;

美元->配料{ } =磨碎的巴马干酪papperoni ;
}
}

类chicagostylecheesepizza延伸比萨{
公共功能__construct(){
这个名字叫芝加哥风格的深碟奶酪比萨饼;
这个面团=厚面团;
这个酱=梅子番茄酱;

美元->配料{ } =碎芝士;
}

公共函数切割(){
将比萨饼切成方形。;
}
}

MyStore美元=新nypizzastore();
chicagostore美元=新chicagopizzastore();
比萨=美元美元MyStore -> orderpizza(奶酪);
回声伊森命令。$比萨-> getName()。;

美元chicagostore -> orderpizza比萨= $(奶酪);
回声伊森命令。$比萨-> getName()。;

>

工厂模式
复制代码代码如下所示:
< PHP
抽象类pizzastore {
公共功能orderpizza(合型){
比萨=美元美元-> createpizza(合型);

美元比萨-准备();
美元-烘烤();
美元比萨-削减();
美元比萨盒();
归还比萨饼;
}

公共createpizza抽象函数(合型);
}
类nypizzastore延伸pizzastore {
公共功能createpizza(合型){
美元=空;
ingredientfactory美元=新nypizzaingredientfactory();
如果($ =奶酪){
新的芝士披萨披萨=美元(美元ingredientfactory);
$比萨-> setName(New纽约芝士披萨);
} elseif(合型= =素食){
比萨=新veggiepizza美元(美元ingredientfactory);
$比萨-> setName(New纽约风格的素食比萨);
} elseif(合型= =蛤){
比萨=新clampizza美元(美元ingredientfactory);
$比萨-> setName(New纽约风格蛤比萨);
} elseif(合型= = papperoni){
比萨=新papperonipizza美元(美元ingredientfactory);
$比萨-> setName(New纽约风格papperoni比萨);
}
归还比萨饼;
}
}
类chicagopizzastore延伸pizzastore {
公共功能createpizza(合型){
如果($ =奶酪){
返回新的chicagostylecheesepizza();
} elseif(合型= =素食){
返回新的chicagostyleveggiepizza();
} elseif(合型= =蛤){
返回新的chicagostyleclampizza();
} elseif(合型= = papperoni){
返回新的chicagostylepapperonipizza();
{人}
返回null;
}
}
}
接口pizzaingredientfactory {
公共函数createDough();
公共功能createsauce();
公共功能createcheese();
公共功能createveggies();
公共功能createpepperoni();
公共函数createClam();
}
类nypizzaingredientfactory实现pizzaingredientfactory {
公共函数createDough(){
返回新的thincrustdough();
}
公共功能createsauce(){
返回新的marinarasauce();
}
公共功能createcheese(){
返回新的reggianocheese();
}
公共功能createveggies(){
蔬菜=数组(
新蒜头(),
新洋葱(),
新蘑菇(),
新的性(),
);
返回$蔬菜;
}
公共功能createpepperoni(){
返回新的slicedpepperoni();
}
公共函数createClam(){
返回新的freshclams();
}
}
类chicagopizzaingredientfactory实现pizzaingredientfactory {
公共函数createDough(){
返回新的thickcrustdough();
}
公共功能createsauce(){
返回新的plumtomatosauce();
}
公共功能createcheese(){
归还新的马苏里拉();
}
公共功能createveggies(){
蔬菜=数组(
新的blackolives(),
新菠菜(),
新茄子(),
);
返回$蔬菜;
}
公共功能createpepperoni(){
返回新的slicedpepperoni();
}
公共函数createClam(){
返回新的frozenclams();
}
}
抽象类比萨{
公开名称;
公共面团;
大众酱;
公共$蔬菜=阵列();
公共奶酪;
公共意大利辣味香肠美元;
公蛤;

公共抽象功能准备();

公共函数烘焙(){
350分钟烤25分钟;
}

公共函数切割(){
将比萨饼切成对角片。;
}

公共函数框(){
回声的地方官员pizzastore比萨盒;
}

公共职能getName(){
返回$这个名称;
}

公共职能setName($name){
这个名字;
}

公共功能__tostring(){

}
}

类芝士披萨披萨{延伸
公共ingredientfactory美元;

公共功能__construct(pizzaingredientfactory ingredientfactory美元){
美元-> ingredientfactory = $ ingredientfactory;
}

公共函数准备(){
准备。$这个名称。;
美元->面团=美元-> ingredientfactory -> createdough();
美元->酱=美元-> ingredientfactory -> createsauce();
美元->奶酪=美元-> ingredientfactory -> createcheese();
}
}

类clampizza延伸比萨{
公共ingredientfactory美元;

公共功能__construct(pizzaingredientfactory ingredientfactory美元){
美元-> ingredientfactory = $ ingredientfactory;
}

公共函数准备(){
准备。$这个名称。;
美元->面团=美元-> ingredientfactory -> createdough();
美元->酱=美元-> ingredientfactory -> createsauce();
美元->奶酪=美元-> ingredientfactory -> createcheese();
蛤=美元美元-> ingredientfactory -> createclam();
}
}

nypizzastore美元=新nypizzastore();
nypizzastore美元-> orderpizza('cheese);
>