加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程 > 正文

PHP设计模式(八)装饰器模式Decorator实例详解【结构型】

发布时间:2020-05-11 07:15:29 所属栏目:编程 来源:站长网
导读:副问题#e# 若你从事过面向工具开拓,实现给一个类或工具增进举动,行使担任机制,这是全部面向工具说话的一个根基特征。假如已经存在的一个类穷乏某些要领,可能需要给要领添加更多的成果(魅力),你大概会仅仅担任这个类来发生一个新类—这成立在特另外代

装饰器模式布局上相同与署理模式。一个装饰器工具保存有对工具的引用,并且忠实的从头成立被装饰工具的民众接口。装饰器也可以增进要领,扩展被装饰工具的接口,恣意重载要领,乃至可以在剧本执行时代有前提的重载要领。

为了探讨装饰器模式,让我们早年面接头过的表单组件库为例,而且用装饰器模式而不是担任,实现“lable”和“invalidation”两个特征。

样本代码:

组件库包括哪些特征?

1.        轻易建设表单位素

2.        将表单位素以html方法输出

3.        在每个元素上实现简朴的验证

本例中,我们建设一个包括姓,名,邮件地点,输入项的表单。全部的地区都是必需的,并且E-mail必需看起来是有用的E—mail地点。用HTML说话暗示,表单的代码象下面所示:

<form action=”formpage.php” method=”post”> <b>First Name:</b> <input type=”text” name=”fname” value=””><br> <b>Last Name:</b> <input type=”text” name=”lname” value=””><br> <b>Email:</b> <input type=”text” name=”email” value=””><br> <input type=”submit” value=”Submit”> </form>

增进一些css样式后,表单渲染出来如下图所示:

PHP计划模式(八)装饰器模式Decorator实例详解【布局型】

我们行使装饰器代码:

<?php /** * 装饰器模式的构成: * 抽象组件脚色(Component):界说一个工具接口,以类型筹备接管附加责任的工具,即可以给这些工具动态地添加职责。 * 详细组件脚色(ConcreteComponent) :被装饰者,界说一个将要被装饰增进成果的类。可以给这个类的工具添加一些职责。 * 抽象装饰器(Decorator):维持一个指向构件Component工具的实例,并界说一个与抽象组件脚色Component接口同等的接口。 * 详细装饰器脚色(ConcreteDecorator): 向组件添加职责。 * @author guisu * @version 1.0 */ /** * 抽象组件脚色(Component) * */ class ComponentWidget { function paint() { return $this->_asHtml(); } } /** * * 详细组件脚色(ConcreteComponent): * 让我们以一个根基的text输入组件开始。它(组件)必必要包括输入地区的名字(name)并且输入内容可以以HTML的方法渲染。 * */ class ConcreteComponentTextInput extends ComponentWidget { protected $_name; protected $_value; function TextInput($name, $value='') { $this->_name = $name; $this->_value = $value; } function _asHtml() { return '<input type="text" value="'.$this->_value.'">'; } } /** * 抽象装饰器(Decorator):维持一个指向构件Component工具的实例,并界说一个与抽象组件脚色Component接口同等的接口。 * * 我们进入有可以或许同一增进(一些特征)手段的装饰器模式。 * 作为开始,我们成立一个平凡的可以被扩展发生详细的特定装饰器的WidgetDecorator类。至少WidgetDecorator类应该可以或许在它的结构函数中接管一个组件, * 并复制民众要领paint() * */ class WidgetDecorator { protected $_widget; function __construct( &$widget) { $this->_widget = $widget; } function paint() { return $this->_widget->paint(); } } /** * 详细装饰器脚色(ConcreteDecorator): * 为成立一个标签(lable),必要传入lable的内容,以及原始的组件 * 有标签的组件也必要复制paint()要领 * */ class ConcreteDecoratorLabeled extends WidgetDecorator { protected $_label; function __construct($label, &$widget) { $this->_label = $label; parent::__construct($widget); } function paint() { return '<b>'.$this->_label.':</b> '.$this->_widget->paint(); } } /** * 实现 * */ class FormHandler { function build(&$post) { return array( new ConcreteDecoratorLabeled('First Name', new ConcreteComponentTextInput('fname', $post->get('fname'))) ,new ConcreteDecoratorLabeled('Last Name', new ConcreteComponentTextInput('lname', $post->get('lname'))) ,new ConcreteDecoratorLabeled('Email', new ConcreteComponentTextInput('email', $post->get('email'))) ); } } /** * 通过$_post提交的数据 */ class Post { private $store = array(); function get($key) { if (array_key_exists($key, $this->store)) return $this->store[$key]; } function set($key, $val) { $this->store[$key] = $val; } static function autoFill() { $ret = new self(); foreach($_POST as $key => $value) { $ret->set($key, $value); } return $ret; } } ?>

以建设一个php剧本行使FormHandler类来发生HTML表单:

<form action=”formpage.php” method=”post”> <?php $post =& Post::autoFill(); $form = FormHandler::build($post); foreach($form as $widget) { echo $widget->paint(), "<br>n"; } ?> <input type=”submit” value=”Submit”> </form>

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读