PHP中实用的模式之【门面模式】
author:胡旭个人博客
blog:http://www.ihuxu.com
欢迎关注~~~~
对于一些逻辑稍微复杂的程序,很难避免出现在不某个类中无法访问另一个类所持有的引用。这样也就导致了编程的灵活度下降,尽管可以再次创建新的引用,也会浪费资源,甚至达不到要求。下面我来句一个例子:
比如,后台的模板文件有两个。admin_bar.html,和admin_comment.html。我现在有两个类,分别是adminAction.class.php,和adminCommentAction.class.php。admin_bar.html文件就是我们通常看到的后台管理的工具栏(通常在左边),admin_comment.html是每个工具功能项(评论)所对应的内容。如下图所示:

这样,我们在adminAction控制器类中先用模板引擎处理好admin_bar.html文件,完了根据url或表单传进来的参数进入到adminCommentAction控制器类。代码示例:
<?php
class adminAction{ private $smarty = null; public function _construct(){
$this->smarty = new Smarty(); } private function show(){
$this->smarty->dispose('admin_bar.html');
if($_GET['action'] == 'comment'){
new adminCommentAction();
}
if(){
//...
}
return;
}
} class adminCommentAction{
public function _construct(){
//???
}
}
那么,到代码执行到adminCommentAction中时,就无法拿到adminAction中持有的smarty引用了。也许说,可以通过构造参数来传递,不过这里介绍一种更好的方式 --- 门面模式(总于进入主题了)。它能够更灵活的管理代码程序中的饮用对象。下面简单的门面模式类代码示例:
<?php
/**
* 对象引用管家 - 门面模式
*/
class ObjectManager implements ObjectType{
private static $Objects = array(); public static final function get_object($key){ if(array_key_exists($key, ObjectManager::$Objects)){
return ObjectManager::$Objects[$key];
}
return FALSE;
} public static final function set_object($key, $Object){
if(!array_key_exists($key, ObjectManager::$Objects)){
ObjectManager::$Objects[$key] = $Object;
return TRUE;
}
return FALSE;
} public static final function clear_object($key){
if(array_key_exists($key, ObjectManager::$Objects)){
unset(ObjectManager::$Objects[$key]);
return TRUE;
}
return FALSE;
}
}
当然,最好给ObjectManager写一个接口类,其中存一些引用的类型,以便处理。
<?php
/**
* 全局对象引用类型常量接口
*
*/
interface ObjectType{ /**
* 后台控制器adminAction所持有的Smarty引用对象,其用于相应模板文件的模板引擎动作。
*
*/
const ADMINACTIONENGIEN= 'AdminActionEngien'; }
那么这个时候就可以这样灵活的运用了,代码示例:
<?php
class adminAction{ private $smarty = null; public function _construct(){
$this->smarty = new Smarty();
ObjectManager::set_object(ObjectManager::ADMINACTIONENGIEN, $this->smarty);
} private function show(){
$this->smarty->dispose('admin_bar.html');
if($_GET['action'] == 'comment'){
new adminCommentAction();
}
if(){
//...
}
return;
}
} class adminCommentAction{
private $smarty = null;
public function _construct(){
$this->smarty = ObjectManager::get_object(ObjectManager::ADMINACTIONENGIEN);
$this->smarty->require_file();//这个函数可能smarty没有,因为我用的引擎是自己写的
$this->smarty->assign();
$this—>smarty->display();
}
}
PHP中实用的模式之【门面模式】的更多相关文章
- 设计模式---接口隔离模式之门面模式(Façade)
前提:接口隔离模式 在组建构建过程中,某些接口之间直接的依赖常常会带来很多问题.甚至根本无法实现.采用添加一层间接接口(稳定的),来隔离本来相互紧密关联的接口是一种常见的解决方案. 典型模式: 门面模 ...
- java设计模式5.组合模式、门面模式、享元模式、桥接模式
组合模式 在面向对象的语言中,树结构有着巨大的威力,一个基于继承的类型的等级结构便是一个数结构,一个基于合成的对象结构也是一个数结构.组合模式将部分与整体的关系用树结构表示出来,使得客户端把一个个单独 ...
- 外观模式(Facade)(门面模式、子系统容易使用)
外观(Facade)模式的定义:是一种通过为多个复杂的子系统提供一个一致的接口,而使这些子系统更加容易被访问的模式.该模式对外有一个统一接口,外部应用程序不用关心内部子系统的具体的细节,这样会大大降低 ...
- Java设计模式(12)——结构型模式之门面模式(Facade)
一.概述 概念 简要示意图(没有一个统一的UML图) 角色 门面角色:门面模式核心,它被客户端调用,并且熟悉子系统 子系统角色:子系统,子系统并不知道门面的存在,门面对它来说只不过是另外一个客户端 ...
- Java设计模式(一)外观模式(门面模式)- 结构型模式
模式的定义 门面模式(Facade Pattern)也叫做外观模式,是一种比较常用的封装模式,其定义如下:要求一个子系统的外部与其内部通信必须通过一个统一的对象进行.门面模式提供一个高层次的接口,使得 ...
- 深入 Laravel 内核之外观模式(门面模式)
门面模式核心内容: 客户端与子系统的通信通过外观对象进行: 外观对象封装一系列子系统的具体对应方法,对客户端只需暴露一个单一的入口方法: 客户端通过访问外观对象即可调用子系统的基础方法,无需关心子系统 ...
- java设计模式之外观模式(门面模式)
针对外观模式,在项目开发和实际运用中十分频繁,但是其极易理解,下面就简要介绍一下. 一.概念介绍 外观模式(Facade),他隐藏了系统的复杂性,并向客户端提供了一个可以访问系统的接口.这种类型的设计 ...
- Facade(外观模式或门面模式)
常用的模式之一. 为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用. 完美地体现了依赖倒转原则和迪米特法则的思想. Facade模式应用场景: 首先 ...
- FacadePattern(门面模式)
/** * 外观模式(门面模式) * @author TMAC-J * 外观模式是通过访问一个前台来实现对子系统的访问,其和代理模式的区别是 * 代理模式是通过代理一个类的形式,也就是说一对一的关系 ...
- JavaScript设计模式--门面模式
外部与一个子系统的通信必须通过一个系统的一个门面对象进行,这就是门面模式. 门面模式具备如下两个角色: 1. 门面角色 客户端可以调用这个角色方法,此角色中有子系统的应用(知晓相关的(一个或多个)子系 ...
随机推荐
- 【新业务搭建】竞争情报业务规划及体系构建的思考——By Team
竞争情报业务规划.体系构建 一.竞争情报业务定位——“做什么” 一)业务愿景.目标和原则 愿景:将情报工作融入到公司各个业务中,成为业务活动的灯塔 目标:直接支撑标杆学习(间接支撑三大战略).直接支持 ...
- Struts2表单数据接收方式
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/sunshoupo211/article/details/30249239 1.将Action类作 ...
- sublime text2和3怎么设置修改字体
首先,请打开你的sublime text2或3,点击工具栏中的Preferences 然后打开Settings-User 打开Settings-User之后 如下图 请复制以下代码然后粘贴至花括号内 ...
- python之redis模块
一.redis简介 redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset(s ...
- 数据库知识,mysql索引原理
1:innodb底层实现原理:https://blog.csdn.net/u012978884/article/details/52416997 2:MySQL索引背后的数据结构及算法原理 ht ...
- HTML基础之DOM常用操作
DOM(Document Object Model ),文档对象模型,主要用于对HTML和XML文档的内容进行操作. 一.查找节点 直接获取标签 document.getElementById('i1 ...
- http之请求方法
根据HTTP标准,HTTP请求可以使用多种请求方法.HTTP1.0定义了三种请求方法: GET, POST 和 HEAD方法.HTTP1.1新增了五种请求方法:OPTIONS, PUT, DELETE ...
- 算法第四版 在Linux 中调用Algs4库
一: 搭建Java 环境 : 确认版本: 1.8及以上 [username:~/] javac -version javac 1.8.0_111 [username:~/] java -versi ...
- VS2010/MFC编程入门之二十九(常用控件:列表视图控件List Control 下)
上一节是关于列表视图控件List Control的上半部分,简单介绍了列表视图控件,其通知消息的处理和有关结构体的定义.本节继续讲解下半部分,包括列表视图控件的创建.CListCtrl类的主要成员函数 ...
- webpack踩过的坑(总结)
使用process.argv 获取命令行使用的参数 // 判断是否带production参数,production会压缩js var isprod = false; for (var i in pro ...