[TOC]
1.定义
2.生活小实例
3.UML类图
4.代码解析
5.说明
1.定义
装饰模式:简单地说,就是动态地给一个对象添加一些额外的功能,通过一个个的装饰类对这个对象层层包装。
(区别于建造者模式,建造者模式是一个稳定地构造过程,步骤在内部都规定好了。而装饰模式可以动态地改变这些装饰的步骤)
2.生活小实例
给大家举个例子:有一个人的对象,比如说名字是小红,她有一个喜好,就是非常喜欢化妆。每天出门前总要化妆。有一天快迟到了,小红匆忙起来但是也没有忘记化妆。拿起一支口红和一个眉笔熟练地化了起来。。。
这里小红就是一个对象,而画口红和描眉都是她的额外做的一些事情,所以这里可以写成装饰模式。
3.UML类图
“Component是定义一个对象接口,可以给这些对象动态地添加职责。ConcreteComponent是定义了一个具体的对象,也可以给这个对象添加一些职责。Decorator,装饰抽象类,继承了Component,从外类来扩展Component类的功能,但对于Component来说,是无需知道Decorator的存在的。至于ConcreteDecorator就是具体的装饰对象,起到给Component添加职责的功能。
4.代码解析
首先是一个抽象的对象类,是为了以后有了新需求方便扩展,如果项目里只有一个比较特殊的对象需要装饰那么这个类也可以不用写
/**
* Created by cyy on 2017/1/7.
*
* 抽象的对象类
*/
public interface Component {
void action();
}
具体的要被装饰的对象,可以有自己单独的一些功能
/**
* Created by cyy on 2017/1/7.
*
* 具体的对象
*/
public class ConcreteConponent implements Component{
private String name;
public ConcreteConponent(String name){
this.name = name;
Log.e(Constant.DECORATE_LOG_TAG, "大家好,我的名字是:" + name);
}
@Override
public void action() {
Log.e(Constant.DECORATE_LOG_TAG, name + "开始化妆");
}
}
装饰类父类,实现Component接口,有Component的全局变量,方便对这个对象进行控制。运用setComponent(Component component)方法来包装Component对象,之所以装饰类实现Component就是因为可以把装饰(化口红)后的对象当成一个对象来继续进行装饰(描眉),简化了开发流程。
/**
* Created by cyy on 2017/1/7.
*
* 装饰类父类,通过setComponent方法对Component对象来进行包装,action方法写具体的操作逻辑
*/
public class Decorate implements Component{
private Component component;
public void setComponent(Component component){
this.component = component;
}
@Override
public void action() {
if(component != null){
component.action();
}
}
}
/**
* Created by cyy on 2017/1/7.
*
* 具体的装饰类,画口红
*/
public class KHDecorate extends Decorate{
@Override
public void action() {
//这一步挺重要,可以最后调用一个装饰类的方法把所有功能都给加上
super.action();
Log.e(Constant.DECORATE_LOG_TAG, "画口红");
}
}
/**
* Created by cyy on 2017/1/7.
*
* 具体的装饰类,描眉毛
*/
public class MMDecorate extends Decorate{
@Override
public void action() {
//这一步挺重要,可以最后调用一个装饰类的方法把所有功能都给加上
super.action();
Log.e(Constant.DECORATE_LOG_TAG, "描眉毛");
}
}
然后是客户端代码
/**
* 化妆的小红
*/
private void decorateXh() {
ConcreteConponent xhConponent = new ConcreteConponent("小红");
KHDecorate khDecorate = new KHDecorate();
MMDecorate mmDecorate = new MMDecorate();
khDecorate.setComponent(xhConponent);
mmDecorate.setComponent(khDecorate);
mmDecorate.action();
}
运行结果
5.说明
如果需要增加额外的功能就此例来说比如说描眉后再画眼线,戴手链。。。可以再写装饰类继承Decorator类,还可以在客户端更换装饰的顺序。