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)
策略模式将算法或行为封装在不同的策略类中,
- 上一篇:php扩展库有哪些
- 下一篇:php有哪些建站程序