浸入式实训
行业首推全程浸入式实训,从知识点浸入到项目实战浸入,从职场环境浸入到抗压能力浸入,全程浸入真实职场氛围。
多维服务体系
“好环境、好课程、好老师、好就业、好学员”是我们的服务标准,IT兄弟连争将每一个维度做到极致,为学员的现在和未来负责!
高薪企业就业推荐
只要学员正常入学,上课,考勤,阶段考试,按时完成项目作业等,学员均可顺利就业,海量优质合作企业资源学校推荐学员高薪就业!
上海哪里有PHP培训班?.....
在广州PHP培训机构有很多,看你怎么选择吧,要是没有心仪的机构我推荐你去达内看看,听说很不错的,他们有免费的试听课程,你可以听听看。.....
深圳php培训,php培训教学靠谱,变态严管,每年有众多学员受益于达内php培训,学php当然达内,众多学员的口碑之选.达内php培训可以试学.....
北京php培训,php学习技巧汇总,PHPH5全栈工程师,北京兄弟连,php学习,系统php学习方案,资源汇总,项目实战教学,不一样.....
设计模式只是为 Java架构师准备的 — 至少您可能一直这样认为。实际上,设计模式对于每个人都非常有用。如果这些工具不是 “架构太空人” 的专利,那么它们又是什么?为什么说它们在 PHP 应用程序中非常有用?本文解释了这些问题。
设计模式 一书将设计模式引入软件社区,该书的作者是 Erich Gamma、Richard Helm、Ralph Johnson 和 John Vlissides Design(俗称 “四人帮”)。所介绍的设计模式背后的核心概念非常简单。经过多年的软件开发实践,Gamma 等人发现了某些具有固定设计的模式,就像建筑师设计房子和建筑物一样,可以为浴室的位置或厨房的构造方式开发模板。使用这些模板或者说设计模式 意味着可以更快地设计更好的建筑物。同样的概念也适用于软件。
设计模式不仅代表着更快开发健壮软件的有用方法,而且还提供了以友好的术语封装大型理念的方法。例如,您可以说您正在编写一个提供松散耦合的消息传递系统,也可以说你正在编写名称为 观察者 的模式。
用较小的示例展示模式的价值是非常困难的。这往往有些大材小用的意味,因为模式实际上是在大型代码库中发挥作用的。本文不展示大型应用程序,所以您需要思索的是在您自己的大型应用程序中应用示例原理的方法 —— 而不是本文演示的代码本身。这不是说您不应该在小应用程序中使用模式。很多良好的应用程序都以小应用程序为起点,逐渐发展到大型应用程序,所以没有理由不以此类扎实的编码实践为基础。
既然您已经了解了设计模式以及它们的有用之处,现在我们来看看 PHP V5 的五种常用模式。
一、工厂模式
最初在设计模式 一书中,许多设计模式都鼓励使用松散耦合。要理解这个概念,让我们最好谈一下许多开发人员从事大型系统的艰苦历程。在更改一个代码片段时,就会发生问题,系统其他部分 —— 您曾认为完全不相关的部分中也有可能出现级联破坏。
该问题在于紧密耦合 。系统某个部分中的函数和类严重依赖于系统的其他部分中函数和类的行为和结构。您需要一组模式,使这些类能够相互通信,但不希望将它们紧密绑定在一起,以避免出现联锁。
在大型系统中,许多代码依赖于少数几个关键类。需要更改这些类时,可能会出现困难。例如,假设您有一个从文件读取的 User 类。您希望将其更改为从数据库读取的其他类,但是,所有的代码都引用从文件读取的原始类。这时候,使用工厂模式会很方便。
工厂模式 是一种类,它具有为您创建对象的某些方法。您可以使用工厂类创建对象,而不直接使用 ew。这样,如果您想要更改所创建的对象类型,只需更改该工厂即可。使用该工厂的所有代码会自动更改。
工厂类的一个示列。等式的服务器端包括两个部分:数据库和一组 PHP 页面,这些页面允许您添加反馈、请求反馈列表并获取与特定反馈相关的文章。
1. Factory1.php
getName() . " "); ?>
二、单例模式
某些应用程序资源是独占的,因为有且只有一个此类型的资源。例如,通过数据库句柄到数据库的连接是独占的。您希望在应用程序中共享数据库句柄,因为在保持连接打开或关闭时,它是一种开销,在获取单个页面的过程中更是如此。单例模式可以满足此要求。
1. 它们必须拥有一个构造函数,并且必须被标记为private
2. 它们拥有一个保存类的实例的静态成员变量
3. 它们拥有一个访问这个实例的公共的静态方法
单例类不能再其它类中直接实例化,只能被其自身实例化。它不会创建实例副本,而是会向单例类内部存储的实例返回一个引用。
三、观察者模式
观察者模式为您提供了避免组件之间紧密耦合的另一种方法。该模式非常简单:一个对象通过添加一个方法(该方法允许另一个对象,即观察者 注册自己)使本身变得可观察。当可观察的对象更改时,它会将消息发送到已注册的观察者。这些观察者使用该信息执行的操作与可观察的对象无关。结果是对象可以相互对话,而不必了解原因。
3. Observer.php
_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 "); } } $ul = new UserList(); $ul->addObserver(new UserListLogger()); $ul->addCustomer("Jack"); ?>
此代码定义四个元素:两个接口和两个类。IObservable 接口定义可以被观察的对象,UserList 实现该接口,以便将本身注册为可观察。IObserver 列表定义要通过怎样的方法才能成为观察者,UserListLogger 实现 IObserver 接口。
四、命令链模式
命令链 模式以松散耦合主题为基础,发送消息、命令和请求,或通过一组处理程序发送任意内容。每个处理程序都会自行判断自己能否处理请求。如果可以,该请求被处理,进程停止。您可以为系统添加或移除处理程序,而不影响其他处理程序。
4. Chain.php
_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' "); return true; } } class MailCommand implements ICommand { public function onCommand($name, $args) { if ($name != 'mail') { return false; } echo("MailCommand handling 'mail' "); return true; } } $cc = new CommandChain(); $cc->addCommand(new UserCommand()); $cc->addCommand(new MailCommand()); $cc->runCommand('addUser', null); $cc->runCommand('mail', null); ?>
此代码定义维护 ICommand 对象列表的 CommandChain 类。两个类都可以实现 ICommand 接口 —— 一个对邮件的请求作出响应,另一个对添加用户作出响应。
五、策略模式
我们讲述的最后一个设计模式是策略 模式。在此模式中,算法是从复杂类提取的,因而可以方便地替换。例如,如果要更改搜索引擎中排列页的方法,则策略模式是一个不错的选择。思考一下搜索引擎的几个部分 —— 一部分遍历页面,一部分对每页排列,另一部分基于排列的结果排序。在复杂的示例中,这些部分都在同一个类中。通过使用策略模式,您可将排列部分放入另一个类中,以便更改页排列的方式,而不影响搜索引擎的其余代码。
5. Strategy.php
_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)) { $recs []= $user; } } return $recs; } } $ul = new UserList(array("Andy", "Jack", "Lori", "Megan")); $f1 = $ul->find(new FindAfterStrategy("J")); print_r($f1); $f2 = $ul->find(new RandomStrategy()); print_r($f2); ?>
它提供了一个根据一组即插即用的策略查找一组用户的方法。
同意《隐私政策》并允许推荐给更多服务商为您提供服务!