资讯专栏INFORMATION COLUMN

【编程课堂】php设计模式(二):结构型模式(续)

Nekron / 2777人阅读

摘要:能够协调调用者和被调用者,能够在一定程度上降低系统的耦合性。特点低耦合性,独立性好,安全性应用客户访问不到或者被访问者希望隐藏自己,所以通过代理来访问自己。

我们接着上面的几种模式继续讲:

4、组合模式

将对象组合成树形结构表示“部分-整体”的层次结构。

特点:灵活性强

应用:对象的部分-整体的层次结构,模糊组合对象和简单对象处理问题

代码实现

/**

组合模式
*

*/
//继承模式
class UserBaseInfo {
private$name;
function__construct($name) {
$this->name= $name;
}
public function getName() {
return $this->name;
}
}
class User extends UserBaseInfo {
private$login = false;
public function setLogin($islogin) {
$this->login = $islogin;
}
public function isLogin() {
return $this->login;
}
}
$user = new User("张三");
$user->setLogin(true);
if ($user->isLogin()) {
echo$user->getName()."已经登录了n";
} else {
echo$user->getName()."还没有登录n";
}
//组合模式
class LoginInfo {
protected$user;
protected$login = false;
publicfunction setLogin($user, $isLogin) {
$this->user= $user;
$this->login= $isLogin;
}
publicfunction isLogin() {
return$this->login;
}
}
$user = new User("张三");
$login = new LoginInfo();
$login->setLogin($user, true);
if ($login->isLogin()) {
echo$user->getName()."已经登录了n";
} else {
echo$user->getName()."还没有登录n";
}
//部分可以更换,用继承则不行
class Admin {
protected$level;
function__construct($level) {
$this->level= $level;
}
functiongetLevel() {
return$this->level;
}
}
$admin = new Admin(1);
$login->setLogin($admin, true);
if ($login->isLogin()) {
printf("级别为 %d 的管理员已经登录了n",$admin->getLevel());
} else {
printf("级别为 %d 的管理员还没有登录n",$admin->getLevel());
}
?>

上面的例子分别展示了使用继承和组合来处理新功能,在简单的情况下看似区别不大,但在项目后期越来越复杂的时候组合模式的优势就越来越明显了。

例如上面的登录信息,如果要增加登录次数、最后登录时间、登录ip等信息,登录本身就会变成一个比较复杂的对象。如果以后有新的需求比如好友信息、用户的访问信息等,再要继承的话,用户类就会变得非常庞大,难免各父类之间没有冲突的变量和方法,而外部访问用户类的众多方法也变得很费劲。采用组合模式后,一个类负责一个角色,功能区分非常明显,扩展方便。

5、外观模式(门面模式)

为了系统中的一组接口提供一个一致的界面

特点:向上抽取,有共性

应用:内部接口众多,由统一的接口来调用

/**

优才网公开课示例代码
*

外观模式,也叫门面模式
*

*/
class Operation {
publicfunction testPlus() {
printf("plus:%sn",(1 + 2 == 3 ? "true" : "false"));
}
publicfunction testMinus() {
printf("minus:%sn", (3 - 2 == 2 ? "true" : "false"));
}
publicfunction testTimes() {
printf("times:%sn", (2 * 3 == 6 ? "true" : "false"));
}
}
class Tester {
protected$_operation;
function__construct() {
$this->_operation= newOperation();
}
publicfunction testAll() {
$this->_operation->testPlus();
$this->_operation->testMinus();
$this->_operation->testTimes();
}
}
//测试用例,测试全部接口
$tester = new Tester();
$tester->testAll();
?>

门面模式估计大家在实际代码中都已经使用到了,接口较多时把相似功能的接口封装成一个接口供外部调用,这就是门面模式。

6、享元模式

运用共享技术有效地支持大量细粒度对象,采用一个共享来避免大量有相同内容对象的开销。这种开销中最直观的就是内存的损耗。

特点:高效性,共享性

应用:系统底层的设计。例如字符串的创建。如果两个字符串相同,则不会创建第二个字符串,而是第二个的引用直接指向第一个字符串。$str1=”abc”,$str2=”abc”.则内存存储中只会创建一个字符串“abc”而引用$str1.$str2都会指向它。

7、代理模式

为其他对象提供一个代理来控制对这个对象的访问,就是给某一对象提供代理对象,并由代理对象控制具体对象的引用。能够协调调用者和被调用者,能够在一定程度上降低系统的耦合性。

