0


23种设计模式合集,只看这一篇就够了

目录

1、单例模式

单例模式特点是三私一公

  1. 私有的静态属性 用于存放实例
  2. 私有的构造方法 防止在类的外部创建实例对象
  3. 私有的克隆方法 防止在类的外部克隆对象
  4. 公有的静态方法 对外界提供实例对象

举例:程序应用中涉及到数据库操作时,如果每次操作都连接数据库就会带来大量的资源消耗,此时可以使用单例模式来创建唯一的数据库连接对象。

**下面直接

上代码

。**

classSingleton{privatestatic$_instance;privatefunction__construct(){// 单例操作}privatefunction__clone(){}publicstaticfunctiongetInstance(){// 判断某一变量 是否是某个类的实例 防止创建多个对象if(!self::$_instanceinstanceofSingleton){self::$_instance=newSingleton();}returnself::$_instance;}publicfunctionsave(){return'业务逻辑'.PHP_EOL;}}// 测试$singleton=Singleton::getInstance();echo$singleton->save();$singletonB=Singleton::getInstance();if($singleton===$singletonB){echo'是相同的对象';}

运行结果:
代码运行结果

2、简单工厂模式

描述:传递不同的参数 可以返回不同的实例对象
将调用对象与创建对象分离,调用者直接向工厂请求,减少代码耦合,提高系统的可维护性与可扩展性。

**下面直接

上代码

。**

// 工厂类classFactory{publicstaticfunctioncreateProduct(string$type):Product{$product=null;switch($type){case'A':$product=newProductA();break;case'B':$product=newProductB();break;}return$product;}}// 产品接口和实现interfaceProduct{publicfunctionshow();}classProductAimplementsProduct{publicfunctionshow(){echo'我是商品A';}}classProductBimplementsProduct{publicfunctionshow(){echo'我是商品B';}}// 测试$productA=Factory::createProduct('A');$productB=Factory::createProduct('B');$productA->show();$productB->show();

运行结果:
代码运行结果

3、工厂方法模式

描述:在子类中实现父类的抽象方法
不需要修改工厂类,只需要添加就行。符合开闭原则

**下面直接

上代码

。**

// 商品接口的实现类interfaceProduct2{functionshow():void;}classConcreateProductAimplementsProduct2{publicfunctionshow():void{echo'我是商品A',PHP_EOL;}}classConcreateProductBimplementsProduct2{publicfunctionshow():void{echo'我是商品B',PHP_EOL;}}// 工厂的抽象类与创建类abstractclassCreator{// 抽象工厂方法abstractprotectedfunctionFactoryMethod():Product2;// 操作方法publicfunctionAnOperation():Product2{return$this->FactoryMethod();}}classConcreateCreatorAextendsCreator{// 实现操作方法protectedfunctionFactoryMethod():Product2{returnnewConcreateProductA();}}classConcreateCreatorBextendsCreator{protectedfunctionFactoryMethod():Product2{returnnewConcreateProductB();}}// 测试$factoryA=newConcreateCreatorA();$factoryB=newConcreateCreatorB();$factoryA->AnOperation()->show();$factoryB->AnOperation()->show();

运行结果:
代码运行结果

4、抽象工厂模式

描述:不写了 自己感悟吧

**下面直接

上代码

。**

// 商品A的抽象接口interfaceAbstractProductA{publicfunctionshow():void;}// 商品A1的实现classProductA1implementsAbstractProductA{publicfunctionshow():void{echo'我是商品A1',PHP_EOL;}}// 商品A2的实现classProductA2implementsAbstractProductA{publicfunctionshow():void{echo'我是商品A2',PHP_EOL;}}// 商品B的抽象接口interfaceAbstractProductB{publicfunctionshow():void;}// 商品B1的实现classProductB1implementsAbstractProductB{publicfunctionshow():void{echo'我是商品B1',PHP_EOL;}}// 商品B2的实现classProductB2implementsAbstractProductB{publicfunctionshow():void{echo'我是商品B2',PHP_EOL;}}// 抽象工厂接口interfaceAbstractFactory{// 创建商品ApublicfunctionCreateProductA():AbstractProductA;// 创建商品BpublicfunctionCreateProductB():AbstractProductB;}// 工厂1 实现商品A1 和 商品A2classConcreteFactory1implementsAbstractFactory{publicfunctionCreateProductA():AbstractProductA{returnnewProductA1();}publicfunctionCreateProductB():AbstractProductB{returnnewProductB1();}}// 工厂2 实现商品A2 和 商品B2classConcreteFactory2implementsAbstractFactory{publicfunctionCreateProductA():AbstractProductA{returnnewProductA2();}publicfunctionCreateProductB():AbstractProductB{returnnewProductB2();}}// 测试$factory1=newConcreteFactory1();$factory1ProductA=$factory1->CreateProductA();$factory1ProductB=$factory1->CreateProductB();$factory1ProductA->show();$factory1ProductB->show();$factory2=newConcreteFactory2();$factory2ProductA=$factory2->CreateProductA();$factory2ProductB=$factory2->CreateProductB();$factory2ProductA->show();$factory2ProductB->show();

运行结果:
代码运行结果

5、装饰器模式

描述:使用装饰器给基础类的实例化对象动态的添加属性或方法
就像给返回的对象一层一层的添加装饰品

**下面直接

上代码

。**

interfaceComponent{publicfunctionoperation();}classConcreteComponentimplementsComponent{publicfunctionoperation(){return'我要化妆了';}}// 装饰器的抽象类abstractclassDecoratorimplementsComponent{protected$component;// 这里传入的是原本的基础类实例publicfunction__construct(Component$component){$this->component=$component;}}// 装饰器的实现类 添加属性示例classConcreteDecoratorAextendsDecorator{public$addedState=1;// 没有实际意义 用于区别ConcreteDecoratorBpublicfunctionoperation(){// 给原始的方法 添加内容echo$this->component->operation().'眼线笔'.$this->addedState.'只',PHP_EOL;}}// 添加方法示例classConcreteDecoratorBextendsDecorator{publicfunctionoperation(){$this->component->operation();$this->addedStateB();}publicfunctionaddedStateB(){echo'我是第二个装饰器';}}// 测试$component=newConcreteComponent();$component->operation();// 第一层装饰$component=newConcreteDecoratorA($component);$component->operation();// 第二层装饰$component=newConcreteDecoratorB($component);$component->operation();

运行结果:
代码运行结果

6、适配器模式

描述:在旧的代码中预留一块逻辑,新的代码需要适配旧的代码时,再去补全这块内容

**下面直接

上代码

。**

interfaceTarget{functionRequest():void;}// 适配器classAdapterimplementsTarget{private$adaptee;function__construct($adaptee){$this->adaptee=$adaptee;}functionRequest():void{$this->adaptee->SpecificRequest();}}// 具体要实现功能的逻辑classAdaptee{functionSpecificRequest():void{echo'我是适配器预留的逻辑';}}// 测试$adaptee=newAdaptee();$adapter=newAdapter($adaptee);$adapter->Request();

运行结果:
代码运行结果

7、观察者模式

描述:创建待观察列表,列表中存在观察者对象的值才会执行(将当前对象传入观察者类)

**下面直接

上代码

。**

interfaceObserver{publicfunctionupdate(Subject$subject):void;}classConcreteObserverimplementsObserver{private$observerState='';functionupdate(Subject$subject):void{$this->observerState=$subject->getState();echo'执行观察者操作!当前状态:'.$this->observerState,PHP_EOL;}}classSubject{private$observers=[];private$stateNow='';// 往要观察列表中添加对象publicfunctionattach(Observer$observer):void{array_push($this->observers,$observer);}// 从要观察列表中删除对象publicfunctiondetach(Observer$observer):void{$position=0;foreach($this->observersas$ob){if($ob===$observer){array_splice($this->observers,($position),1);}++$position;}}publicfunctionnotify():void{foreach($this->observersas$ob){$ob->update($this);}}}// 具体实现classConcreteSubjectextendsSubject{publicfunctionsetState($state){$this->stateNow=$state;$this->notify();}publicfunctiongetState(){return$this->stateNow;}}// 测试$observer=newConcreteObserver();$observer2=newConcreteObserver();$subject=newConcreteSubject();// 添加要观察的对象$subject->attach($observer);$subject->setState('哈哈哈哈哈');// 从列表中删除$subject->detach($observer);// 这里不会再观察值的变化了$subject->setState('嘿嘿嘿嘿嘿');// 测试第二个观察者$subject->attach($observer2);$subject->setState('呵呵呵呵呵');

运行结果:
代码运行结果

8、迭代器模式

描述:这种设计模式用的相对较少,学习一下

**下面直接

上代码

。**

interfaceMyIterator{publicfunctionFirst();publicfunctionNext();publicfunctionIsDone();publicfunctionCurrentItem();}classConcreteIteratorimplementsMyIterator{private$list;private$index;publicfunction__construct($list){$this->list=$list;$this->index=0;}publicfunctionFirst(){$this->index=0;}publicfunctionNext(){$this->index++;}// 下标大于或等于数组的总长度了 返回truepublicfunctionIsDone(){return$this->index>=count($this->list);}// 返回当前下标的数组信息publicfunctionCurrentItem(){return$this->list[$this->index];}}// 创建聚合对象的接口interfaceAggregate{publicfunctionCreateIterator();}classConcreteAggregateimplementsAggregate{publicfunctionCreateIterator(){$list=['a','b','c','d'];returnnewConcreteIterator($list);}}// 测试$agreegate=newConcreteAggregate();$iterator=$agreegate->CreateIterator();while(!$iterator->IsDone()){echo$iterator->CurrentItem(),PHP_EOL;$iterator->Next();}$iterator->First();echo$iterator->CurrentItem(),PHP_EOL;$iterator->Next();echo$iterator->CurrentItem(),PHP_EOL;

运行结果:
代码运行结果

9、原型模式

描述:主要行为是对 对象进行克隆,可以减少创建对象时的开销
使用clone操作复制对象时,当被复制的对象有对其它对象的引用的时候,引用的对象将不会被复制。

**下面直接

上代码

。**

abstractclassPrototype{public$a;public$b;publicfunction__construct(){echo'create'.PHP_EOL;}abstractpublicfunction__clone();}classConcretePrototype1extendsPrototype{// 克隆对象时 执行这个魔术方法publicfunction__clone(){}}classConcretePrototype2extendsPrototype{// 将内层对象也 拷贝一份publicfunction__clone(){$this->b=clone$this->b;}}classClient{publicfunctionoperation(){// 浅拷贝 外层对象地址不一样 内层对象地址一样$p1=newConcretePrototype1();$p1->a=123;$p1->b=newConcretePrototype2();// 因为这里是克隆的 所以没有执行构造方法$p2=clone$p1;var_dump($p1,$p2);// 深拷贝 外层对象地址不一样 内层对象地址也不一样$s1=newConcretePrototype2();$s1->a=456;$s1->b=newConcretePrototype1();$s2=clone$s1;var_dump($s1,$s2);// 扩展:序列化方式 实现深拷贝$a1=newConcretePrototype1();$a1->a=789;$a1->b=newConcretePrototype2();$tmp=unserialize(serialize($a1));var_dump($a1,$tmp);}}// 测试$c=newClient();$c->operation();

运行结果:
代码运行结果
代码运行结果
代码运行结果

10、命令模式

描述:实现调用者与执行者的解耦

**下面直接

上代码

。**

// 请求者 举例:服务员classInvoker{public$command;publicfunctionsetCommand($command){$this->command=$command;}publicfunctionexec(){$this->command->execute();}}// 命令 举例:菜单abstractclassCommand{protected$receiver;publicfunction__construct(Receiver$receiver){$this->receiver=$receiver;}abstractpublicfunctionexecute();}classConcreteCommandextendsCommand{// 举例:点菜功能publicfunctionexecute(){$this->receiver->action();}}// 执行者 举例:厨师角色classReceiver{public$name;publicfunction__construct($name){$this->name=$name;}publicfunctionaction(){echo$this->name.'命令执行了!',PHP_EOL;}}// 测试// 准备执行者$receiverA=newReceiver('A');$receiverB=newReceiver('B');// 准备命令$commandOne=newConcreteCommand($receiverA);$commandTwo=newConcreteCommand($receiverB);// 请求者$invoker=newInvoker();$invoker->setCommand($commandOne);$invoker->exec();$invoker->setCommand($commandTwo);$invoker->exec();

运行结果:
代码运行结果

11、策略模式

描述:传递不同的参数来调用不同的方法,与上面的简单工厂很像

**下面直接

上代码

。**

interfaceStrategy{functionway();}classWalkimplementsStrategy{publicfunctionway(){echo'策略A',PHP_EOL;}}classBusimplementsStrategy{publicfunctionway(){echo'策略B',PHP_EOL;}}classStu{publicstaticfunctionplay($obj){$obj->way();}}// 测试Stu::play(newWalk);Stu::play(newBus);

运行结果:
代码运行结果

12、责任链模式

描述:上一级持有下一级的引用,执行结果没有满足条件再通过下一级引用继续判断。可用于对请求参数进行层层过滤

**下面直接

上代码

。**

abstractclassHandler{protected$successor;// 设置检查下一级的对象publicfunctionsetSuccessor($successor){$this->successor=$successor;}abstractpublicfunctionHandleRequest($request);}classConcreteHandler1extendsHandler{publicfunctionHandleRequest($request){if(is_numeric($request)){return'请求参数是数字:'.$request;}else{// 参数非数字 传入下一层的HandleRequestreturn$this->successor->HandleRequest($request);}}}classConcreteHandler2extendsHandler{publicfunctionHandleRequest($request){if(is_string($request)){return'请求参数是字符串'.$request;}else{return$this->successor->HandleRequest($request);}}}classConcreteHandler3extendsHandler{publicfunctionHandleRequest($request){return'我也不知道请求参数是啥了,自动识别中……'.gettype($request);}}// 测试$handle1=newConcreteHandler1();$handle2=newConcreteHandler2();$handle3=newConcreteHandler3();// 设置下一级 持有下一级的引用$handle1->setSuccessor($handle2);$handle2->setSuccessor($handle3);// 测试结果$requests=[22,'aa',55,'cc',[1,2,3],null,newstdClass];foreach($requestsas$request){echo$handle1->HandleRequest($request).PHP_EOL;}

运行结果:
代码运行结果

13、代理模式

描述:通过代理类执行真实类中的代码

**下面直接

上代码

。**

interfaceAgent{publicfunctionRequest();}// 真实类classRealSubjectimplementsAgent{functionRequest(){echo'真实的操作',PHP_EOL;}}// 代理类classProxyimplementsAgent{private$realSubject;publicfunction__construct(){$this->realSubject=newRealSubject();}publicfunctionRequest(){echo'代理的操作',PHP_EOL;$this->realSubject->Request();}}// 测试$proxy=newProxy();$proxy->Request();

运行结果:
代码运行结果

14、享元模式

描述:将对象缓存起来 只创建一次,第二次请求不会再创建对象了,节省实例化开销

**下面直接

上代码

。**

interfaceFlyweight{publicfunctionoperation($extrinsicState):void;}classConcreteFlyweightimplementsFlyweight{// 内部状态private$intrinsicState=101;functionoperation($extrinsicState):void{echo'共享享元对象'.($extrinsicState+$this->intrinsicState).PHP_EOL;}}classUnsharedConcreteFlyweightimplementsFlyweight{private$allState=1000;publicfunctionoperation($extrinsicState):void{echo'非共享享元对象:'.($extrinsicState+$this->allState).PHP_EOL;}}// 享元工厂classFlyweightFactory{private$flyweights=[];publicfunctiongetFlyweight($key):Flyweight{// key不存在 则添加一个享元对象if(!array_key_exists($key,$this->flyweights)){echo'创建了享元对象',PHP_EOL;$this->flyweights[$key]=newConcreteFlyweight();}return$this->flyweights[$key];}}// 测试$factory=newFlyweightFactory();$extrinsicState=100;$flyA=$factory->getFlyweight('a');$flyA->operation(--$extrinsicState);$flyB=$factory->getFlyweight('b');$flyB->operation(--$extrinsicState);$flyD=newUnsharedConcreteFlyweight();$flyD->operation(--$extrinsicState);// 因为上面创建过享元对象了 这里不会再次创建$flyA=$factory->getFlyweight('a');$flyA->operation(--$extrinsicState);

运行结果:
代码运行结果

15、组合模式

描述:构建树形结构,给根节点添加叶子节点与组合节点

**下面直接

上代码

。**

abstractclassCombination{protected$name;publicfunction__construct($name){$this->name=$name;}abstractpublicfunctionOperation(int$depth);abstractpublicfunctionAdd(Combination$combination);abstractpublicfunctionRemove(Combination$combination);}// 组合节点classCompositeextendsCombination{private$combinationList;publicfunctionOperation(int$depth){// 重复一个字符串 $depth是重复次数echostr_repeat('-',$depth).$this->name.PHP_EOL;foreach($this->combinationListas$combination){$combination->Operation($depth+2);}}publicfunctionAdd(Combination$combination){$this->combinationList[]=$combination;}publicfunctionRemove(Combination$combination){$position=0;foreach($this->combinationListas$child){if($child==$combination){array_splice($this->combinationList,($position),1);}$position++;}}// 打印当前节点内容publicfunctionGetChild(int$i){return$this->combinationList[$i];}publicfunctiongetAll(){var_dump($this->combinationList);}}// 叶子节点classLeafextendsCombination{publicfunctionAdd(Combination$combination){echo'叶子结点不需要add'.PHP_EOL;}publicfunctionRemove(Combination$combination){echo'叶子节点不需要remove'.PHP_EOL;}publicfunctionOperation(int$depth){// 叶子节点直接打印深度echostr_repeat('-',$depth).$this->name.PHP_EOL;}}// 测试$root=newComposite('root');$root->Add(newLeaf('Leaf A'));$root->Add(newLeaf('Leaf B'));$comp=newComposite('Composite X');$comp->Add(newLeaf('Leaf XA'));$comp->Add(newLeaf('Leaf XB'));$root->Add($comp);$comp2=newComposite('Composite XY');$comp2->Add(newLeaf('Leaf XYA'));$comp2->Add(newLeaf('Leaf XYB'));$comp->Add($comp2);$root->Add(newLeaf('Leaf C'));$leaf=newLeaf('Leaf D');$root->Add($leaf);$root->Remove($leaf);$root->Operation(1);

运行结果:
代码运行结果

16、中介者模式

描述:在终端发出信息,通过中介者类调节发送

**下面直接

上代码

。**

// 中介者类abstractclassMediator{abstractpublicfunctionSend(string$message,Colleague$colleague);}classConcreteMediatorextendsMediator{// 同事1public$colleague1;// 同事2public$colleague2;publicfunctionSend(string$message,Colleague$colleague){if($colleague===$this->colleague1){// 外部传入等于同事1 则同事2接收到一条信息$this->colleague2->Notify($message);}else{$this->colleague1->Notify($message);}}}// 同事类abstractclassColleague{protected$mediator;publicfunction__construct(Mediator$mediator){$this->mediator=$mediator;}}// 同事1classConcreteColleague1extendsColleague{publicfunctionSend(string$message){$this->mediator->Send($message,$this);}publicfunctionNotify(string$message){echo'同事1接收到信息'.$message,PHP_EOL;}}// 同事2classConcreteColleague2extendsColleague{publicfunctionSend(string$message){$this->mediator->Send($message,$this);}publicfunctionNotify(string$message){echo'同事2接收到信息'.$message,PHP_EOL;}}// 测试$m=newConcreteMediator();$c1=newConcreteColleague1($m);$c2=newConcreteColleague2($m);$m->colleague1=$c1;$m->colleague2=$c2;$c1->Send('你吃饭了吗?');$c2->Send('没呢 走?');

运行结果:
代码运行结果

17、建造者模式

描述:往基类中配置属性,一步一步去构建完善。因为不是所有配置都是必须的,所以可以根据需求随时添加

**下面直接

上代码

。**

classHouse{private$parts=[];publicfunctionAdd(string$part):void{$this->parts[]=$part;}publicfunctionShow():void{echoPHP_EOL.'产品创建 ----',PHP_EOL;foreach($this->partsas$part){echo$part,PHP_EOL;}}}// 建造者interfaceBuilder{publicfunctionBuildPartA():void;publicfunctionBuildPartB():void;publicfunctionGetResult():House;}classConcreteBuilder1implementsBuilder{private$product;publicfunction__construct(){$this->product=newHouse();}publicfunctionBuildPartA():void{$this->product->Add('部件A');}publicfunctionBuildPartB():void{$this->product->Add('部件B');}publicfunctionGetResult():House{return$this->product;}}classConcreteBuilder2implementsBuilder{private$product;publicfunction__construct(){$this->product=newHouse();}publicfunctionBuildPartA():void{$this->product->Add('部件X');}publicfunctionBuildPartB():void{$this->product->Add('部件Y');}publicfunctionGetResult():House{return$this->product;}}classDirector{publicfunctionConstruct(Builder$builder){$builder->BuildPartA();$builder->BuildPartB();}}// 测试$director=newDirector();$b1=newConcreteBuilder1();$b2=newConcreteBuilder2();$director->Construct($b1);$p1=$b1->GetResult();$p1->Show();$director->Construct($b2);$p2=$b2->GetResult();$p2->Show();

运行结果:
代码运行结果

18、备忘录模式

描述:类似存档功能,下面实现了一个保存状态案例

**下面直接

上代码

。**

classOriginator{private$state;// 更新当前状态 为备忘录保存的状态publicfunctionSetMeneto(Memento$m){$this->state=$m->GetState();}// 设置存档 将当前状态存入存档publicfunctionCreateMemento(){$m=newMemento();$m->SetState($this->state);return$m;}publicfunctionSetState($state){$this->state=$state;}publicfunctionShowState(){echo$this->state,PHP_EOL;}}// 备忘录classMemento{private$state;publicfunctionSetState($state){$this->state=$state;}publicfunctionGetState(){return$this->state;}}// 代理人 保存备忘录对象classCaretaker{private$memento;publicfunctionSetMemento($memento){$this->memento=$memento;}publicfunctionGetMemento(){return$this->memento;}}// 测试$o=newOriginator();$o->SetState('状态1');$o->ShowState();// 保存状态$c=newCaretaker();$c->SetMemento($o->CreateMemento());$o->SetState('状态2');$o->ShowState();// 还原状态$o->SetMeneto($c->GetMemento());$o->ShowState();

运行结果:
代码运行结果

19、桥接模式

描述:分离开具体的实现类和抽象类。如果单纯继承会有耦合问题,该模式将具体的实现分离出去

**下面直接

上代码

。**

// 实现类interfaceImplementor{publicfunctionOperationImp();}classConcreteImplementorAimplementsImplementor{publicfunctionOperationImp(){echo'具体实现A',PHP_EOL;}}classConcreteImplementorBimplementsImplementor{publicfunctionOperationImp(){echo'具体实现B',PHP_EOL;}}// 抽象类abstractclassAbstraction{protected$imp;publicfunctionSetImplementor(Implementor$imp){$this->imp=$imp;}abstractpublicfunctionOperation();}classBefinedAbstractionextendsAbstraction{publicfunctionOperation(){$this->imp->OperationImp();}}// 测试$impA=newConcreteImplementorA();$impB=newConcreteImplementorB();$ra=newBefinedAbstraction();$ra->SetImplementor($impA);$ra->Operation();$ra->SetImplementor($impB);$ra->Operation();

运行结果:
代码运行结果

20、门面模式

描述:对多个系统进行封装 方便外部调用,也就是MVC的思想

**下面直接

上代码

。**

classFacade{// 定义四个子系统private$subStytemOne;private$subStytemTwo;private$subStytemThree;private$subStytemFour;publicfunction__construct(){$this->subStytemOne=newSubStytemOne();$this->subStytemTwo=newSubStytemTwo();$this->subStytemThree=newSubStytemThree();$this->subStytemFour=newSubStytemFour();}// 调用前两个子系统的功能publicfunctionMethodA(){$this->subStytemOne->MethodOne();$this->subStytemTwo->MethodTwo();}publicfunctionMethodB(){$this->subStytemOne->MethodOne();$this->subStytemTwo->MethodTwo();$this->subStytemThree->MethodThree();$this->subStytemFour->MethodFour();}}classSubStytemOne{publicfunctionMethodOne(){echo'子系统方法一',PHP_EOL;}}classSubStytemTwo{publicfunctionMethodTwo(){echo'子系统方法二',PHP_EOL;}}classSubStytemThree{publicfunctionMethodThree(){echo'子系统方法三',PHP_EOL;}}classSubStytemFour{publicfunctionMethodFour(){echo'子系统方法四',PHP_EOL;}}// 测试$facade=newFacade();$facade->MethodA();$facade->MethodB();

运行结果:
代码运行结果

21、模板方法模式

**下面直接

上代码

。**

abstractclassAbstractClass{publicfunctionTemplateMethod(){$this->PrimitiveOperation1();$this->PrimitiveOperation2();}abstractpublicfunctionPrimitiveOperation1();abstractpublicfunctionPrimitiveOperation2();}classConcreteClassAextendsAbstractClass{publicfunctionPrimitiveOperation1(){echo'具体类A 实现方法1',PHP_EOL;}publicfunctionPrimitiveOperation2(){echo'具体类A 实现方法2',PHP_EOL;}}classConcreteClassBextendsAbstractClass{publicfunctionPrimitiveOperation1(){echo'具体类B 实现方法1',PHP_EOL;}publicfunctionPrimitiveOperation2(){echo'具体类B 实现方法2',PHP_EOL;}}// 测试$c=newConcreteClassA();$c->TemplateMethod();$c=newConcreteClassB();$c->TemplateMethod();

运行结果:
代码运行结果

22、状态模式

描述:通过上下文切换类的状态 就像换了一个类操作。可以解决if else嵌套问题

**下面直接

上代码

。**

// 上下文类classContext{private$state;publicfunctionSetState(State$state):void{$this->state=$state;}publicfunctionRequest():void{$this->state=$this->state->Handle();}}// 实现类interfaceState{publicfunctionHandle():State;}classConcreteStateAimplementsState{publicfunctionHandle():State{echo'当前是A状态',PHP_EOL;returnnewConcreteStateB();}}classConcreteStateBimplementsState{publicfunctionHandle():State{echo'当前是B状态',PHP_EOL;returnnewConcreteStateA();}}// 测试$c=newContext();$stateA=newConcreteStateA();$c->SetState($stateA);$c->Request();$c->Request();$c->Request();

运行结果:
代码运行结果

23、访问者模式

描述:适用于数据结构稳定的结构,例如账单只有收入支出

**下面直接

上代码

。**

interfaceVisitor{functionVisitConcreteElementA(ConcreteElementA$a);functionVisitConcreteElementB(ConcreteElementB$b);}// 一号访问者classConcreteVisitor1implementsVisitor{publicfunctionVisitConcreteElementA(ConcreteElementA$a){echoget_class($a).'被'.get_class($this).'访问',PHP_EOL;}publicfunctionVisitConcreteElementB(ConcreteElementB$b){echoget_class($b).'被'.get_class($this).'访问',PHP_EOL;}}// 二号访问者classConcreteVisitor2implementsVisitor{publicfunctionVisitConcreteElementA(ConcreteElementA$a){echoget_class($a).'被'.get_class($this).'访问',PHP_EOL;}publicfunctionVisitConcreteElementB(ConcreteElementB$b){echoget_class($b).'被'.get_class($this).'访问',PHP_EOL;}}// 实体类interfaceElement{publicfunctionAccept(Visitor$v);}classConcreteElementAimplementsElement{publicfunctionAccept(Visitor$v){$v->VisitConcreteElementA($this);}publicfunctionOperationA(){}}classConcreteElementBimplementsElement{publicfunctionAccept(Visitor$v){$v->VisitConcreteElementB($this);}publicfunctionOperationB(){}}classObjectStructure{private$elements=[];publicfunctionAttach(Element$element){$this->elements[]=$element;}publicfunctionDetach(Element$element){$position=0;foreach($this->elementsas$e){if($e==$element){unset($this->elements[$position]);break;}$position++;}}publicfunctionAccept(Visitor$visitor){foreach($this->elementsas$e){$e->Accept($visitor);}}}// 测试$o=newObjectStructure();// 传入两个实体类$o->Attach(newConcreteElementA());$o->Attach(newConcreteElementB());// 创建访问者$v1=newConcreteVisitor1();$v2=newConcreteVisitor2();$o->Accept($v1);$o->Detach(newConcreteElementA());$o->Accept($v2);

运行结果:
代码运行结果

24、注册树模式

描述:注册树模式通过将对象实例注册到一颗全局的对象树上,就类似将对象统一数组中管理,需要的时候从对象树上采摘的模式设计方法。
无论是通过单例模式、工厂模式还是二者结合生成的对象,都统统插到注册树上。需要使用某个对象的时候直接从注册树上取一下就好,这和我们使用全局变量一样方便实用,而且注册树模式还为其他模式提供了一种非常好的想法。

**下面直接

上代码

。**

classSingle{// 创建单例public$hash;staticprotected$ins=null;finalprotectedfunction__construct(){// 声明为final 防止被子类重写覆盖$this->hash=rand(1,9999);}staticpublicfunctiongetInstance(){if(self::$insinstanceofself){returnself::$ins;}self::$ins=newself();returnself::$ins;}}classRandFactory{// 工厂模式publicstaticfunctionfactory(){returnSingle::getInstance();}}classRegister{// 注册树protectedstatic$objects;// 静态属性 保留值publicstaticfunctionset($alias,$object){self::$objects[$alias]=$object;}publicstaticfunctionget($alias){returnself::$objects[$alias];}publicstaticfunction_unset($alias){unset(self::$objects[$alias]);}}Register::set('rand',RandFactory::factory());$object=Register::get('rand');var_dump($object);

运行结果:
代码运行结果


本文转载自: https://blog.csdn.net/qq_45652915/article/details/127555480
版权归原作者 小红打小蓝 所有, 如有侵权,请联系我们删除。

“23种设计模式合集,只看这一篇就够了”的评论:

还没有评论