7 结构型模式之 - 装饰模式

装饰模式介绍:装饰模式也称为包装模式,是结构型模式之一,其使用一种对客户端透明的方式来动态地扩展对象的功能,同时它也是继承关系的一种替代方案之一。在现实生活中你也可以看见很多装饰模式的例子,或者可以大胆地说装饰模式无处不在,就拿人来说,人需要各式各样的衣着,不管你穿着怎样,但是,对于个人的本质来说是不变的,充其量只是在外面披上一层包装而已,这就是装饰模式,装饰物也许各不相同但是装饰的对象本质是不变的。

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

装饰模式的使用场景:需要透明且动态地扩展类的功能时

我们通过一个生活中的例子来介绍装饰模式的使用

人总是要穿衣服的,我们将人定义为一个抽象类,将其穿衣的行为定义为一个抽象方法。

1 /**
2  * 将人穿衣服定义成一个抽象方法
3  */
4 public abstract class Person {
5     public abstract void dressed();
6 }

该类也是我们要装饰的原始对象,那么具体装饰对象是谁呢?

我们要实现一个具体的实现类

1 /**
2  * 具体装饰对象的实现类
3  */
4 public class Boy extends Person{
5     @Override
6     public void dressed() {
7         System.out.println("穿了内衣和内裤");
8     }
9 }

Boy类继承于Person类,该类仅对Person中的dressed方法作了具体的实现,而Boy类则是我们所要装饰的具体对象,现在需要一个装饰者来装饰我们的这个Boy对象,这里定义一个PersonCloth类来表示人所穿着的衣服。

 1 /**
 2  * 装饰者
 3  */
 4 public abstract class PersonCloth extends Person{
 5     protected Person mPerson;
 6
 7     public PersonCloth(Person person){
 8         mPerson = person;
 9     }
10
11     @Override
12     public void dressed() {
13         mPerson.dressed();
14     }
15 }

在PersonCloth类中我们保持了一个对Person类的引用,可以方便地调用具体被装饰对象中的方法,这也是为什么我们可以在不破坏原类层次结构的情况下为类增加一些功能,我们只需要在被装饰者对象的相应方法的前或者后添加相应的功能逻辑就可以了,在装饰物只有一个的情况下,可以不必声明一个抽象类作为装饰者抽象的提取,仅需定义一个普通的类表示装饰者即可,这里为了表明示例我们定义两种衣服类型,一个类ExpensiveCloth表示高档衣服。

 1 /**
 2  * 高档衣服
 3  */
 4 public class ExpensiveCloth extends PersonCloth{
 5     public ExpensiveCloth(Person person) {
 6         super(person);
 7     }
 8
 9     //穿了短袖
10     private void dressShirt(){
11         System.out.println("穿了短袖");
12     }
13
14     //穿了皮衣
15     private void dressLeather(){
16         System.out.println("穿了皮衣");
17     }
18
19     //穿了牛仔裤
20     private void dressJean(){
21         System.out.println("穿了牛仔裤");
22     }
23
24     @Override
25     public void dressed() {
26         super.dressed();
27         dressShirt();
28         dressLeather();
29         dressJean();
30     }
31 }

逻辑依旧很简单,而另一个类CheapCloth则表示便宜的衣服

 1 /**
 2  * 便宜的衣服
 3  */
 4 public class CheapCloth extends PersonCloth{
 5     public CheapCloth(Person person) {
 6         super(person);
 7     }
 8
 9     //穿短裤
10     public void dressShorts(){
11         System.out.println("穿了短裤");
12     }
13
14     @Override
15     public void dressed() {
16         super.dressed();
17         dressShorts();
18     }
19 }

这两个类本质上并没有区别,两者都是为原本Boy类中的dressed方法提供功能扩展,不过这种扩展并非是直接修改原有的方法逻辑或者结构,更恰当地说,仅仅是在另一个类中将原有方法和新逻辑进行封装和整合而已,最后我们来看看客户类中的调用。

 1 /**
 2  * 测试类
 3  */
 4 public class DecoratorTest {
 5
 6     public static void main(String[] args){
 7         test();
 8     }
 9
10     public static void test(){
11
12         //首先我们要有一个Person对象
13         Person person = new Boy();
14
15         //然后为他穿上便宜的衣服
16         PersonCloth personCloth = new CheapCloth(person);
17         person.dressed();
18
19         //然后为他穿上了贵的衣服
20         PersonCloth personCloth1 = new ExpensiveCloth(personCloth);
21         personCloth1.dressed();
22     }
23 }

运行结果如下:

穿了内衣和内裤
穿了内衣和内裤
穿了短裤
穿了短袖
穿了皮衣
穿了牛仔裤

