当前位置:Gxlcms > PHP教程 > PHP设计模式之访问者模式

PHP设计模式之访问者模式

时间:2021-07-01 10:21:17 帮助过:49人阅读

访问者模式实际上是让外部类能够获取树形结构的每个节点的对象,对每个对象进行操作的模式,它让我们在不改动原有树形结构的基础上扩展功能,比如统计等等。

在这种模式下,必须有的几个要素:

1、具体的元素对象,访问者实际要访问的位置(即节点)

2、稳定的树形结构,每个节点都是一个元素对象,一般在组合模式下比较多,它提供给了让访问者能够进行访问的实际位置(即访问者访问的是具体的属性结构的某个节点的实例化对象);

3、访问者接口,这里定义了访问者的接口方法,这是个在每个节点都会用到的方法;用以节点处引用访问者,从而使得访问者能够访问当前节点。

4、访问者的具体实现,继承了访问者接口,以实现接口方法

  1. //定义元素接口
  2. abstract class User
  3. {
  4. public function getPoint()
  5. {
  6. return rand();//改数据应该由数据库中读取,这里就直接模拟某个值了、
  7. }
  8. //这里的accept方法用于把访问者引入,在这个方法里,$visitor访问者可以通过User类获取需要的数据进而进行相应的操作。
  9. abstract function accept(UserVisitor $visitor);
  10. }
  11. //定义元素接口
  12. class VipUser extends User
  13. {
  14. //在这里getPoint()具体实现就由接口中实现了
  15. //在这里就把当前对象传递给了visitor访问者,在访问者类的visitVip方法中就能根据$this获取必要的数据进行相应的操作
  16. public function accept(UserVisitor $vitor)
  17. {
  18. $vitor->visitVip($this);
  19. }
  20. }
  21. class NormalUser extends User
  22. {
  23. //同上的getPoint()具体实现就由接口中实现了
  24. //同VipUser类中的accept
  25. public function accept(UserVisitor $vitor)
  26. {
  27. $vitor->visitNormal($this);
  28. }
  29. }
  30. //定义访问者接口
  31. abstract class UserVisitor
  32. {
  33. //访问者必须要实现的访问不同用户的接口方法
  34. abstract function visitVip(User $user);
  35. abstract function visitNormal(User $user);
  36. }
  37. //积分操作的访问者实现
  38. class PointActVisitor extends UserVisitor
  39. {
  40. public function visitVip(User $user)
  41. {
  42. echo 'Vip用户+10分<br>';
  43. }
  44. public function visitNormal(User $user)
  45. {
  46. echo 'Normal用户+5分<br>';
  47. }
  48. }
  49. //用户树形结构
  50. class Users
  51. {
  52. protected $users;
  53. public function addUser(User $user)
  54. {
  55. $this->users[] = $user;
  56. }
  57. }

以上就介绍了PHP设计模式之访问者模式,包括了方面的内容,希望对PHP教程有兴趣的朋友有所帮助。

人气教程排行