建造者模式用于将复杂对象简单化,一个复杂的对象分解成多个更简单的对象,然后将简单对象组合起来就生成了复杂对象。
<?php
/**
* Created by PhpStorm.
* User: hzh
* Date: 2018/8/10
* Time: 0:24
*/
interface Item
{
public function name();
public function packing();
public function price();
}
interface Packing
{
public function pack();
}
class Wrapper implements Packing
{
public function pack()
{
// TODO: Implement pack() method.
return "Wrapper";
}
}
class Bottle implements Packing
{
public function pack()
{
// TODO: Implement pack() method.
return "Bottle";
}
}
abstract class Burger implements Item
{
public function Packing()
{
return new Wrapper();
}
public abstract function price();
}
abstract class ColdDrink implements Item
{
public function Packing(){
return new Bottle();
}
public abstract function price();
}
class VegBurger extends Burger
{
public function price()
{
// TODO: Implement price() method.
return 10.5;
}
public function name()
{
// TODO: Implement name() method.
return "Veg Burger";
}
}
class ChickenBurger extends Burger
{
public function price()
{
// TODO: Implement price() method.
return 30.8;
}
public function name()
{
// TODO: Implement name() method.
return "Chicken Burger";
}
}
class Coke extends ColdDrink
{
public function price()
{
// TODO: Implement price() method.
return 5.5;
}
public function name()
{
// TODO: Implement name() method.
return "Coke";
}
}
class Pepsi extends ColdDrink
{
public function price()
{
// TODO: Implement price() method.
return 8.5;
}
public function name()
{
// TODO: Implement name() method.
return "Pepsi";
}
}
class Meal
{
public $items = [];
public function addItem(Item $item)
{
array_push($this->items,$item);
}
public function getCost()
{
$cost = 0.0;
foreach($this->items as $k=>$v){
$cost += $v->price();
}
return $cost;
}
public function showItem()
{
foreach($this->items as $k=>$v){
echo "Item: ".$v->name();
echo ", Packing ".$v->packing()->pack();
echo ", Price: ".$v->price()."\n";
}
}
}
class MealBuilder
{
public function prepareVegMeal()
{
$meal = new Meal();
$meal->addItem(new VegBurger());
$meal->addItem(new Coke());
return $meal;
}
public function prepareNonVegMeal()
{
$meal = new Meal();
$meal->addItem(new ChickenBurger());
$meal->addItem(new Pepsi());
return $meal;
}
}
$builder = new MealBuilder();
$meal = $builder->prepareNonVegMeal();
$meal->showItem();
echo "Total Cost: ";
echo $meal->getCost();