注册表模式
来源:互联网 发布:武汉软件新城 编辑:程序博客网 时间:2024/06/06 23:51
通常应用程序可以分为如下几个层次:
1.前端视图
2.命令控制
3.业务逻辑
4.数据处理
前端视图负责显示对用户数据和收集用户输入数据,提交给命令控制层次。命令控制层收到数据进行一系列加工,委托业务逻辑层完成具体的任务。业务逻辑层调用数据处理模块完成用户数据的存储。
但是前端提交的数据如何在几个层次直接恰当的传递呢?一种是通过前面命令模式提供的一个上下文(context)类来传递,把参数放置在context对象里面,从命令控制层传递到业务逻辑层,完成一系列操作后,通过context返回操作结果。第二种方式是修改命令对象的接口,来适配对应的数据传递。这两种方式有时候会破坏封装。我们知道单例模式提供了另外一种访问全局变量的方式。静态变量局部隐藏并通过接口可以轻松的设置获取对象属性。注册模式(Registry)正是利用了这种便利。
session_start的时候根据cookies里面存储的会话ID恢复不同的对象数据,可以达到同一用户多次请求访问同一对象数据的目的。还有一种是应用程序作用域级别的。即同一应用程序的
不同使用者可以共享同一对象数据,这个操作需要PHP内置的序列化函数来完成。
1.前端视图
2.命令控制
3.业务逻辑
4.数据处理
前端视图负责显示对用户数据和收集用户输入数据,提交给命令控制层次。命令控制层收到数据进行一系列加工,委托业务逻辑层完成具体的任务。业务逻辑层调用数据处理模块完成用户数据的存储。
但是前端提交的数据如何在几个层次直接恰当的传递呢?一种是通过前面命令模式提供的一个上下文(context)类来传递,把参数放置在context对象里面,从命令控制层传递到业务逻辑层,完成一系列操作后,通过context返回操作结果。第二种方式是修改命令对象的接口,来适配对应的数据传递。这两种方式有时候会破坏封装。我们知道单例模式提供了另外一种访问全局变量的方式。静态变量局部隐藏并通过接口可以轻松的设置获取对象属性。注册模式(Registry)正是利用了这种便利。
这里也可以把注册模式看成单例版本的context对象。
一个简单的Registry实现:
abstract class Registry{abstract protected function get($key);abstract protected function set($key, $value);}PHP支持三种类型的对象数据生命周期:一种是从接收到一次HTTP请求开始,请求处理完毕结束。另外一种是支持会话(session)级别的对象,即可以把对象数据存储在session中,PHP在
session_start的时候根据cookies里面存储的会话ID恢复不同的对象数据,可以达到同一用户多次请求访问同一对象数据的目的。还有一种是应用程序作用域级别的。即同一应用程序的
不同使用者可以共享同一对象数据,这个操作需要PHP内置的序列化函数来完成。
基于一次HTTP请求的数据注册模式:
class RequestRegistry extends Registry{private static $instance;private $values = array();private function __construct(){}static public function instance(){if(!isset(self::$instance)){self::$instance = new self();}return self::$instance;}protected function get($key){if(isset($this->values[$key])){return $this->values[$key];}return null;}protected function set($key, $value){$this->values[$key] = $value;}static function set_request(Request $request){self::$instance->set('request', $request);}static function get_request(){return self::$instance->get('request');}}会话请求的注册表:
class SessionRegistry extends Registry{private $instance; private function __construct(){session_start(); } static function instance(){if(!isset(self::$instance)){self::$instance = new self();}return self::$instance;}protected function get($key){if(isset($_SESSION[__CLASS__][$key])){return $_SESSION[__CLASS__][$key]}return null;}protected function set($key, $value){$_SESSION[__CLASS__][$key] = $value;}public function set_complex(Complex $complex){self::$instance->set('complex', $complex);}public function get_complex(){return self::$instance->get('complex');}}支持应用程序级别的注册表:
class ApplicationRegistry extends Registry{private $dir = "data";private static $instance;private $values = array();private $mtimes = array();private function __construct(){}static function instance(){if(!isset(self::instance)){self::$instance = new self();}return self::$instance;}protected function set($key, $value){$this->values[$key] = $value;$path = $this->dir . DIRECTORY_SEPARATOR . $key;file_put_contents($path, serialize($value));$this->mtimes[$key] = time();}protected function get($key){$path = $this->dir . DIRECTORY_SEPARATOR . $key;if(file_exists($path)){$mtime = filetime($path);if(!isset($this->mtimes[$key])){$this->mtimes[$key] = 0;}if($mtime > $this->mtimes[$key]){$data = file_get_contents($path);$this->mtimes[$key] = $mtime;return ($this->values[$key] = unserialize($data));}if(isset($this->values[$key])){return $this->values[$key];}}return null;}static function get_dsn(){return self::$instance->get('dsn');}static function set_dsn($dsn){self::$instance->set('dsn', $dsn);}}The end.
0 0
- 注册表模式
- 注册表模式
- 注册表模式
- 注册表模式
- 内核模式 注册表编程
- 注册表模式解析
- php 注册表模式
- 修改注册表禁用安全模式
- php设计模式入门-注册表模式
- PHP设计模式——注册表模式
- PHP 设计模式之注册表模式
- win7游戏全屏模式通过注册表修改
- 内核模式下的注册表操作
- 安静模式 运行 reg注册表文件
- 内核模式下的注册表操作
- C++单例模式之注册表方法
- 内核模式下的注册表操作
- 内核模式下的注册表操作
- Errors occurred during the build. Errors running builder
- 2014年12月11号 我的第一篇博客
- 关于Unity的优化1.
- Make Binary Image Tool (Windows CE 5.0)
- 黑马程序员-20141211-总结2
- 注册表模式
- C++的四种强制转换
- 成为一名android系统工程师——工作伊始
- ASP.NET生成验证码
- 解决SQL Server 2005数据库中datetime时间字段在前端显示时分秒的问题
- leetcode->Reverse Integer
- 《C#高级教程》学习笔记7
- Linux 内核加载过程
- 解决织梦中栏目的图片路径问题