php有哪些设计模式

PHP中的设计模式

设计模式是在软件开发中常用的可重复解决方案。它们提供了一种通用方法来解决常见问题,从而提高代码的可维护性、可扩展性和可重用性。PHP语言中提供了丰富的内置设计模式,支持各种软件开发场景。本文将深入探讨PHP中最常用的设计模式,并提供示例代码,以帮助您充分利用它们。

1.创建型模式

创建型模式旨在创建对象,而不指定的确切类。它们提供了一种灵活的方式来实例化对象,同时允许代码与创建过程解耦。

工厂模式(FactoryMethod)

工厂方法模式将对象创建委托给一个专门的工厂类。该工厂负责根据提供的参数创建特定类型的对象。

php

interfacePizza{

publicfunctionbake();

}

classMargheritaPizzaimplementsPizza{

publicfunctionbake(){

echo"BakingMargheritapizza...";

}

}

classPepperoniPizzaimplementsPizza{

publicfunctionbake(){

echo"BakingPepperonipizza...";

}

}

classPizzaFactory{

publicstaticfunctioncreatePizza($type){

switch($type){

case'margherita':

returnnewMargheritaPizza();

case'pepperoni':

returnnewPepperoniPizza();

default:

thrownewInvalidArgumentException("Invalidpizzatype");

}

}

}

$pizza=PizzaFactory::createPizza('margherita');

$pizza->bake();

抽象工厂模式(AbstractFactory)

抽象工厂模式将创建一系列相关对象的责任委托给一个抽象工厂。它允许一次创建一组相关对象,从而确保一致性。

php

interfacePizzaIngredientFactory{

publicfunctioncreateDough();

publicfunctioncreateSauce();

publicfunctioncreateCheese();

}

classNYPizzaIngredientFactoryimplementsPizzaIngredientFactory{

publicfunctioncreateDough(){returnnewThinCrustDough();}

publicfunctioncreateSauce(){returnnewMarinaraSauce();}

publicfunctioncreateCheese(){returnnewMozzarellaCheese();}

}

classCAPizzaIngredientFactoryimplementsPizzaIngredientFactory{

publicfunctioncreateDough(){returnnewThickCrustDough();}

publicfunctioncreateSauce(){returnnewTomatoSauce();}

publicfunctioncreateCheese(){returnnewCheddarCheese();}

}

interfacePizzaStore{

publicfunctioncreatePizza($type);

}

classNYPizzaStoreimplementsPizzaStore{

publicfunctioncreatePizza($type){

$factory=newNYPizzaIngredientFactory();

switch($type){

case'cheese':

returnnewCheesePizza($factory);

case'pepperoni':

returnnewPepperoniPizza($factory);

default:

thrownewInvalidArgumentException("Invalidpizzatype");

}

}

}

classCAPizzaStoreimplementsPizzaStore{

publicfunctioncreatePizza($type){

$factory=newCAPizzaIngredientFactory();

switch($type){

case'cheese':

returnnewCheesePizza($factory);

case'pepperoni':

returnnewPepperoniPizza($factory);

default:

thrownewInvalidArgumentException("Invalidpizzatype");

}

}

}

classCheesePizza{

private$ingredientFactory;

publicfunction__construct(PizzaIngredientFactory$ingredientFactory){$this->ingredientFactory=$ingredientFactory;}

publicfunctionbake(){

$dough=$this->ingredientFactory->createDough();

$sauce=$this->ingredientFactory->createSauce();

$cheese=$this->ingredientFactory->createCheese();

echo"Bakingcheesepizzawith{$dough->getName()},{$sauce->getName()}and{$cheese->getName()}...";

}

}

classPepperoniPizzaextendsCheesePizza{

publicfunctionbake(){

parent::bake();

echo"Addingpepperoni...";

}

}

$nyStore=newNYPizzaStore();

$pizza=$nyStore->createPizza('cheese');

$pizza->bake();

建造者模式(Builder)

建造者模式分离对象的创建和表示。它允许您使用相同的建造过程创建复杂对象的多个表示。

php

interfacePizzaBuilder{

publicfunctioncreateDough();

publicfunctionaddSauce();

publicfunctionaddCheese();

publicfunctionaddPepperoni();

publicfunctiongetPizza();

}

