PHP中常用的几种设计模式

PHP中常用的几种设计模式

1.工厂模式 

工厂模式是一种类,它具有为您创建对象的某些方法。您可以使用工厂类创建对象,而不直接使用 new。这样,如果您想要更改所创建的对象类型,只需更改该工厂即可。使用该工厂的所有代码会自动更改。

01 <?php
02 interface IUser    //定义一个接口
03 {
04   function getName();
05 }
06  
07 class User implements IUser     //定义一个类继承该接口,并且实现该接口的所有方法
08 {
09   public function __construct( $id ) { }
10  
11   public function getName()
12   {
13     return "Jack";
14   }
15 }
16  
17 class UserFactory    //定义一个类包含公用静态方法可以直接调用,而不需要NEW的实例化
18 {
19   public static function Create( $id )
20   {
21     return new User( $id );
22   }
23 }
24  
25 $uo = UserFactory::Create( 1 );
26 echo$uo->getName()."/n" );
27 ?>

 另一种更简洁的工厂模式:

01 <?php
02 interface IUser   //定义一个接口
03 {
04   function getName();
05 }
06  
07 class User implements IUser  //继承接口的类
08 {
09   public static function Load( $id //静态的载入本类的方法并返回对象
10   {
11         return new User( $id );
12   }
13  
14   public static function Create( )   // 同上,但不需要参数
15   {
16         return new User( null );
17   }
18  
19   public function __construct( $id ) { }
20  
21   public function getName()  //实现接口中的方法
22   {
23     return "Jack";
24   }
25 }
26  
27 $uo = User::Load( 1 );
28 echo$uo->getName()."/n" );
29 ?>

 2、单元素模式:

某些应用程序资源是独占的,因为有且只有一个此类型的资源。例如,通过数据库句柄到数据库的连接是独占的。您希望在应用程序中共享数据库句柄,因为在保持连接打开或关闭时,它是一种开销,在获取单个页面的过程中更是如此。

单元素模式可以满足此要求。如果应用程序每次包含且仅包含一个对象,那么这个对象就是一个单元素(Singleton)。清单 3 中的代码显示了 PHP V5 中的一个数据库连接单元素。

 

您可以使用全局变量存储数据库句柄,但是,该方法仅适用于较小的应用程序。在较大的应用程序中,应避免使用全局变量,并使用对象和方法访问资源。

01 <?php
02 require_once("DB.php");  //载入数据库配置文件
03  
04 class DatabaseConnection  //数据库连接类
05 {
06   public static function get() //静态共有方法()
07   {
08     static $db = null;  //静态变量设为空
09     if $db == null )  //如果静态变量为空才执行下面的操作
10       $db new DatabaseConnection();
11     return $db;
12   }
13  
14   private $_handle = null;  //设定一个私有的变量
15  
16   private function __construct() //设定一个私有的初始化方法
17   {
19     $this->_handle =& DB::Connect( $dsnarray() );
20   }
21    
22   public function handle()
23   {
24     return $this->_handle;
25   }
26 }
27  
28 print"Handle = ".DatabaseConnection::get()->handle()."/n" );
29 print"Handle = ".DatabaseConnection::get()->handle()."/n" );
30 ?>

3、观察者模式 

观察者模式为您提供了避免组件之间紧密耦合的另一种方法。该模式非常简单:一个对象通过添加一个方法(该方法允许另一个对象,即观察者 注册自己)使本身变得可观察。当可观察的对象更改时,它会将消息发送到已注册的观察者。这些观察者使用该信息执行的操作与可观察的对象无关。结果是对象可以相互对话,而不必了解原因。

一个简单示例是系统中的用户列表。清单 4 中的代码显示一个用户列表,添加用户时,它将发送出一条消息。添加用户时,通过发送消息的日志观察者可以观察此列表。

01 <?php
02 interface IObserver  //定义个一个接口
03 {
04   function onChanged( $sender$args );
05 }
06  
07 interface IObservable //定义个一个接口
08 {
09   function addObserver( $observer );
10 }
11  
12 class UserList implements IObservable //继承第二个接口
13 {
14   private $_observers array();
15  
16   public function addCustomer( $name )
17   {
18     foreach$this->_observers as $obs )
19       $obs->onChanged( $this$name );//调用观察者接口来使用多个接口
20   }
21  
22   public function addObserver( $observer //添加观察者模式接口
23   {
24     $this->_observers []= $observer;
25   }
26 }
27  
28 class UserListLogger implements IObserver //继承第一个接口
29 {
30   public function onChanged( $sender$args )
31   {
32     echo"'$args' added to user list/n" );
33   }
34 }
35  
36 class UserListLogger2 implements IObserver //继承第一个接口2
37 {
38   public function onChanged( $sender$args )
39   {
40     echo"'$args' 2222222222222222 list/n" );
41   }
42 }
43  
44 $ul new UserList();
45 $ul->addObserver( new UserListLogger() );
46 $ul->addObserver( new UserListLogger2() );
47 $ul->addCustomer( "Jack" );
48 ?>

 