特点:低耦合性,独立性好,安全性

应用:客户访问不到或者被访问者希望隐藏自己,所以通过代理来访问自己。

代码实现

/**
*

代理模式
*/

//内部对象
class User {
publicfunctiongetName() {
return"张三";
}
publicfunctiongetType() {
return"付费用户";
}
}
//代理接口定义,例如开放平台
interface UserInterface {
functiongetName();
}
//代理对象
class UserProxy implements UserInterface {
protected$_user;
function__construct() {
$this->_user= new User();
}
publicfunctiongetName() {
return$this->_user->getName();
}
}
//内部调用
$user = new User();
printf("user name:%sn", $user->getName());
printf("user type:%sn", $user->getType());
//外部调用
// $user = new UserProxy();
// printf("user name:%sn", $user->getName());
// printf("user type:%sn", $user->getType()); //不能访问,及时知道内部对象有这个方法
?>

三、总结

代理模式、适配器模式、门面模式、装饰模式的区别

相同之处:都封装一个内部对象,调用内部对象的方法

不同之处:各自有各自的特性和应用场景,不能相互替代。所以用的时候要仔细分析用那种合适。

关于模式的选用问题

模式的选用要根据实际的业务需求,通过对业务逻辑的仔细分析,再根据模式具有的特性和应用场景进行合理的选择和区分。大部分情况下业务的场景决定了哪种模式,而不是选择哪个模式去实现一个业务,少数情况几种模式确实都能解决问题,那主要就是考虑以后的扩展了。

到这里我们已经了解了7种结构型模式,下一篇我们继续给大家介绍设计模式的行为型模式,先预览一下行为型模式的种类吧:

模版方法模式

命令模式

迭代器模式

观察者模式

终结者模式

备忘录模式

解释器模式

状态模式

策略模式

职责链模式

访问者模式

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/22752.html

相关文章

  • PHP基础

    摘要:分别为适配器模式,装饰器模式,代理模式,外观模式,桥接模式,组合模式,享元模式。设计模式五适配器模式适配器模式将某个对象的接生成器和协程的实现在这篇文章中,作者针对那些比较难以理解的概念,以一个更为通俗的方式去讲明白。。 PHP 源码注解 PHP 的详细源码注解 PHP 字符串操作整理 一些有关字符串的常用操作。 Redis 常见七种使用场景 (PHP 实战) 这篇文章主要介绍利用 R...

    HtmlCssJs 评论0 收藏0
  • 编程课堂Php设计模式(三):行为型模式

    摘要:代码实现迭代器模式注意被迭代对象属性是私有的观察者模式又叫发布订阅模式,当一个主体对象发生改变时,依赖它的多个观察者对象都得到通知并自动更新响应。 在上一篇我们讲了结构型模式,结构型模式是讨论类和对象的结构的。总共有7种。而今天我们来介绍一下行为型模式。 一、什么是行为型模式? 1、设计模式: 是一套被反复使用、多数人知晓的、经过分类编目的、代码设计的总结。就好像杯子,是被前人设计出来...

    starsfun 评论0 收藏0
  • 后端文章 - 收藏集 - 掘金

    摘要:为什么我会说它们是一样的简单思考一下我的后端书架后端掘金我的后端书架月前本书架主要针对后端开发与架构。一方案调研版本选择当前主流版本是和应用的后台运行配置后端掘金酱油一篇,整理一下关于后台运行的一些配置方式。 分享 50 个完整的 React Native 项目 - 掘金本文为 Marno 原创,转载必须保留出处! 公众号 aMarno,关注后回复 RN 加入交流群 简书专题《 Rea...

    CntChen 评论0 收藏0
  • 转化率+口碑双增长,新东方如何用直播驱动长线班?

    摘要:让我们一起来看看,新东方如何用直播来提高报名率和续班率。为了让转化更上一层楼,新东方专门设计了直播的抢购规则。同时,新东方还为本次直播设置了大额奖品。除了以上提到直播引流,新东方在优能中学微课中也大量采用了直播教学。 对于一家教育机构来说,招生引流是重中之重。无论机构大小,只要课程招生效果好,就能够给公司带来更多现金流,促进增长。 如果做得不好,辛辛苦苦打磨的课程没人听...

    不知名网友 评论0 收藏0

发表评论

0条评论

Nekron

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<