classNYPizzaBuilderimplementsPizzaBuilder{

private$pizza;

publicfunction__construct(){$this->pizza=newPizza();}

publicfunctioncreateDough(){$this->pizza->setDough(newThinCrustDough());}

publicfunctionaddSauce(){$this->pizza->setSauce(newMarinaraSauce());}

publicfunctionaddCheese(){$this->pizza->setCheese(newMozzarellaCheese());}

publicfunctionaddPepperoni(){$this->pizza->setPepperoni(true);}

publicfunctiongetPizza(){return$this->pizza;}

}

classPizza{

private$dough;

private$sauce;

private$cheese;

private$pepperoni;

publicfunctionsetDough(Dough$dough){$this->dough=$dough;}

publicfunctionsetSauce(Sauce$sauce){$this->sauce=$sauce;}

publicfunctionsetCheese(Cheese$cheese){$this->cheese=$cheese;}

publicfunctionsetPepperoni(bool$pepperoni){$this->pepperoni=$pepperoni;}

publicfunctionbake(){

echo"Bakingpizzawith{$this->dough->getName()},{$this->sauce->getName()},{$this->cheese->getName()}...";

if($this->pepperoni){echo"Addingpepperoni...";}

}

}

$builder=newNYPizzaBuilder();

$builder->createDough();

$builder->addSauce();

$builder->addCheese();

$builder->addPepperoni();

$pizza=$builder->getPizza();

$pizza->bake();

2.结构型模式

结构型模式关注于对象之间的关系和组合。它们帮助您组织代码并改善灵活性。

适配器模式(Adapter)

适配器模式将一个类的接口转换为另一个类可以理解的接口。它允许原本不兼容的对象一起工作。

php

interfaceTarget{

publicfunctionrequest();

}

classAdaptee{

publicfunctionspecificRequest(){

echo"Performingspecificrequest...";

}

}

classAdapterimplementsTarget{

private$adaptee;

publicfunction__construct(Adaptee$adaptee){$this->adaptee=$adaptee;}

publicfunctionrequest(){$this->adaptee->specificRequest();}

}

$adaptee=newAdaptee();

$adapter=newAdapter($adaptee);

$adapter->request();

桥接模式(Bridge)

桥接模式将抽象部分与其实现部分分离。它允许在不影响客户端的情况下更改实现。

php

interfaceShape{

publicfunctiondraw();

}

classCircleimplementsShape{

publicfunctiondraw(){echo"Drawingacircle...";}

}

classRectangleimplementsShape{

publicfunctiondraw(){echo"Drawingarectangle...";}

}

abstractclassShapeRenderer{

protected$shape;

publicfunction__construct(Shape$shape){$this->shape=$shape;}

publicfunctionrender(){$this->shape->draw();}

}

classVectorRendererextendsShapeRenderer{

publicfunctionrender(){

echo"Drawing$this->shapeusingvectorgraphics...";

$this->shape->draw();

}

}

classRasterRendererextendsShapeRenderer{

publicfunctionrender(){

echo"Drawing$this->shapeusingrastergraphics...";

$this->shape->draw();

}

}

$circle=newCircle();

$rectangle=newRectangle();

$vectorRenderer=newVectorRenderer($circle);

$vectorRenderer->render();

$rasterRenderer=newRasterRenderer($rectangle);

$rasterRenderer->render();

组合模式(Composite)

组合模式将对象组合成树状结构,以便对单个对象和组合对象进行一致的处理。

php

interfaceGraphic{

publicfunctiondraw();

}

classDotimplementsGraphic{

publicfunctiondraw(){echo"Drawingadot...";}

}

classCompositeGraphicimplementsGraphic{

private$children=[];

publicfunctionadd(Graphic$graphic){$this->children[]=$graphic;}

publicfunctiondraw(){

foreach($this->childrenas$child){

$child->draw();

}

}

}

$dot1=newDot();

$dot2=newDot();

$composite=newCompositeGraphic();

$composite->add($dot1);

$composite->add($dot2);

$composite->draw();

3.行为型模式

行为型模式定义了对象之间的通信和交互。它们有助于提高代码的灵活性、可重用性和可维护性。

策略模式(Strategy)

策略模式将算法或行为封装在不同的策略类中,