php设计模式课程---7、装饰器模式如何使用

一、总结

一句话总结:

装饰器的核心是获取了文章类整个类,而不是获取了文章内容,有了这个文章类,我想给你加多少装饰就给你加多少装饰(将文章这个类封装进去),在这个类的外部,在装饰器中。
 4 class Art {
5 protected $content;
6 public function __construct($content) {
7 $this->content = $content;
8 }
9
10 public function decorator() {
11 return $this->content;
12 }
13 }
14
15 class Artdec extends Art {//装饰基类
16 protected $art = null;
17
18 public function __construct($art) {
19 $this->art = $art;
20 }
21
22 public function decorator() {
23 }
24 }

1、装饰器的装饰放在哪?

装饰器相当于可以实现多继承在装饰和本体之间放东西(装饰类里面的方法属性),而不是在本体里面放东西:比如说在seo装饰类里面加个属性
15 class Artdec extends Art {//装饰基类
16 protected $art = null;
17
18 public function __construct($art) {
19 $this->art = $art;
20 }
21
22 public function decorator() {
23 }
24 }
25
26 class SeoArt extends Artdec {//seo装饰类
27 public function decorator() {
28 return $this->art->decorator() . ' SEO keywords';
29 }
30 }

2、不同装饰类之间的层级关系如何?

装饰基类其实是在文章类上面套了一个盒子,把文章类包起来了。
不同的装饰类之间平级,不同的装饰类之间可以互相嵌套。就像给文章类这个东西加上一层层的装饰盒子一样。
15 class Artdec extends Art {//装饰基类
16 protected $art = null;
17
18 public function __construct($art) {
19 $this->art = $art;
20 }
21
22 public function decorator() {
23 }
24 }
25
26 class SeoArt extends Artdec {//seo装饰类
27 public function decorator() {
28 return $this->art->decorator() . ' SEO keywords';
29 }
30 }
31
32 class AdArt extends Artdec {//广告装饰类
33 public function decorator() {
34 return $this->art->decorator() . ' 广告内容';
35 }
36 }

3、装饰模式如何使用?

用一个装饰类去包装其它或包装或没包装的类
38 $art = new Art('这是一篇普通文件');
39 $art = new SeoArt($art);
40 $art = new AdArt($art);
41
42 echo $art->decorator() , "<br>";
43
44
45 $zz = new Art('这是一篇政治文件');
46 $zz = new SeoArt($zz);
47 echo $zz->decorator();

二、装饰器模式如何使用

1、代码

场景:一篇文章既加seo又加广告

装饰器模式代码

 <?php
// 装饰器模式 class Art {
protected $content;
public function __construct($content) {
$this->content = $content;
} public function decorator() {
return $this->content;
}
} class Artdec extends Art {//装饰基类
protected $art = null; public function __construct($art) {
$this->art = $art;
} public function decorator() {
}
} class SeoArt extends Artdec {//seo装饰类
public function decorator() {
return $this->art->decorator() . ' SEO keywords';
}
} class AdArt extends Artdec {//广告装饰类
public function decorator() {
return $this->art->decorator() . ' 广告内容';
}
} $art = new Art('这是一篇普通文件');
$art = new SeoArt($art);
$art = new AdArt($art); echo $art->decorator() , "<br>"; $zz = new Art('这是一篇政治文件');
$zz = new SeoArt($zz);
echo $zz->decorator();
?>

非装饰器模式代码

 <?php
// 装饰器模式 class Art {
protected $content;
public function __construct($content) {
$this->content = $content;
} public function decorator() {
return $this->content;
}
} class SeoArt extends Art {
public function decorator() {
return parent::decorator() . ' SEO Keywords';
}
} class AdArt extends SeoArt {
public function decorator() {
return parent::decorator() . ' 广告文本';
}
} /*
$art = new SeoArt('世界大力世比赛');
echo $art->decorator();
*/ $ad = new AdArt('世界大力世比赛');
echo $ad->decorator(); ?>

 

