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. 门面角色 客户端可以调用这个角色方法,此角色中有子系统的应用(知晓相关的(一个或多个)子系 ...
随机推荐
- PAT 1060 Are They Equal[难][科学记数法]
1060 Are They Equal(25 分) If a machine can save only 3 significant digits, the float numbers 12300 a ...
- mongodb安装及副本集搭建
mongodb下载地址:https://www.mongodb.com/dr/fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel62-3.2.7.tg ...
- django2.0关于path匹配路径页面刷新不出来的问题
下面是官方文档的内容,如果在urls.py中使用到正则匹配路径(^$)的时候,就需要使用re_path,而不能使用path,不然页面会显示404错误, 如果未用到正则,那么使用path即可. re_p ...
- 6.MySQL必知必会之数据过滤-WHERE组合子句
数据过滤-WHERE组合子句 本章讲授如何组合WHERE子句以建立功能更强的更高级的搜索条件. 我们还将学习如何使用NOT和IN操作符. 1.组合WHERE子句 上一章介绍的WHERE子句在过滤数据时 ...
- Linux 安装配置 Nginx
前言 准备用flask做一个自己的博客网站,打算用Nginx来部署,所以在阿里云的服务器上安装Nginx,参考了很多教程,现在将步骤以及自己遇到的坑写下来,希望能对别人有所帮助. 我用的服务器是阿里云 ...
- Mail.Ru Cup 2018 Round 3 Solution
A. Determine Line Water. #include <bits/stdc++.h> using namespace std; ]; int main() { while ( ...
- Python 安装pytz
1. https://pypi.org/project/pytz/#files 2. 下载上图标黄的文件, 3. pip install 4. from pytz import ...
- Hopper Disassembler v4 ( The macOS Disassembler, Decompiler and Debugger)
Hopper Disassembler v4 ( The macOS Disassembler, Decompiler and Debugger) Reveal13 (UI) 两个好东西..不知道的自 ...
- struts2.1.8 spring2.5.6 hibernate3.3G 依赖jar包
----struts2.1.8---- struts2-core-2.1.8.1.jar struts2核心包 struts2-json-plugin-"} struts2-spring-p ...
- Python笔记 #10# Histograms
1.Build a histogram In [1]: help(plt.hist) Help on function hist in module matplotlib.pyplot: hist(x ...