当前位置: 首页 > 后端技术 > PHP

PHP设计模式_6

时间:2023-03-30 04:56:41 PHP

工厂模式的装饰器模式说完了,我们再研究一些其他的模式。不知道大家试过女装吗?据说有很多女装大男人的程序员。事实上,今天的装饰者模式与化妆非常相似。相信如果有程序猿MM,我马上就能把这种设计模式给大家讲解清楚。Gof类图和解释装饰两个字,我们暂且把他化为妆。首先得有脸,然后打底,再上妆。可以早上化个淡妆上班,也可以化个浓妆,下班出去玩玩。当然码农们下班的时间刚好赶上夜场的下半场。话说回来,不管你化了多少妆,脸还是你的脸,可能化作别人不认识的另一个人,但还是你的脸。这就是装饰器,对对象(人脸)进行各种装饰(化妆),使人脸更好看(增加责任)。GoF定义:动态地给一个对象添加一些额外的职责。在添加功能方面,Decorator模式比生成子类GoF类图代码实现接口Component{publicfunctionoperation();}classConcreteComponentimplementsComponent{publicfunctionoperation(){echo"I'mface!"更灵活。.PHP_EOL;}}就是一个很简单的接口和一个实现,这里我们把具体的实现类当成一张脸!抽象类Decorator实现Component{protected$component;公共函数__construct(Component$component){$this->component=$component;}}抽象装饰器类实现了Component接口,但没有实现operation()方法,让子类去实现。这里主要保存了一个Componet的引用,后面我们会对其进行装饰。对应上面的具体类,我们就要准备脸妆啦!类ConcreteDecoratorA扩展装饰器{public$addedState=1;//没有实际的属性,只是和ConcreteDecoratorB不同publicfunctionoperation(){echo$this->component->operation().“推”。$this->addedState。“奶油!”.PHP_EOL;}}classConcreteDecoratorBextendsDecorator{publicfunctionoperation(){$this->component->operation();$this->addedBehavior();}//没有真正的方法,只是不同于ConcreteDecoratorApublicfunctionaddedBehavior(){echo"Push2cream!".PHP_EOL;}}两个具体的装饰器。这里我涂了两次面霜,毕竟我是个纯爷们,对于彩妆我是真的不懂。看来第一步应该是打粉底吧?但是这一次,我们的两个装饰器实现的是在脸上涂上两层奶油。从代码中可以看出我们一直在包装具体的ConcreteComponent对象然后往下走,其实我们已经包装了它的operation()方法两次,每次都添加A上添加的属性和方法不用担心和B装饰器。它们只是在GoF类图中用来区分这两个装饰器不是一个东西。每个装饰器都可以做很多其他的事情。Component对象不一定只有operation()方法。我们可以选择性地装饰对象中的全部或部分方法,就像继承了Component一样。一路重写直接子类是不够的。为什么这么难?亲,理解组合的概念。我们的Decorator父类是对真实对象的引用。它解耦自己。我们只包装真实的对象。您不能实例化装饰器以直接使用它。还是不明白?好处呢?你敢乱改旧系统的类和方法吗?当你想为前辈写的强大(S)代码扩展新功能时,不妨试试装饰器,说不定会有奇效呢!手机做不了某米,某O,某伟,这玩不下去了,好吧,小伙伴们,还是专心做手机壳吧!好吧,我先准备了一个透明壳(Component),看着有点难看,没办法,谁叫我哥们穷。让我们给XX的添加各种纯色(DecoratorA1),然后在背面打印各种颜色的植物(DecoratorB1);XX的手机最近喜欢找流量明显是代言,所以我会给他用各种手机壳。炫彩(DecoratorA2)和名人卡通头像(DecoratorB2);最后一点,看来手机已经开始引领行业潮流了,折叠屏是不是要毁了我卖手机壳的生意呢!!好吧,我不为你们做,让我们和我的XX和XX一起出去玩吧!!完整代码:装饰器模式实例继续发送短信。之前我们使用工厂模式来解决多个短信运营商的问题。这次我们要解决的是短信内容模板的问题。对于促销短信,根据最新的广告法,不能出现“全国第一”、“世界第一”等字眼。当然,我们不能使用一些不文明的用语。现在的情况是这样的。很久以前就有一个短信模板类,里面的内容是固定的。旧系统仍然使用这个模板。老系统面向内部员工,对语言内容要求不高。新系统需要发送到全网,即内部用户和外部用户都必须发送。这时候我们就可以使用装饰器模式来包装旧系统的短信模板。其实简单来说,我们只是用装饰器来做文本替换的功能。好处呢?当然,可以在不改变原模板类中的方法的情况下,修改和扩展旧模板的内容。短信发送类图完整源码:短信发送装饰器方法template=$template;}}//过滤广告法不允许的新词汇类AdFilterDecoratorMessageextendsDecoratorMessageTemplate{publicfunctionmessage(){returnstr_replace('NationalFirst','NationalSecond',$this->template->message());}}//使用我们大数据部同事自动生成的新词库过滤敏感词。此过滤不是强制性的。您可以选择使用classSensitiveFilterDecoratorMessageextendsDecoratorMessageTemplate{public$bigDataFilterWords=['oxX'];public$bigDataReplaceWords=['易于使用'];publicfunctionmessage(){返回str_replace($this->bigDataFilterWords,$this->bigDataReplaceWords,$this->template->message());}}//客户端,发送接口,需要使用模板发送短信类Message{public$msgType='old';publicfunctionsend(MessageTemplate$mt){//发送出去if($this->msgType=='old'){echo'为内网用户发送'.$mt->消息()。PHP_EOL;}elseif($this->msgType=='new'){echo'发送给所有网络用户'.$mt->消息()。PHP_EOL;}}}$template=newCouponMessageTemplate();$message=newMessage();//老系统不需要过滤,只有内部用户可以看到$message->send($template);//新的系统面向全网发布,需要过滤内容$message->msgType='new';$template=newAdFilterDecoratorMessage($template);$template=newSensitiveFilterDecoratorMessage($template);//过滤后发送$message->send($template);装饰器最大的优点:一是在不改变原有代码的情况下,在原有代码中扩充内容,开放封闭原则;第二,每个装饰器完成自己的功能,职责单一;第三,以组合体会传承的感觉;最适合:旧系统扩展时要小心:太多的装饰器会让你感到困惑。并不是所有的装饰方法都是一样的。其实装饰器更多的应该是用来装饰对象,扩展对象。这里我们都是为一个方法的输出进行装饰,但是仅针对本文而言,装饰器的应用其实更为广泛。装饰器的特点是都继承由于是主接口或类,这样做的好处是返回的对象是相同的抽象数据,具有相同的行为属性,否则就不是修饰前的对象,而是一个新的对象。这个例子其实很勉强。《Head First设计模式》中提到了这种设计模式。这种设计模式被Java的I/O系列接口所采用:FileInputStream、LineNumberInputStream、BufferInputStream等Laravel框架中的中间件流水线。这里其实是多种模式的综合应用,同样适用于装饰器模式:【LaravelHTTP——管道中间件装饰器模式源码解析】(https://learnku.com/articles/...另外,在Laravel中,日志处理这也是Monolog的一个摆设,有兴趣的同学可以去了解下一期的亮点,大不了,你知道电源适配器吗?你见过变压器吗?你可能会也可能不会用过,但是你一定听说过这个非常非常有名的适配器型号,各种媒体平台都可以搜索到【硬核项目经理】