php设计模式课程---7、装饰器模式如何使用的更多相关文章

  1. Java设计模式12:装饰器模式

    装饰器模式 装饰器模式又称为包装(Wrapper)模式.装饰器模式以多客户端透明的方式扩展对象的功能,是继承关系的一个替代方案. 装饰器模式的结构 通常给对象添加功能,要么直接修改对象添加相应的功能, ...

  2. 设计模式学习心得<装饰器模式 Decorator>

    装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装. 这种模式创建了一个装饰类,用来包装 ...

  3. 设计模式のDecoratorPattern(装饰器模式)----结构模式

    一.产生背景 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装. 这种模式创建了一个装 ...

  4. 重学 Java 设计模式:实战装饰器模式(SSO单点登录功能扩展,增加拦截用户访问方法范围场景)

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 对于代码你有编程感觉吗 很多人写代码往往是没有编程感觉的,也就是除了可以把功能按照固 ...

  5. 设计模式入门之装饰器模式Decorator

    //装饰模式定义:动态地给一个对象加入一些额外的职责. //就添加功能来说.装饰模式比生成子类更为灵活 //这也提现了面向对象设计中的一条基本原则,即:尽量使用对象组合,而不是对象继承 //Compo ...

  6. 面向对象程序设计(OOP设计模式)-结构型模式之装饰器模式的应用与实现

    课程名称:程序设计方法学 实验4:OOP设计模式-结构型模式的应用与实现 时间:2015年11月18日星期三,第3.4节 地点:理1#208 一.实验目的 加深对结构型设计模式的理解以及在开发中的实际 ...

  7. Java设计模式系列-装饰器模式

    原创文章,转载请标注出处:<Java设计模式系列-装饰器模式> 一.概述 装饰器模式作用是针对目标方法进行增强,提供新的功能或者额外的功能. 不同于适配器模式和桥接模式,装饰器模式涉及的是 ...

  8. 从ES6重新认识JavaScript设计模式: 装饰器模式

    1 什么是装饰器模式 向一个现有的对象添加新的功能,同时又不改变其结构的设计模式被称为装饰器模式(Decorator Pattern),它是作为现有的类的一个包装(Wrapper). 可以将装饰器理解 ...

  9. 深入探索Java设计模式(三)之装饰器模式

    装饰器模式使你可以在运行时使用类似于对象组成的技术来装饰类.这在我们希望实例化具有新职责的对象而无需对基础类进行任何代码更改的情况下尤其有用.本文是在学习完优锐课JAVA架构VIP课程—[框架源码专题 ...

随机推荐

  1. 定时器:Timer:System.Threading.Timer类(转)

    最近的一个项目有一些地方需要用到定时功能,在设计过程中,突然发现.net的Timer类居然还有很多我以前没有用过的功能,这里就跟大家分享一下 注:这里的Timer类特指System.Threading ...

  2. 第一次接触solr的过程记录

    1.以solr-4.6.0.tgz为例进行学习 2.第一步,看的是 tutorial.html(位于solr-4.6.0/docs目录),默认solr以jetty作为servlet容器 3.但是,如果 ...

  3. 线性判别函数-Fisher 线性判别

    这是我在上模式识别课程时的内容,也有参考这里. 线性判别函数的基本概念 判别函数为线性的情况的一般表达式 式中x是d 维特征向量,又称样本向量, 称为权向量, 分别表示为 是个常数,称为阈值权. 设样 ...

  4. Mac下python连接mysql数据库

    一.下载Mysql官方connector驱动 地址:https://dev.mysql.com/downloads/connector/python/ 根据提示安装.dmg文件即可. 二.验证是否安装 ...

  5. app 之间发送文件 ios

    本文转载至 http://www.51094.com/?p=212   第一种: 发送一个正常的  pdf 文件,只要是能读取pdf 的都能得到响应 -(IBAction)openDocumentIn ...

  6. task1-9

    今天完成: Task1.参考修真院线下报名贴(学习资料-线下报名-北京报名)中报名的格式,整理出业务模型,确定需要几个对象,每个对象的属性是什么,对象和对象之间的关系是一对一,还是一对多. [参考资料 ...

  7. 1、Codevs 必做:2833、1002、1003、2627、2599

    2833 奇怪的梦境  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题解       题目描述 Description Aiden陷入了一个奇怪的梦境:他被困 ...

  8. C# 6.0 (C# vNext) 新功能之:Null-Conditional Operator(转)

    Null-Conditional Operator 也叫 Null propagating operator 也叫 Safe Navigation Operator 看名字,应该就有点概念了.如果还不 ...

  9. CF1060 E-Sergey and Subway

    题目戳这里 一句话题意 一棵树,任意相隔一个点的两个点连一条新边(原边留下),问所有点对的距离之和. Solution 本来看见是黑题有点怕,但仔细一想也没有那么难. 先处理出每个点的深度(dep)和 ...

  10. Linux安装Nginx使用负载均衡

    1.实验准备准备三台计算机 nginx1 192.168.13.121 作为nginx负载均衡器nginx2 192.168.13.24  web服务,提供一个页面        nginx3 192 ...