时间: 2024-10-17 10:51:30

7 结构型模式之 - 装饰模式的相关文章

结构型模式之装饰模式

概述 装饰模式可以在不改变一个对象本身功能的基础上给对象增加额外的新行为,在现实生活中,这种情况也到处存在,例如一张照片,我们可以不改变照片本身,给它增加一个相框,使得它具有防潮的功能,而且用户可以根据需要给它增加不同类型的相框,甚至可以在一个小相框的外面再套一个大相框. 装饰模式是一种用于替代继承的技术,它通过一种无须定义子类的方式来给对象动态增加职责,使用对象之间的关联关系取代类之间的继承关系.在装饰模式中引入了装饰类,在装饰类中既可以调用待装饰的原有类的方法,还可以增加新的方法,以扩充原有

设计模式_结构型模式_装饰模式

a) 装饰模式定义:动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活. b) 代码: i. Component类: Abstract class Component{ public abstract void Operation(); } ii. Class ConcreteComponent类: class ConcreteComponent:Component{ Public override void Operation(){ Console.WriteLin

10结构型模式之装饰模式

概念   装饰( Decorator )模式又叫做包装模式.通过一种对客户端透明的方式来扩展对象的功能,是继承关系的一个替换方案. 装饰模式就是把要添加的附加功能分别放在单独的类中,并让这个类包含它要装饰的对象,当需要执行时,客户端就可以有选择地.按顺序地使用装饰功能包装对象. 类图角色和职责 适用于: 装饰者模式(Decorator Pattern)动态的给一个对象添加一些额外的职责.就增加功能来说,此模式比生成子类更为灵活. 案例 //给跑车,额外添加游泳.飞行的功能 #include <i

第11章 结构型模式—装饰模式

1. 装饰模式(Decorator Pattern)的定义 (1)动态地给一个对象添加一些额外的职责.就增加功能来说,装饰模式比生成子类更为灵活. ①装饰模式是为对象(而不是类)添加功能的. ②用组合方式,而不是继承方式为对象添加功能. (2)装饰模式的结构和说明 ①Component:组件对象的接口,可以给这些对象动态地添加职责. ②ConcreteComponent:具体的组件对象,实现组件对象接口,通常就是被装饰器装饰的原始对象,也就是可以给这个对象添加职责. ③Decorator:所有装

结构型模式:代理模式

文章首发: 结构型模式:代理模式 七大结构型模式之七:代理模式. 简介 姓名 :代理模式 英文名 :Proxy Pattern 价值观 :为生活加点料 个人介绍 : Provide a surrogate or placeholder for another object to control access to it. 为其他对象提供一种代理以控制对这个对象的访问. (来自<设计模式之禅>) 你要的故事 咱们从事 IT 行业,随时都可能上网查东西,如果网络速度慢或者网络访问受限制,那是相当的

设计模式(八) : 结构型模式--装饰模式

装饰模式的目的是为了给一个对象动态的增加一些功能.装饰对象和被装饰的对象实现同一个接口,装饰对象持有被装饰对象的实例. 类图: 示意性代码: package com.javadesignpattern.Decorator; public interface Component { void sampleOperation(); } package com.javadesignpattern.Decorator; public class ConcreteComponent implements

设计模式-10 装饰模式(结构型模式)

一 装饰模式 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装.这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能. 主要解决:扩展一个类经常使用继承方式实现,由于继承为类引入静态特征,并且随着扩展功能的增多,子类会很膨胀. 关键代码:1.Component 类充当抽象角色,不应该具体实现. 2.修饰类引用和继承 Component 类,具

设计模式09: Decorator 装饰模式(结构型模式)

Decorator 装饰模式(结构型模式) 子类复子类,子类何其多加入我们需要为游戏中开发一种坦克,除了不同型号的坦克外,我们还希望在不同场合中为其增加以下一种多种功能:比如红外线夜视功能,比如水路两栖功能,比如卫星定位功能等等. 问题代码: /// <summary> /// 抽象坦克 /// </summary> public abstract class Tank { public abstract void Shot(); public abstract void Run(

结构型模式 装饰模式

结构型模式 装饰模式 适用于:  装饰者模式(Decorator Pattern)动态的给一个对象添加一些额外的职责.就增加功能来说,此模式比生成子类更为灵活. /** * 结构型模式 装饰模式 * 装饰( Decorator )模式又叫做包装模式. * 通过一种对客户端透明的方式来扩展对象的功能,是继承关系的一个替换方案. * 装饰模式就是把要添加的附加功能分别放在单独的类中,并让这个类包含它要装饰的对象,当需要执行时,客户端就可以有选择地.按顺序地使用装饰功能包装对象. * */ #defi