PHP中常用的几种设计模式
来源:互联网 发布:php限制帐号多登 编辑:程序博客网 时间:2024/05/17 22:05
1.工厂模式
工厂模式是一种类,它具有为您创建对象的某些方法。您可以使用工厂类创建对象,而不直接使用 new
。这样,如果您想要更改所创建的对象类型,只需更改该工厂即可。使用该工厂的所有代码会自动更改。
<?phpinterface IUser //定义一个接口{ function getName();}class User implements IUser //定义一个类继承该接口,并且实现该接口的所有方法{ public function __construct( $id ) { } public function getName() { return "Jack"; }}class UserFactory //定义一个类包含公用静态方法可以直接调用,而不需要NEW的实例化{ public static function Create( $id ) { return new User( $id ); }}$uo = UserFactory::Create( 1 );echo( $uo->getName()."/n" );?>
<?phpinterface IUser //定义一个接口{ function getName();}class User implements IUser //继承接口的类{ public static function Load( $id ) //静态的载入本类的方法并返回对象 { return new User( $id ); } public static function Create( ) // 同上,但不需要参数 { return new User( null ); } public function __construct( $id ) { } public function getName() //实现接口中的方法 { return "Jack"; }}$uo = User::Load( 1 );echo( $uo->getName()."/n" );?>
单元素模式:
某些应用程序资源是独占的,因为有且只有一个此类型的资源。例如,通过数据库句柄到数据库的连接是独占的。您希望在应用程序中共享数据库句柄,因为在保持连接打开或关闭时,它是一种开销,在获取单个页面的过程中更是如此。
单元素模式可以满足此要求。如果应用程序每次包含且仅包含一个对象,那么这个对象就是一个单元素(Singleton)。清单 3 中的代码显示了 PHP V5 中的一个数据库连接单元素。
您可以使用全局变量存储数据库句柄,但是,该方法仅适用于较小的应用程序。在较大的应用程序中,应避免使用全局变量,并使用对象和方法访问资源。
<?phprequire_once("DB.php"); //载入数据库配置文件class DatabaseConnection //数据库连接类{ public static function get() //静态共有方法() { static $db = null; //静态变量设为空 if ( $db == null ) //如果静态变量为空才执行下面的操作 $db = new DatabaseConnection(); return $db; } private $_handle = null; //设定一个私有的变量 private function __construct() //设定一个私有的初始化方法 { $dsn = 'mysql://root:password@localhost/photos'; $this->_handle =& DB::Connect( $dsn, array() ); } public function handle() { return $this->_handle; }}print( "Handle = ".DatabaseConnection::get()->handle()."/n" );print( "Handle = ".DatabaseConnection::get()->handle()."/n" );?>
观察者模式为您提供了避免组件之间紧密耦合的另一种方法。该模式非常简单:一个对象通过添加一个方法(该方法允许另一个对象,即观察者 注册自己)使本身变得可观察。当可观察的对象更改时,它会将消息发送到已注册的观察者。这些观察者使用该信息执行的操作与可观察的对象无关。结果是对象可以相互对话,而不必了解原因。
一个简单示例是系统中的用户列表。清单 4 中的代码显示一个用户列表,添加用户时,它将发送出一条消息。添加用户时,通过发送消息的日志观察者可以观察此列表。
<?phpinterface IObserver //定义个一个接口{ function onChanged( $sender, $args );}interface IObservable //定义个一个接口{ function addObserver( $observer );}class UserList implements IObservable //继承第二个接口{ private $_observers = array(); public function addCustomer( $name ) { foreach( $this->_observers as $obs ) $obs->onChanged( $this, $name );//调用观察者接口来使用多个接口 } public function addObserver( $observer ) //添加观察者模式接口 { $this->_observers []= $observer; }}class UserListLogger implements IObserver //继承第一个接口{ public function onChanged( $sender, $args ) { echo( "'$args' added to user list/n" ); }}class UserListLogger2 implements IObserver //继承第一个接口2{ public function onChanged( $sender, $args ) { echo( "'$args' 2222222222222222 list/n" ); }}$ul = new UserList();$ul->addObserver( new UserListLogger() );$ul->addObserver( new UserListLogger2() );$ul->addCustomer( "Jack" );?>
命令链模式
命令链模式以松散耦合主题为基础,发送消息、命令和请求,或通过一组处理程序发送任意内容。每个处理程序都会自行判断自己能否处理请求。如果可以,该请求被处理,进程停止。您可以为系统添加或移除处理程序,而不影响其他处理程序。
总体来说命令链模式就是让系统定义多个执行接口,而通过一个命令链接口来执行!
<?phpinterface ICommand //定义一个接口{ function onCommand( $name, $args );}class CommandChain //一个命令链接口类{ private $_commands = array(); public function addCommand( $cmd )//增加命令链接口 { $this->_commands []= $cmd; } public function runCommand( $name, $args )//执行命令链函数接口 { foreach( $this->_commands as $cmd ) { if ( $cmd->onCommand( $name, $args ) ) return; } }}class UserCommand implements ICommand //定义一个接口类{ public function onCommand( $name, $args ) { if ( $name != 'addUser' ) return false; echo( "UserCommand handling 'addUser'/n" ); return true; }}class MailCommand implements ICommand //定义一个接口类{ public function onCommand( $name, $args ) { if ( $name != 'mail' ) return false; echo( "MailCommand handling 'mail'/n" ); return true; }}$cc = new CommandChain();$cc->addCommand( new UserCommand() );$cc->addCommand( new MailCommand() );$cc->runCommand( 'addUser', null );$cc->runCommand( 'mail', null );?>
我们讲述的最后一个设计模式是策略模式。在此模式中,算法是从复杂类提取的,因而可以方便地替换。例如,如果要更改搜索引擎中排列页的方法,则策略模式是一个不错的选择。思考一下搜索引擎的几个部分部分遍历页面,一部分对每页排列,另一部分基于排列的结果排序。在复杂的示例中,这些部分都在同一个类中。通过使用策略模式,您可将排列部分放入另一个类中,以便更改页排列的方式,而不影响搜索引擎的其余代码。
<?phpinterface IStrategy //定义一个接口{ function filter( $record );}class FindAfterStrategy implements IStrategy //继承接口{ private $_name; public function __construct( $name ) { $this->_name = $name; } public function filter( $record ) { return strcmp( $this->_name, $record ) <= 0;//返回两个字符串的大小 }}class RandomStrategy implements IStrategy //继承接口随机比较{ public function filter( $record ) { return rand( 0, 1 ) >= 0.5; }}class UserList { private $_list = array(); public function __construct( $names ) //用户注册 { if ( $names != null ) { foreach( $names as $name ) { $this->_list []= $name; } } } public function add( $name ) { $this->_list []= $name; } public function find( $filter ) //策略模式接口 (传递进来一个方法对象) { $recs = array(); foreach( $this->_list as $user ) { if ( $filter->filter( $user ) )//将传递进来的名字和_name比较 $recs []= $user; } return $recs; }}$ul = new UserList( array( "Andy", "Jack", "Lori", "Megan" ) );$f1 = $ul->find( new FindAfterStrategy( "J" ) );//初始化_name 并赋值print_r( $f1 );$f2 = $ul->find( new RandomStrategy() );print_r( $f2 );?>
- PHP中常用的几种设计模式
- PHP中常用的几种设计模式
- php常用几种设计模式的应用场景
- Java中常用的几种设计模式
- iOS中常用的几种设计模式
- iOS开发中常用的几种设计模式介绍
- iOS开发中常用的几种设计模式
- java中常用的几种设计模式
- iOS中常用的几种设计模式
- Unity中常用的几种设计模式
- php中常见的几种设计模式
- PHP中常用的设计模式
- 5中常用的php设计模式
- 几种常用的设计模式
- 几种常用的设计模式介绍
- 几种常用的设计模式介绍
- 几种常用的设计模式介绍
- 几种常用的设计模式
- Tcl&NS2学习笔记
- 第9周项目4-小九九
- 第九周感想——就这样前进!
- Mac os terminalでファイルの大きさを表示する方法
- UVA - 727 Equation(中缀式转后缀式)
- PHP中常用的几种设计模式
- 谈一下ACM的入门书籍及方法
- 改变IT世界的11大Apache开源技术(转)
- [leetcode]Path Sum[java]
- 第九周项目1-利用循环求和(while语句)
- 数,各位上的数最大值和最小值的乘积
- STRLEN和sizeof区别
- centos7上安装mysql
- ACM书籍推荐