本篇文章主要介绍了" Java设计模式篇(四)--装饰模式详解",主要涉及到方面的内容,对于移动开发感兴趣的同学可以参考一下:
我们来说一下装饰模式。一、什么是装饰模式装饰模式也叫包装模式,使用它可以给指定对象增强原有功能,用于扩展原有功能。相比于子类继承,装饰模式提供了更好的灵活性。而...
我们来说一下装饰模式。
一、什么是装饰模式
装饰模式也叫包装模式,使用它可以给指定对象增强原有功能,用于扩展原有功能。相比于子类继承,装饰模式提供了更好的灵活性。而对于使用者来说,这个过程是透明的,调用方式没有发生变化。
二、装饰模式的结构图

从结构图我们可以看到,在装饰模式中存在的角色:
- 抽象组件角色(Component):在抽象组件接口类中,抽象出要增强的功能接口。
- 具体组件角色(ConcreteComponent):实际就是被装饰者对象类,实现了抽象组件接口,用来定义一个实实在在的对象,给此对象进行功能增强。
- 装饰角色父类(Decorator):在装饰角色父类中,持有抽象组件角色的对象,实现了抽象组件角色接口,这样,当抽象组件进行实例化的时候,可以明确知道要给哪个对象增加职责。这么做的目的是为了实现扩展和可复用,并且对于被装饰者对象而言,这个过程是透明的。
- 具体装饰类角色(ConcreteDecorator):定义具体的装饰行为实现。
三、用法举例
我们举一例,比如,西游记中,孙大圣为了降伏妖怪,迫不得已的时候需要利用72般变化。72般变化为增强降伏妖怪的过程变得生动精彩。我们的孙大圣是什么?一只猴子。我们先来画类图:

1、我们先定义大圣打妖怪这个接口类。
package com.zhaodf.pattern.decoratorPattern;
public interface PlayDevil{
void playTheDevil();
}
2、定义大圣本尊
package com.zhaodf.pattern.decoratorPattern;
public class Sunstory implements PlayDevil{
public void playTheDevil() {
System.out.println("孙大圣打妖怪");
}
}
3、定义装饰类:孙大圣要变化
package com.zhaodf.pattern.decoratorPattern;
public class MythChange implements PlayDevil{
private PlayDevil playDevil;
public MythChange(PlayDevil playDevil){
this.playDevil = playDevil;
}
public void playTheDevil() {
playDevil.playTheDevil();
}
}
4、定义具体装饰类角色
大圣变蜜蜂:
package com.zhaodf.pattern.decoratorPattern;
public class MythChangeToBee extends MythChange{
public MythChangeToBee(PlayDevil playDevil) {
super(playDevil);
}
@Override
public void playTheDevil() {
System.out.println("孙大圣变成了蜜蜂");
}
}
大圣变小鱼: