php设计模式 Strategy(策略模式)

时间:2022-09-22 17:21:09

抽象策略(Strategy)角色:定义所有支持的算法的公共接口。通常是以一个接口或抽象来实现。Context使用这个接口来调用其ConcreteStrategy定义的算法。

具体策略(ConcreteStrategy)角色:以Strategy接口实现某具体算法。

环境(Context)角色:持有一个Strategy类的引用,用一个ConcreteStrategy对象来配置

php设计模式 Strategy(策略模式)

核心代码

  1. <?php 
  2. interface Strategy { // 抽象策略角色,以接口实现 
  3.   public function algorithmInterface(); // 算法接口 
  4.   
  5. class ConcreteStrategyA implements Strategy { // 具体策略角色A  
  6.   public function algorithmInterface() {} 
  7.   
  8. class ConcreteStrategyB implements Strategy { // 具体策略角色B  
  9.   public function algorithmInterface() {} 
  10.   
  11. class ConcreteStrategyC implements Strategy { // 具体策略角色C 
  12.   public function algorithmInterface() {} 
  13.   
  14. class Context { // 环境角色 
  15.   private $_strategy; 
  16.   public function __construct(Strategy $strategy) { 
  17.     $this->_strategy = $strategy; 
  18.   }  
  19.   public function contextInterface() { 
  20.     $this->_strategy->algorithmInterface(); 
  21.   } 
  22.   
  23. // client 
  24. $strategyA = new ConcreteStrategyA(); 
  25. $context = new Context($strategyA); 
  26. $context->contextInterface(); 
  27.   
  28. $strategyB = new ConcreteStrategyB(); 
  29. $context = new Context($strategyB); 
  30. $context->contextInterface(); 
  31.   
  32. $strategyC = new ConcreteStrategyC(); 
  33. $context = new Context($strategyC); 
  34. $context->contextInterface(); 

其他代码

  1. <?php  
  2. /**  
  3. 策略模式(Strategy.php)  
  4.  
  5. * 定义一系列算法,把它们一个个封装起来,并且使它们可相互替换,使用得算法的变化可独立于使用它的客户  
  6.  
  7. */ 
  8.   
  9. // ---以下是一系列算法的封闭----  
  10. interface CacheTable  
  11. {  
  12. public function get($key);  
  13. public function set($key,$value);  
  14. public function del($key);  
  15. }  
  16.   
  17. // 不使用缓存  
  18. class NoCache implements CacheTable  
  19. {  
  20. public function __construct(){  
  21. echo "Use NoCache<br/>";  
  22. }  
  23.   
  24. public function get($key)  
  25. {  
  26. return false;  
  27. }  
  28.   
  29. public function set($key,$value)  
  30. {  
  31. return true;  
  32. }  
  33.   
  34. public function del($key)  
  35. {  
  36. return false;  
  37. }  
  38. }  
  39.   
  40. // 文件缓存  
  41. class FileCache implements CacheTable  
  42. {  
  43. public function __construct()  
  44. {  
  45. echo "Use FileCache<br/>";  
  46. // 文件缓存构造函数  
  47. }  
  48.   
  49. public function get($key)  
  50. {  
  51. // 文件缓存的get方法实现  
  52. }  
  53.   
  54. public function set($key,$value)  
  55. {  
  56. // 文件缓存的set方法实现  
  57. }  
  58.   
  59. public function del($key)  
  60. {  
  61. // 文件缓存的del方法实现  
  62. }  
  63. }  
  64.   
  65. // TTServer  
  66. class TTCache implements CacheTable  
  67. {  
  68. public function __construct()  
  69. {  
  70. echo "Use TTCache<br/>";  
  71. // TTServer缓存构造函数  
  72. }  
  73.   
  74. public function get($key)  
  75. {  
  76. // TTServer缓存的get方法实现  
  77. }  
  78.   
  79. public function set($key,$value)  
  80. {  
  81. // TTServer缓存的set方法实现  
  82. }  
  83.   
  84. public function del($key)  
  85. {  
  86. // TTServer缓存的del方法实现  
  87. }  
  88. }  
  89.   
  90. // -- 以下是使用不用缓存的策略 ------  
  91. class Model  
  92. {  
  93. private $_cache;  
  94. public function __construct()  
  95. {  
  96. $this->_cache = new NoCache();  
  97. }  
  98.   
  99. public function setCache($cache)  
  100. {  
  101. $this->_cache = $cache;  
  102. }  
  103. }  
  104.   
  105. class UserModel extends Model  
  106. {  
  107. }  
  108.   
  109. class PorductModel extends Model  
  110. {  
  111. public function __construct()  
  112. {  
  113. $this->_cache = new TTCache();  
  114. }  
  115. }  
  116.   
  117. // -- 实例一下 ---  
  118. $mdlUser = new UserModel();  
  119. $mdlProduct = new PorductModel();  
  120. $mdlProduct->setCache(new FileCache()); // 改变缓存策略  
  121. ?> 

具体的大家可以多关注一下服务器之家以前发布的文章