资讯专栏INFORMATION COLUMN

PHP设计模式之装饰器模式

Olivia / 2472人阅读

摘要:装饰器模式解决的问题修饰模式,是面向对象编程领域中,一种动态地往一个类中添加新的行为的设计模式。可以看到,这样的模型很具有扩者性,我们可以轻松的添加其他装饰器给区域对象,且不需要更改其他类,

装饰器模式解决的问题

修饰模式,是面向对象编程领域中,一种动态地往一个类中添加新的行为的设计模式。就功能而言,修饰模式相比生成子类更为灵活,这样可以给某个对象而不是整个类添加一些功能。

将所有的功能建立在继承体系上会导致系统中的类越来越多,而且当你又要修改他们的分支的时候,可能还会出现重复代码

我们来看下面这个例子,为了计算一块区域的价值,我们把代码写成下面这个样子:

</>复制代码

  1. // 区域抽象类
  2. abstract class Area
  3. {
  4. abstract public function treasure();
  5. }
  6. //森林类,价值100
  7. class Forest extends Area
  8. {
  9. public function treasure()
  10. {
  11. return 100;
  12. }
  13. }
  14. //沙漠类,价值10
  15. class Desert extends Area
  16. {
  17. function function treasure()
  18. {
  19. return 10;
  20. }
  21. }

上面的代码看上去好像没有什么问题,但是如果需要给一片被破坏的森林计算价值怎么办呢,添加DamageForest子类么?显然是不可行的,因为很有可能还有其他很多类型叠加的类,这会导致类中可能会有重复的代码,且子类也会变的越来越多。

装饰器模式的实现

装饰器模式使用组合和委托,而不是使用继承来解决上述的问题,我们在来看下面改良过的代码:

</>复制代码

  1. // 区域抽象类
  2. abstract class Area
  3. {
  4. abstract public function treasure();
  5. }
  6. //森林类,价值100
  7. class Forest extends Area
  8. {
  9. public function treasure()
  10. {
  11. return 100;
  12. }
  13. }
  14. //沙漠类,价值10
  15. class Desert extends Area
  16. {
  17. function function treasure()
  18. {
  19. return 10;
  20. }
  21. }
  22. //区域类的装饰器类
  23. abstract class AreaDecorateor extends Area
  24. {
  25. protected $_area = null;
  26. public function __construct(Area $area)
  27. {
  28. $this->_area = $area;
  29. }
  30. }
  31. //被破坏了后的区域,价值只有之前的一半
  32. class Damaged extends AreaDecorateor
  33. {
  34. public function treasure()
  35. {
  36. return $this->_area->treasure() * 0.5;
  37. }
  38. }
  39. //现在我们来获取被破坏的森林类的价值
  40. $damageForest = new Damaged(new Forest());
  41. echo $damageForest->treasure(); //返回50
总结

上面的调用方法很像建立了一个管道,装饰器模式经常被用于创建过滤器。

可以看到,这样的模型很具有扩者性,我们可以轻松的添加其他装饰器给区域对象,且不需要更改其他类,

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/21361.html

相关文章

  • PHP设计模式装饰模式

    摘要:概念装饰器模式允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。 概念 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的...

    CloudwiseAPM 评论0 收藏0
  • PHPer月工作总结观察者&装饰模式

    摘要:我们可以把取消发货单和取消订单看成一个被观察或被订阅的类实例的对象,一旦发生取消行为,我们立即通知各个观察者做出相对应的行为。装饰器模式装饰器思想,不管以前业务逻辑,甚至不去读,调用之前的接口装饰上新的数据,达到自己的目的。 前言 还是每月的目标至少写一篇文章,一晃八月份就要过去了,这个月依然没有什么产出,毫无疑问最近的状态就是不停的工作,不停的加班。所以还是把最近工作进行一个总结,首...

    MadPecker 评论0 收藏0
  • php装饰模式

    装饰者模式概念 动态地将责任附加到对象上,若要扩展功能,装饰者提供了比继承更有弹性的替代方案 装饰者模式结构图 showImg(https://segmentfault.com/img/bVKmnl?w=1040&h=795); 装饰者角色 1.被装饰者基类(Compoent):对象组件2.待装饰对象(ConcreteComponent):具体组件角色,即将要被装饰增加功能的类3.装饰者基类(De...

    pf_miles 评论0 收藏0
  • php设计模式

    摘要:我们今天也来做一个万能遥控器设计模式适配器模式将一个类的接口转换成客户希望的另外一个接口。今天要介绍的仍然是创建型设计模式的一种建造者模式。设计模式的理论知识固然重要,但 计算机程序的思维逻辑 (54) - 剖析 Collections - 设计模式 上节我们提到,类 Collections 中大概有两类功能,第一类是对容器接口对象进行操作,第二类是返回一个容器接口对象,上节我们介绍了...

    Dionysus_go 评论0 收藏0
  • php设计模式

    摘要:我们今天也来做一个万能遥控器设计模式适配器模式将一个类的接口转换成客户希望的另外一个接口。今天要介绍的仍然是创建型设计模式的一种建造者模式。设计模式的理论知识固然重要,但 计算机程序的思维逻辑 (54) - 剖析 Collections - 设计模式 上节我们提到,类 Collections 中大概有两类功能,第一类是对容器接口对象进行操作,第二类是返回一个容器接口对象,上节我们介绍了...

    vspiders 评论0 收藏0

发表评论

0条评论

Olivia

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<