没想到啊

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 :: 管理 ::
  1 <?php 
  2 /** 
  3 * 策略模式 
  4 * 定义了算法族,分别封装起来,让它们之间可以互相替换, 
  5 * 此模式让算法的变化独立于使用算法的客户。 
  6 */ 
  7 //飞行行为接口 
  8 interface FlyBehavior { 
  9 public function fly(); 
 10 } 
 11 //呱呱叫行为接口 
 12 interface QuackBehavior { 
 13 public function quack(); 
 14 } 
 15 //翅膀飞行 
 16 class FlyWithWings implements FlyBehavior { 
 17 public function fly() { 
 18 echo "I'm flying!!\n"; 
 19 } 
 20 } 
 21 //不会飞 
 22 class FlyNoWay implements FlyBehavior { 
 23 public function fly() { 
 24 echo "I can't fly!\n"; 
 25 } 
 26 } 
 27 class FlyRocketPowered implements FlyBehavior { 
 28 public function fly() { 
 29 echo "I'm flying with a rocket!\n"; 
 30 } 
 31 } 
 32 class Qquack implements QuackBehavior { 
 33 public function quack() { 
 34 echo "Quack\n"; 
 35 } 
 36 } 
 37 class Squeak implements QuackBehavior { 
 38 public function quack() { 
 39 echo "Squeak\n"; 
 40 } 
 41 } 
 42 class MuteQuack implements QuackBehavior { 
 43 public function quack() { 
 44 echo "<< Silence >>\n"; 
 45 } 
 46 } 
 47 abstract class Duck { 
 48 protected $quack_obj; 
 49 protected $fly_obj; 
 50 public abstract function display(); 
 51 
 52 public function performQuack() { 
 53 $this->quack_obj->quack(); 
 54 } 
 55 public function performFly() { 
 56 $this->fly_obj->fly(); 
 57 } 
 58 public function swim() { 
 59 echo "All ducks float, even decoys!\n"; 
 60 } 
 61 public function setFlyBehavior(FlyBehavior $fb) { 
 62 $this->fly_obj = $fb; 
 63 } 
 64 public function setQuackBehavior(QuackBehavior $qb) { 
 65 $this->quack_obj = $qb; 
 66 } 
 67 } 
 68 
 69 class ModelDuck extends Duck { 
 70 public function __construct() { 
 71 $this->fly_obj = new FlyNoWay(); 
 72 $this->quack_obj = new MuteQuack(); 
 73 } 
 74 public function display() { 
 75 echo "I'm a model duck!\n"; 
 76 } 
 77 } 
 78 
 79 $model = new ModelDuck(); 
 80 $model->performFly(); 
 81 $model->performQuack(); 
 82 //提供新的能力 
 83 $model->setFlyBehavior(new FlyRocketPowered()); 
 84 $model->setQuackBehavior(new Squeak()); 
 85 $model->performFly(); 
 86 $model->performQuack(); 
 87 
 88 ?> 
 89 
 90 单件模式 
 91 复制代码 代码如下:
 92 
 93 <?php 
 94 /** 
 95 * 单件模式 
 96 * 确保一个类只有一个实例,并提供一个全局访问点。 
 97 */ 
 98 class MyClass { 
 99 private static $uniqueInstance; 
100 private function __construct() { 
101 
102 } 
103 public static function getInstance() { 
104 if (self::$uniqueInstance == null) { 
105 self::$uniqueInstance = new MyClass(); 
106 } 
107 return self::$uniqueInstance; 
108 } 
109 } 
110 $myClass = MyClass::getInstance(); 
111 var_dump($myClass); 
112 $myClass = MyClass::getInstance(); 
113 var_dump($myClass); 
114 ?> 
115 
116 工厂方法模式 
117 复制代码 代码如下:
118 
119 <?php 
120 abstract class PizzaStore { 
121 public function orderPizza($type) { 
122 $pizza = $this->createPizza($type); 
123 
124 $pizza->prepare(); 
125 $pizza->bake(); 
126 $pizza->cut(); 
127 $pizza->box(); 
128 return $pizza; 
129 } 
130 
131 public abstract function createPizza($type); 
132 } 
133 class NYPizzaStore extends PizzaStore { 
134 public function createPizza($type) { 
135 if ($type == "cheese") { 
136 return new NYStyleCheesePizza(); 
137 } elseif ($type == "veggie") { 
138 return new NYStyleVeggiePizza(); 
139 } elseif ($type == "clam") { 
140 return new NYStyleClamPizza(); 
141 } elseif ($type == "papperoni") { 
142 return new NYStylePapperoniPizza(); 
143 } else { 
144 return null; 
145 
146 } 
147 } 
148 } 
149 class ChicagoPizzaStore extends PizzaStore { 
150 public function createPizza($type) { 
151 if ($type == "cheese") { 
152 return new ChicagoStyleCheesePizza(); 
153 } elseif ($type == "veggie") { 
154 return new ChicagoStyleVeggiePizza(); 
155 } elseif ($type == "clam") { 
156 return new ChicagoStyleClamPizza(); 
157 } elseif ($type == "papperoni") { 
158 return new ChicagoStylePapperoniPizza(); 
159 } else { 
160 return null; 
161 } 
162 } 
163 } 
164 abstract class Pizza { 
165 public $name; 
166 public $dough; 
167 public $sauce; 
168 public $toppings = array(); 
169 
170 public function prepare() { 
171 echo "Preparing " . $this->name . "\n"; 
172 echo "Yossing dough...\n"; 
173 echo "Adding sauce...\n"; 
174 echo "Adding toppings: \n"; 
175 for ($i = 0; $i < count($this->toppings); $i++) { 
176 echo " " . $this->toppings[$i] . "\n"; 
177 } 
178 } 
179 
180 public function bake() { 
181 echo "Bake for 25 minutes at 350\n"; 
182 } 
183 
184 public function cut() { 
185 echo "Cutting the pizza into diagonal slices\n"; 
186 } 
187 
188 public function box() { 
189 echo "Place pizza in official PizzaStore box\n"; 
190 } 
191 
192 public function getName() { 
193 return $this->name; 
194 } 
195 } 
196 
197 class NYStyleCheesePizza extends Pizza { 
198 public function __construct() { 
199 $this->name = "NY Style Sauce and cheese Pizza"; 
200 $this->dough = "Thin Crust Dough"; 
201 $this->sauce = "Marinara Sauce"; 
202 
203 $this->toppings[] = "Grated Reggiano Cheese"; 
204 } 
205 } 
206 
207 class NYStyleVeggiePizza extends Pizza { 
208 public function __construct() { 
209 $this->name = "NY Style Sauce and veggie Pizza"; 
210 $this->dough = "Thin Crust Dough"; 
211 $this->sauce = "Marinara Sauce"; 
212 
213 $this->toppings[] = "Grated Reggiano veggie"; 
214 } 
215 } 
216 class NYStyleClamPizza extends Pizza { 
217 public function __construct() { 
218 $this->name = "NY Style Sauce and clam Pizza"; 
219 $this->dough = "Thin Crust Dough"; 
220 $this->sauce = "Marinara Sauce"; 
221 
222 $this->toppings[] = "Grated Reggiano clam"; 
223 } 
224 } 
225 class NYStylePapperoniPizza extends Pizza { 
226 public function __construct() { 
227 $this->name = "NY Style Sauce and papperoni Pizza"; 
228 $this->dough = "Thin Crust Dough"; 
229 $this->sauce = "Marinara Sauce"; 
230 
231 $this->toppings[] = "Grated Reggiano papperoni"; 
232 } 
233 } 
234 
235 class ChicagoStyleCheesePizza extends Pizza { 
236 public function __construct() { 
237 $this->name = "Chicago Style Deep Dish Cheese Pizza"; 
238 $this->dough = "Extra Thick Crust Dough"; 
239 $this->sauce = "Plum Tomato Sauce"; 
240 
241 $this->toppings[] = "Shredded Mozzarella Cheese"; 
242 } 
243 
244 public function cut() { 
245 echo "Cutting the pizza into square slices\n"; 
246 } 
247 } 
248 
249 $myStore = new NYPizzaStore(); 
250 $chicagoStore = new ChicagoPizzaStore(); 
251 $pizza = $myStore->orderPizza("cheese"); 
252 echo "Ethan ordered a " . $pizza->getName() . "\n"; 
253 
254 $pizza = $chicagoStore->orderPizza("cheese"); 
255 echo "Ethan ordered a " . $pizza->getName() . "\n"; 
256 
257 ?> 
258 
259 工厂模式 
260 复制代码 代码如下:
261 
262 <?php 
263 abstract class PizzaStore { 
264 public function orderPizza($type) { 
265 $pizza = $this->createPizza($type); 
266 
267 $pizza->prepare(); 
268 $pizza->bake(); 
269 $pizza->cut(); 
270 $pizza->box(); 
271 return $pizza; 
272 } 
273 
274 public abstract function createPizza($type); 
275 } 
276 class NYPizzaStore extends PizzaStore { 
277 public function createPizza($type) { 
278 $pizza = null; 
279 $ingredientFactory = new NYPizzaIngredientFactory(); 
280 if ($type == "cheese") { 
281 $pizza = new CheesePizza($ingredientFactory); 
282 $pizza->setName('New York Style Cheese Pizza'); 
283 } elseif ($type == "veggie") { 
284 $pizza = new VeggiePizza($ingredientFactory); 
285 $pizza->setName('New York Style Veggie Pizza'); 
286 } elseif ($type == "clam") { 
287 $pizza = new ClamPizza($ingredientFactory); 
288 $pizza->setName('New York Style Clam Pizza'); 
289 } elseif ($type == "papperoni") { 
290 $pizza = new PapperoniPizza($ingredientFactory); 
291 $pizza->setName('New York Style Papperoni Pizza'); 
292 } 
293 return $pizza; 
294 } 
295 } 
296 class ChicagoPizzaStore extends PizzaStore { 
297 public function createPizza($type) { 
298 if ($type == "cheese") { 
299 return new ChicagoStyleCheesePizza(); 
300 } elseif ($type == "veggie") { 
301 return new ChicagoStyleVeggiePizza(); 
302 } elseif ($type == "clam") { 
303 return new ChicagoStyleClamPizza(); 
304 } elseif ($type == "papperoni") { 
305 return new ChicagoStylePapperoniPizza(); 
306 } else { 
307 return null; 
308 } 
309 } 
310 } 
311 interface PizzaIngredientFactory { 
312 public function createDough(); 
313 public function createSauce(); 
314 public function createCheese(); 
315 public function createVeggies(); 
316 public function createPepperoni(); 
317 public function createClam(); 
318 } 
319 class NYPizzaIngredientFactory implements PizzaIngredientFactory { 
320 public function createDough() { 
321 return new ThinCrustDough(); 
322 } 
323 public function createSauce() { 
324 return new MarinaraSauce(); 
325 } 
326 public function createCheese() { 
327 return new ReggianoCheese(); 
328 } 
329 public function createVeggies() { 
330 $veggies = array( 
331 new Garlic(), 
332 new Onion(), 
333 new Mushroom(), 
334 new RedPepper(), 
335 ); 
336 return $veggies; 
337 } 
338 public function createPepperoni() { 
339 return new SlicedPepperoni(); 
340 } 
341 public function createClam() { 
342 return new FreshClams(); 
343 } 
344 } 
345 class ChicagoPizzaIngredientFactory implements PizzaIngredientFactory { 
346 public function createDough() { 
347 return new ThickCrustDough(); 
348 } 
349 public function createSauce() { 
350 return new PlumTomatoSauce(); 
351 } 
352 public function createCheese() { 
353 return new Mozzarella(); 
354 } 
355 public function createVeggies() { 
356 $veggies = array( 
357 new BlackOlives(), 
358 new Spinach(), 
359 new EggPlant(), 
360 ); 
361 return $veggies; 
362 } 
363 public function createPepperoni() { 
364 return new SlicedPepperoni(); 
365 } 
366 public function createClam() { 
367 return new FrozenClams(); 
368 } 
369 } 
370 abstract class Pizza { 
371 public $name; 
372 public $dough; 
373 public $sauce; 
374 public $veggies = array(); 
375 public $cheese; 
376 public $pepperoni; 
377 public $clam; 
378 
379 public abstract function prepare(); 
380 
381 public function bake() { 
382 echo "Bake for 25 minutes at 350\n"; 
383 } 
384 
385 public function cut() { 
386 echo "Cutting the pizza into diagonal slices\n"; 
387 } 
388 
389 public function box() { 
390 echo "Place pizza in official PizzaStore box\n"; 
391 } 
392 
393 public function getName() { 
394 return $this->name; 
395 } 
396 
397 public function setName($name) { 
398 $this->name = $name; 
399 } 
400 
401 public function __toString() { 
402 
403 } 
404 } 
405 
406 class CheesePizza extends Pizza { 
407 public $ingredientFactory; 
408 
409 public function __construct(PizzaIngredientFactory $ingredientFactory) { 
410 $this->ingredientFactory = $ingredientFactory; 
411 } 
412 
413 public function prepare() { 
414 echo "Preparing " . $this->name . "\n"; 
415 $this->dough = $this->ingredientFactory->createDough(); 
416 $this->sauce = $this->ingredientFactory->createSauce(); 
417 $this->cheese = $this->ingredientFactory->createCheese(); 
418 } 
419 } 
420 
421 class ClamPizza extends Pizza { 
422 public $ingredientFactory; 
423 
424 public function __construct(PizzaIngredientFactory $ingredientFactory) { 
425 $this->ingredientFactory = $ingredientFactory; 
426 } 
427 
428 public function prepare() { 
429 echo "Preparing " . $this->name . "\n"; 
430 $this->dough = $this->ingredientFactory->createDough(); 
431 $this->sauce = $this->ingredientFactory->createSauce(); 
432 $this->cheese = $this->ingredientFactory->createCheese(); 
433 $clam = $this->ingredientFactory->createClam(); 
434 } 
435 } 
436 
437 $nyPizzaStore = new NYPizzaStore(); 
438 $nyPizzaStore->orderPizza('cheese'); 
439 ?> 
posted on 2012-05-29 11:35  没想到啊  阅读(136)  评论(0)    收藏  举报