4、命令链模式

命令链模式以松散耦合主题为基础,发送消息、命令和请求,或通过一组处理程序发送任意内容。每个处理程序都会自行判断自己能否处理请求。如果可以,该请求被处理,进程停止。您可以为系统添加或移除处理程序,而不影响其他处理程序。

 

总体来说命令链模式就是让系统定义多个执行接口,而通过一个命令链接口来执行!

01 <?php
02 interface ICommand   //定义一个接口
03 {
04   function onCommand( $name$args );
05 }
06  
07 class CommandChain  //一个命令链接口类
08 {
09   private $_commands array();
10  
11   public function addCommand( $cmd )//增加命令链接口
12   {
13     $this->_commands []= $cmd;
14   }
15  
16   public function runCommand( $name$args )//执行命令链函数接口
17   {
18     foreach$this->_commands as $cmd )
19     {
20       if $cmd->onCommand( $name$args ) )
21         return;
22     }
23   }
24 }
25  
26 class UserCommand implements ICommand  //定义一个接口类
27 {
28   public function onCommand( $name$args )
29   {
30     if $name != 'addUser' return false;
31     echo"UserCommand handling 'addUser'/n" );
32     return true;
33   }
34 }
35  
36 class MailCommand implements ICommand  //定义一个接口类
37 {
38   public function onCommand( $name$args )
39   {
40     if $name != 'mail' return false;
41     echo"MailCommand handling 'mail'/n" );
42     return true;
43   }
44 }
45  
46 $cc new CommandChain();
47 $cc->addCommand( new UserCommand() );
48 $cc->addCommand( new MailCommand() );
49 $cc->runCommand( 'addUser', null );
50 $cc->runCommand( 'mail', null );
51 ?>

 

5、策略模式

 

我们讲述的最后一个设计模式是策略模式。在此模式中,算法是从复杂类提取的,因而可以方便地替换。例如,如果要更改搜索引擎中排列页的方法,则策略模式是一个不错的选择。思考一下搜索引擎的几个部分部分遍历页面,一部分对每页排列,另一部分基于排列的结果排序。在复杂的示例中,这些部分都在同一个类中。通过使用策略模式,您可将排列部分放入另一个类中,以便更改页排列的方式,而不影响搜索引擎的其余代码。

01 <?php
02 interface IStrategy  //定义一个接口
03 {
04   function filter( $record );
05 }
06  
07 class FindAfterStrategy implements IStrategy  //继承接口
08 {
09   private $_name;
10  
11   public function __construct( $name )
12   {
13     $this->_name = $name;
14   }
15  
16   public function filter( $record )
17   {
18     return strcmp$this->_name, $record ) <= 0;//返回两个字符串的大小
19   }
20 }
21  
22 class RandomStrategy implements IStrategy //继承接口随机比较
23 {
24   public function filter( $record )
25   {
26     return rand( 0, 1 ) >= 0.5;
27   }
28 }
29  
30 class UserList  
31 {
32   private $_list array();
33  
34   public function __construct( $names )   //用户注册
35   {
36     if $names != null )
37     {
38       foreach$names as $name )
39       {
40         $this->_list []= $name;
41       }
42     }
43   }
44  
45   public function add( $name )
46   {
47     $this->_list []= $name;
48   }
49  
50   public function find( $filter )  //策略模式接口 (传递进来一个方法对象)
51   {
52     $recs array();
53     foreach$this->_list as $user )
54     {
55       if $filter->filter( $user ) )//将传递进来的名字和_name比较
56         $recs []= $user;
57     }
58     return $recs;
59   }
60 }
61  
62 $ul new UserList( array"Andy""Jack""Lori""Megan" ) );
63 $f1 $ul->find( new FindAfterStrategy( "J" ) );//初始化_name 并赋值
64 print_r( $f1 );
65  
66 $f2 $ul->find( new RandomStrategy() );
67 print_r( $f2 );
68 ?>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值