PHP设计模式之建造者模式

建造者模式用于将复杂对象简单化,一个复杂的对象分解成多个更简单的对象,然后将简单对象组合起来就生成了复杂对象。

<?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();

猜你喜欢

转载自blog.csdn.net/hhhzua/article/details/81542617