`

另辟蹊径的装饰模式(Decorator Pattern)

阅读更多

在天朝,没钱的孩子从小就得学好”数理化“,为的就是能考个好分数。但并不是每一个小孩都是读书的料,有的小孩就是没那个天赋,小的时候,记得每次考试后都要给家长报告,然后要签字,表示已经给家长看过了。小明就是个没天赋的孩子,他这次又考砸了,语文65,数学68,英语66,但小明并不笨,直接跟老爸说考这么点估计会被暴打一顿,因此他决定先说”这次考试语言最高是75,数学最高是78,英语最高是88“,再汇报自己的成绩,再说”我是第46名“(上次是58名,因为有几个同学转学了。。。)。用代码来模拟一下:

 

<?php
abstract class SchoolReport{
	public abstract function report();
	public abstract function sign($name);
}

class FouthGradeSchoolReport extends SchoolReport{
	public function report(){
		echo "语文65,数学68,英语66\n";
		echo "家长签名:\n";
	}
	public function sign($name){
		echo "家长签名:".$name."\n";
	}
}

class SugarFouthGradeSchoolReport extends FouthGradeSchoolReport{
	private function reportHighScore(){
		echo "这次考试语言最高是75,数学最高是78,英语最高是88\n";
	}
	private function reportSort(){
		echo "我是第46名\n";
	}
	public function report(){
		$this->reportHighScore();
		parent::report();
		$this->reportSort();
	}
}

$schoolReport = new SugarFouthGradeSchoolReport();
$schoolReport->report();
$schoolReport->sign('XXXX');
?>
运行结果:
这次考试语言最高是75,数学最高是78,英语最高是88
语文65,数学68,英语66
家长签名:
我是第46名
家长签名:XXXX
[Finished in 0.1s]

 小明如愿得到了签名并且没有挨打。但现实的情况貌似比代码要复杂,可能老爸听了最高成绩后,就直接签名了,也可能老爸要先看排名,那怎么办?继续扩展?我们来另辟蹊径,不用继承,用装饰模式,类图如下:

 


实现代码:

<?php
abstract class SchoolReport {
	public abstract function report();
	public abstract function sign( $name );
}

abstract class Decorator extends SchoolReport{
	private $sr;
	public function __construct( $sr ) {
		$this->sr = $sr;
	}
	public function report() {
		$this->sr->report();
	}
	public function sign( $name ) {
		$this->sr->sign( $name );
	}
}

class FouthGradeSchoolReport extends SchoolReport{
	public function report(){
		echo "语文65,数学68,英语66\n";
		echo "家长签名:\n";
	}
	public function sign($name){
		echo "家长签名:".$name."\n";
	}
}

class HighScoreDecorator extends Decorator{
	private function reportHighScore() {
		echo "这次考试语言最高是75,数学最高是78,英语最高是88\n";
	}
	public function report() {
		$this->reportHighScore();
		parent::report();
	}
}

class SortDecorator extends Decorator{
	private function reportSort() {
		echo "我是第46名";
	}
	public function report() {
		parent::report();
		$this->reportSort();
	}
}

$sr = new FouthGradeSchoolReport();
$sr = new HighScoreDecorator($sr);
$sr = new SortDecorator($sr);
$sr->report();
$sr->sign('XXXX');
?>
运行结果:
这次考试语言最高是75,数学最高是78,英语最高是88
语文65,数学68,英语66
家长签名:
我是第46名家长签名:XXXX
[Finished in 0.1s]

 这样一来,如果还要增加其他装饰条件,只要实现Decorator类就可以了!

 

 

装饰模式的定义

动态地给一个对象添加一些额外的职责。就增加功能来说,装饰模式相比子类更为灵活。

装饰模式由四个角色构成

1、Component抽象构件

一个接口或是抽象类,就是定义最核心的对象,如上面的成绩单SchoolReport

2、ConcreteComponent具体构件

最核心、最原始、最基本的接口或抽象类的实现,要装饰的就是它。FouthGradeSchoolReport

3、Decorator装饰角色

一般是一个抽象类,实现接口或抽象方法,它里面可不一定有抽象的方法,在它的属性里必然有一个private变量指向Component抽象构件。Decorator

4、具体装饰角色

把被装饰角色装饰成其他东西。HighScoreDecorator、SortDecorator

 

 

装饰模式的优点

1、装饰类和被装饰类可以独立发展,而不会相互耦合。

2、装饰模式是继承关系的一个替代方案。

3、装饰模式可以动态地扩展一个实现类的功能。

4、扩展性非常好。

 

 

装饰模式的缺点

多层的装饰是比较复杂的。就像剥洋葱,到最后才发现是最里层的装饰出现了问题,增加了工作量,因此,尽量减少装饰类的数量,以便降低系统的复杂度。

 

 

装饰模式的使用场景

1、需要扩展一个类的功能,或给一个类增加附加功能。

2、需要动态地给一个对象增加功能,这些功能可以再动态地撤销。

3、需要为一批的兄弟类进行改装或加装功能,当然是首选装饰模式。

 

 

装饰模式是对继承的有力补充,你要知道继承不是万能的,在项目中要考虑易维护、易扩展、易复用等,而且在一些情况下你要是用继承就会增加很多子类,而且灵活性非常差,使用装饰模式可以解决膨胀问题,同时,继承是静态地给类增加功能,而装饰模式是动态地,灵活性更强!

  • 大小: 10.2 KB
3
1
分享到:
评论

相关推荐

    设计模式之装饰模式(Decorator Pattern)

    装饰模式(Decorator Pattern)是一种结构型设计模式,它在不改变原有对象的基础上,通过包裹一个对象并为其添加新的行为或责任,实现对对象功能的扩展。这种模式在软件开发中非常常见,尤其当需要在运行时动态改变...

    通过C#实现设计模式-装饰模式(DecoratorPattern).rar

    装饰模式(Decorator Pattern)是一种结构型设计模式,它允许你向一个现有的对象添加新的功能,同时又不改变其结构。装饰模式通过创建一个装饰类,该类包装了原始类的实例,并在调用原始类方法之前或之后添加额外的...

    装饰器模式(Decorator Pattern) 1. 装饰器模式简介 1.1 问题引入 1.2 装饰器模式的解决方案 2. 装饰器模式的定义和原理 2.1 定义 2.2 基本原理 2.3 装饰器模式

    装饰器模式(Decorator Pattern) 1. 装饰器模式简介 1.1 问题引入 1.2 装饰器模式的解决方案 2. 装饰器模式的定义和原理 2.1 定义 2.2 基本原理 2.3 装饰器模式的特点 3. 装饰器模式的UML类图和基本结构 3.1 UML...

    装饰者模式(Decorator Pattern)原理图

    装饰者模式(Decorator Pattern)是一种结构型设计模式,它的定义是在不改变原有对象结构的基础上,动态地给该对象增加一些职责(即增加其额外功能)。这种模式允许向一个现有的对象添加新的功能,同时又不改变其...

    Head First 设计模式 (三) 装饰者模式(decorator pattern) C++实现

    装饰者模式(Decorator Pattern)是一种结构型设计模式,它允许我们向对象添加新的行为或职责,而无需修改对象的原始代码。在C++中实现装饰者模式,可以让我们灵活地扩展对象的功能,同时保持代码的可读性和可维护性...

    c++-设计模式之装饰模式(Decorator)

    装饰模式(Decorator Pattern)是一种结构型设计模式,允许在不改变对象接口的情况下,动态地为对象添加额外的职责或功能。装饰模式通常用于需要扩展对象功能而又不希望使用子类化的场景。 装饰模式的组成 组件接口...

    C#设计模式之Decorator 装饰模式

    装饰模式(Decorator Pattern)是设计模式中的一种结构型模式,它在不改变原有对象的基础上,通过添加额外的职责来扩展对象的功能。在C#中,装饰模式尤其适用于那些需要动态地增加或减少对象功能的情况,避免了使用...

    DecoratorPattern.rar

    在"DecoratorPattern.rar"这个压缩包中,包含了装饰器模式的简单案例demo和一个使用MindMaster绘制的脑图。通过这个案例,我们可以深入理解装饰器模式的工作原理和应用场景。 1. 装饰器模式的基本结构: - ...

    设计模式C++学习之装饰模式(Decorator)

    装饰模式(Decorator)是软件设计领域中一种非常实用的结构型设计模式,它允许我们向一个对象添加新的行为或责任,而无需修改该对象的源代码。在C++编程语言中,装饰模式常用于动态地扩展类的功能,使得类的行为在...

    Java24种设计模式,Java24种设计模式,24种设计模式,学会了这24种设计模式,可以打遍天下无敌手,设计模式非常重要

    13、装饰模式DECORATOR PATTERN 14、迭代器模式ITERATOR PATTERN 15、组合模式COMPOSITE PATTERN 16、观察者模式OBSERVER PATTERN 17、责任链模式 18、访问者模式VISITOR PATTERN 19、状态模式 20、原型模式 21...

    03_DecoratorPattern 小菜扮靓

    在"03_DecoratorPattern 小菜扮靓"这个主题中,我们可以推断作者可能以轻松幽默的方式介绍了装饰器模式的概念。"小菜"可能是用来比喻待装饰的对象,"扮靓"则表示通过装饰增强其功能或特性。博文链接指向了iteye博客...

    DecoratorPattern.zip

    装饰者模式(Decorator Pattern)是软件工程中一种用于动态地给对象添加职责的设计模式。它允许我们独立于对象的类来扩展对象的功能,无需修改原有代码就能增加新功能,遵循“开闭原则”。这种模式是一种结构型设计...

    java Decorator装饰模式例子

    装饰模式(Decorator Pattern)是设计模式中的一种结构型模式,它允许在运行时给对象添加新的行为或职责,而无需改变对象的类。在Java中,装饰模式通常通过继承和组合来实现,使得代码具有更好的扩展性和灵活性。...

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

    装饰器模式(Decorator Pattern)是一种结构型设计模式,主要用于在运行时动态地给对象添加新的职责或行为,而不必改变现有对象的类定义。在面向对象编程中,装饰器模式提供了一种相对于继承更加灵活的方式来增强或...

    装饰者模式——Decorator

    装饰者模式(Decorator)是一种设计模式,用于在运行时动态地给对象添加额外的责任或功能。它是结构型设计模式的一种,能将行为的增加与对象的创建分离,使得我们可以独立地扩展对象的功能。 在Java或其他面向对象...

    java 装饰模式(Decorator Pattern)详解

    装饰模式(Decorator Pattern)是一种结构型设计模式,它在不修改已有对象的代码情况下,通过增加额外的行为来扩展对象的功能。这种模式的核心在于装饰类与被装饰类具有相同的接口,这样客户端可以像处理原始对象...

    java 装饰模式(Decorator Pattern)详解及实例代码

    装饰模式(Decorator Pattern)是一种结构型设计模式,它可以在不修改原有对象的基础上,通过添加新的职责来扩展对象的功能。装饰模式的核心在于它定义了一个与原类一致的接口,使得装饰类和原类可以互相替换,而...

    装饰器(Decorator)模式

    在《Element of Reusable Object-Oriented Software》中,GOF 对装饰器模式的用意进行了概述:Decorator Pattern――Attaches additional responsibilities to an object dynamically. Decorators provide a ...

    结构型模式之装饰模式(Decorator)

    装饰模式(Decorator)是软件设计模式中的一种结构型模式,其主要目的是在不改变对象原有类的基础上,通过添加新的行为或职责来扩展对象的功能。这种模式使得代码的扩展性非常优秀,避免了由于频繁地使用继承而导致...

    [结构型模式] head first 设计模式之装饰者模式(decorator)

    装饰者模式(Decorator Pattern)是结构型设计模式之一,它允许在运行时向对象添加新的行为或职责,而无需修改对象的源代码。这个模式的名字来源于装饰艺术,它通过添加额外的装饰来增强一个物体的外观,同样地,...

Global site tag (gtag.js) - Google Analytics