一:今天我们讲到装饰者模式,什么叫做装饰者模式呢?装饰者模式一般又常用于哪些场景呢?
所谓装饰者模式就是我们一般动态的给某些对象添加一些职责(功能)所用的方式(有点抽象哈,下面会详讲);
装饰者模式我们一般适用于某些对象经常添加或者删除功能(方法的场景下);
二:今天我们以一个小汤上班的例子来详细讲解一下装饰者模式
早上起来,小汤同学又要上班了,该怎么去上班呢,步行,骑车,还是打的。。。
定义一个接口,里面有一个方法就是出发上班的方法
** * Created by zhou on 2016/4/9. */ public interface Conponent { //小汤同学要出发去上班了 public void Operation(); }定义一个类实现这个接口,这一个也叫作未被装饰类
** * Created by zhou on 2016/4/9. */ public class ConcreteConponent implements Conponent{ //这是出发上班的方法,但是还没选择交通方式 @Override public void Operation() { System.out.print("小汤同学开始出发去上班"); } }再 定义一个抽象类(装饰类),所有的交通方式都要实现这个抽象类
** * Created by zhou on 2016/4/9. */ public abstract class Decorator implements Conponent { protected Conponent conponent; public void setConponent(Conponent conponent){ this.conponent = conponent; } @Override public void Operation() { if(conponent != null){ conponent.Operation(); } } }
步行去上班的类
/** * Created by zhou on 2016/4/9. */ public class ConcreteDecotatorWalk extends Decorator { public void addA(){ System.out.print("小汤同学步行去上班"); } @Override public void Operation() { super.Operation(); addA(); } }
骑车去上班的类
/** * Created by zhou on 2016/4/9. */ public class ConcreteDecotatorRide extends Decorator { public void addB(){ System.out.print("小汤同学骑自行车去上班"); } @Override public void Operation() { super.Operation(); addB(); } }
打的去上班的类
/** * Created by zhou on 2016/4/9. */ public class ConcreteConponentText extends Decorator{ private void addText(){ System.out.print("小汤同学打的去上班"); } @Override public void Operation() { //如果以前有动作先进行以前的 super.Operation(); //这个就相当于装饰 addText(); } }
接下来就是选择交通方式
1. 今天准备步行去上班
//步行去上班 ConcreteConponent concreteConponent = new ConcreteConponent(); ConcreteDecotatorWalk concreteDecotatorWalk = new ConcreteDecotatorWalk(); concreteDecotatorWalk.setConponent(concreteConponent); concreteConponent.Operation();
2.今天准备骑车去上班
//骑车去上班 ConcreteConponent concreteConponent = new ConcreteConponent(); ConcreteDecotatorRide concreteDecotatorB = new ConcreteDecotatorRide(); concreteDecotatorB.setConponent(concreteConponent); concreteDecotatorB.Operation();
3.先步行再打的去上班
/** * 先是步行,最后走到一半累了,然后打车去上班 */ ConcreteConponent concreteConponent = new ConcreteConponent(); ConcreteDecotatorWalk concreteDecotatorWalk = new ConcreteDecotatorWalk(); concreteDecotatorWalk.setConponent(concreteConponent); ConcreteConponentText concreteConponentText = new ConcreteConponentText(); concreteConponentText.setConponent(concreteDecotatorWalk); concreteConponentText.Operation();
一般情况下我们要为某个类增加一个功能通常是实现这个类,在它的子类中增加这个功能,但是我们我们如果频繁增加功能会导致子类非常多,不利于维护,本文中就是一个装饰者模式的设计方式解决了这个问题,这样做的好处就是有效的把类中的装饰功能从类中搬移去除,有效的把类的核心职责和装饰功能分离开,这样也可以去除相关装饰类的重复逻辑。
本项目的github地址: https://github.com/zhouwei5200/DecoreatorDemo