PHP中的设计模式及其实际应用浅析

未结帖
0 652
ajian admin_jim 2018-02-07
悬赏:5飞吻

PHP中的设计模式及其实际应用浅析

设计模式在各种语言中都有很重要的应用,每种设计模式都有其特有的优点以及使用场景。接下来,将从单例模式、工厂模式、组合模式以及策略模式四个模式,介绍设计模式及其实际项目中的简单应用。

一、单例模式

单例模式的作用是让这个类只能产生一个实例,适用于创建全局变量

控制一个类只能生成一个实例的方法就是设定静态方法

下面的单例模式示例,创建了web的配置类Config,使得整个web应用程序可以使用同一个配置对象:


[php] view plain copy

  1. <?php  

  2. class Config{  

  3.     static private $_instance = NULL;  

  4.     private $_settings = array();    //用来存储配置信息  

  5.     private function __construct(){}  

  6.     private function __clone(){}  

  7.     static function getInstance(){    //静态方法实例化类  

  8.         if(self::$_instance == NULL){  

  9.             self::$_instance = new Config();  

  10.         }  

  11.         return self::$_instance;  

  12.     }  

  13.     function set($index$value){  

  14.         $this->_settings[$index] = $value;  

  15.     }  

  16.     function get($index){  

  17.             return$this->_settings[$index];  

  18.     }  

  19. }  

  20. ?>  

调用这个类:


[php] view plain copy

  1. <?php  

  2. require(“Config.php”);  

  3. $CONFIG = Config::getInstance();   //实例化第一个对象  

  4. $CONFIG->set(‘live’, ‘true’);  

  5. $TEST = Config::getInstance();   //实例化第二个对象  

  6. $TEST->get(‘live’);  //发现两个对象的live属性是相同的,说明实现了单例模式  

  7.    

如果一个用户调用new()或clone()方法,会创建多个实例,影响了单例模式,为了避免这样的问题,需要添加一个私有的构造函数:

private function __construct(){}
这样当用户调用new()方法创建的时候会报错

 

二、工厂模式

工厂模式用来创建多种不同类型的类的多个对象(不仅仅针对一个类,而是通过这个类可以创建许多其他类的对象)

例子:根据用户选择的图形,创建相应的图形


[php] view plain copy

  1. <?php  

  2. abstract class ShapeFactory(){  

  3. static function Create($type,array $size){  

  4.     switch($type){  

  5.         case ‘rectangle’:  

  6.               return new Rectangle($size[0], $size[1]);  

  7.               break;  

  8.         case ‘triangle’:  

  9.               return new Triangle($size[0], $size[1],$size[2]);  

  10.              break;  

  11.     }  

  12. }  

  13. }  

上面的方法利用了之前定义好的各种图形类

调用:


[php] view plain copy

  1. <?php  

  2. if(isset($_GET[‘shape’], $_GET[‘dimensions’])){  

  3. $obj =ShapeFactory::Create($_GET[‘shape’], $_GET[‘dimensions’]);  

  4. //…一些输出操作  

  5. }  

  6. unset($obj);  

  7. ?>  

这个工厂类的功能实现了,它可以根据用户的输入进行不同类的创建

 

 

三、组合模式

组合模式适用于当我们的一个对象可能代表一个单一的实体,或者一个组合的实体,但是仍然需要通过同样的方式被使用的情形

比如表单中,对整个表单或者表单中的某个元素可能都需要执行相同的操作

组合模式从一个基类开始:


[php] view plain copy

  1. abstract class FormComponent{  

  2. abstract functionadd(FormComponent $obj);  

  3. abstract function remove(FormComponent$obj);   //以上两个是核心方法  

  4. }  

  5. //定义一个Form类  

  6. class Form extends FormComponent{  

  7. privates $_elements = array();  

  8. function add(FormComponent $obj){  

  9.     $this->_elements[] = $obj;  

  10. }  

  11. }  

  12. //定义一个FormElement类,可以加到Form中  

  13. class FormElement extends FormComponent{  

  14. function add(FormComponent $obj){  

  15.     return $obj;  

  16. }  

  17. }  

  18. //实例化form和formelement对象,并将formelement对象添加到form中  

  19. $form = new Form();  

  20. $email = new FormElement();  

  21. $form->add($email);  //向form中添加元素  

[php] view plain copy

  1.   


四、策略模式

策略模式可以根据用户的选择执行不同的方法

当我们使用的类比较简单,但是又相互不关联,只是在特定行为上有所差异的场景下,策略模式就会十分有用

比如对字符串的过滤,有两种过滤模式:

1.      取出HTML多余的空格(HtmlFilter)

2.      过滤脏话(SwearFilter)

先定义一个过滤接口Filter,上面两个方法是对这个接口的实现


[php] view plain copy

  1. interface Filter{  

  2.     functionfilter($str);  

  3. }  

  4. class HtmlFilter implements Filter{  

  5. function filter($str){  

  6.     //实现该功能的代码  

  7.     return $str;  

  8. }  

  9. }  

  10. class SwearFilter implements Filter{  

  11. function filter($str){  

  12.     //实现该功能的代码  

  13.     return $str;  

  14. }  

  15. }  

另外还需要实现一个类来使用这些过滤器:


[php] view plain copy

  1. class FormData{  

  2. private $_data = NULL;  

  3. function __construct($input){  

  4.     $this->_data = $input;  

  5. }  

  6. function process(Filter$type){  //这个方法传入一个Filter类型的对象,根据出入对象选择方法  

  7.     $this->_data =$type.filter($this->_data);   //使用选择的方法进行过滤  

  8. }  

  9. }  

使用这个策略模式的方法如下:


[php] view plain copy

  1. $form = new FormData($someUserInput);  //创建一个执行表单过滤的对象  

  2. $form->process(new HtmlFilter());  //调用process方法执行过滤  


以上就是四种基本设计模式的介绍以及实际应用的方法,多利用设计模式可以让我们更方便的实现功能,同时让代码变得更加优雅。


热忱回答0


最近热帖

近期热议

  1. javascript——prototype与__proto 9
  2. Mysql 中出现的Data truncated for column 3
  3. 在nginx中使用x-sendfile的解决方案 3
  4. 高版本jQuery面插件实现Ajax上传图片 1
  5. Thinkphp Socket.class.php 类的使用 1
  6. 使用ionic3创建第一个App 0
  7. ios-oc html5 0
  8. nginx.conf 0
  9. 基于ionic3.4.0的项目搭建 0
  10. php 缩略图 0