Php 在使用Decorator模式时,如何在运行时动态地初始化类?

Php 在使用Decorator模式时,如何在运行时动态地初始化类?,php,Php,首先,很抱歉没有正确解释这一点,我很难找到我的话 我一直在关注关于装饰器模式的laracast php教程。它解释了如何在运行时构建对象 来自教程 interface CarService{ public function getCost(); } class Service implements CarService { public function getCost() { return 20; } } class OilChange i

首先,很抱歉没有正确解释这一点,我很难找到我的话

我一直在关注关于装饰器模式的laracast php教程。它解释了如何在运行时构建对象

来自教程

interface CarService{
    public function getCost();
}

class Service implements CarService {

    public function getCost()
    {
        return 20;
    }
}

class OilChange implements CarService{

    protected $carService;
    public function __construct(CarService $carService)
    {
        $this->carService = $carService;
    }

    public function getCost()
    {
        return 10 + $this->carService->getCost();
    }
}

class Tyre implements CarService {

    protected $carService;
    public function __construct(CarService $carService)
    {
        $this->carService = $carService;
    }

    public function getCost()
    {
        return 20 + $this->carService->getCost();
    }
}
我主要关注的是这一点

$carService = new Tyre(new OilChange(new Service()));

echo $carService->getCost();
//output 50
正如本教程所描述的,通过引入接口,使用此代码有助于减少类中代码的重复。我理解为什么这是一个好方法,但有一点在教程中没有解释。如果您有100种服务类型,则可能会启动10000种不同的类别,例如此
$carService=新轮胎(新机油更换(新服务())
或此
$carService=new OilChange(new Service())

如您所见,如果您必须根据汽车服务的每个可能结果(10000)启动课程,这将很快增加


我如何解决这个问题,以便它确切地知道要初始化的服务的类/类型?显然,对于每一个条件都有一个长的if语句,即10000是不正确的

我远非OOP专家,但老实说,这个例子更像是“复合模式”。所有类基本上都执行相同的操作,即报告它们的价格。通过调用每个“叶”的getCost方法,您正在构建一个“树”,报告其总体价格。看看这里:至于你的问题,我不知道如何避免“如果其他”,因为这个例子是非常不切实际的。提示:OOP设计模式可能被滥用。在现实生活中,您可能不会使用一个需要在运行时决定的设计,其中有10000个可能的组合。我建议您谨慎地对待给出的每个示例,并将其视为一个教学工具。感谢您,我将查看您提供的url:)我认为decorator模式的关键功能是使用附加功能“装饰”某些对象,与提供的示例不同。