一 装饰者模式介绍
装饰者模式是指动态的给对象添加一些职责,其重点是动态扩展对象的功能;如下图,雪人组件接口(Snowman)定义了雪人的功能(装饰雪人),装饰类(Decorator)继承雪人的功能,具体的装饰者实现者类(ShoesDecorator,ScarfDecorator等)继承装饰类,并对其功能进行添加扩展;具体的组件类(SmallSnowman)和装饰类一样继承组件接口(Snowman);我们可以用具体的装饰类(ShoesDecorator,ScarfDecorator等)将具体的组件类(SmallSnowman)进行装饰打扮(添加职责);
二 雪人组件接口(Snowman)
在雪人组件接口中定义了一个雪人的公共方法-------装饰打扮雪人;
public interface Snowman {
// 装饰雪人
void decoratorSnowman();
}
三 装饰者(Decorator)
装饰者其实就像给父类进行一层包装;将父类装进了自己的构造器,并且实现了父类的装饰方法,在方法内部调用的是父类的同名方法;
/**
* @Author lsc
* @Description <p>装饰雪人 </p>
* @Date 2019/11/9 20:27
*/
public class Decorator implements Snowman {
private Snowman snowman;
// 构造器 将父类装进子类
public void setSnowman(Snowman snowman){
this.snowman = snowman;
}
@Override
public void decoratorSnowman() {
if (snowman!=null){
// 调用父类装饰方法
snowman.decoratorSnowman();
}
}
}
四 具体的装饰者
具体的装饰者继承装饰者,理论上是可以无限多个具体的装饰者,取决于你对具体组件类的扩展;具体的装饰者实现父类的方法,并且在内部调用父类的同名方法,还可以在实现方法中添加特有的职责;
4.1 围巾装饰者
/**
* @Author lsc
* @Description <p> </p>
* @Date 2019/11/9 21:11
*/
public class ScarfDecorator extends Decorator {
private String scarf;
@Override
public void decoratorSnowman() {
// 继承父类装饰
super.decoratorSnowman();
// 添加职责
scarf = "红围巾";
System.out.println(scarf);
}
}
4.2 鞋子装饰者
/**
* @Author lsc
* @Description <p> </p>
* @Date 2019/11/9 21:16
*/
public class ShoesDecorator extends Decorator {
private String shoes;
@Override
public void decoratorSnowman() {
// 继承父类职责
super.decoratorSnowman();
// 添加新职责
shoes = "红色高跟鞋";
System.out.println(shoes);
}
}
4.3 帽子装饰者
/**
* @Author lsc
* @Description <p> 装饰帽子 </p>
* @Date 2019/11/9 20:43
*/
public class CapDecorator extends Decorator {
private String cap;
@Override
public void decoratorSnowman() {
// 继承父类职责
super.decoratorSnowman();
// 添加新功能
cap = "大红帽";
System.out.println(cap);
}
}
五 具体的组件类
具体的组件类实现组件接口;
/**
* @Author lsc
* @Description <p> 雪人具体组件 </p>
* @Date 2019/11/9 21:19
*/
public class SmallSnowman implements Snowman {
@Override
public void decoratorSnowman() {
// 小雪人的装饰
System.out.println("我是可爱的小雪人");
}
}
六 装饰具体组件
public static void main(String[] args) {
// 创建小雪人
SmallSnowman smallSnowman = new SmallSnowman();
// 选择需要的帽子装饰
CapDecorator capDecorator = new CapDecorator();
// 选择需要的围巾装饰
ScarfDecorator scarfDecorator = new ScarfDecorator();
// 选择需要的鞋子装饰
ShoesDecorator shoesDecorator = new ShoesDecorator();
// 小雪人套帽子
capDecorator.setSnowman(smallSnowman);
// 已经套上帽子的小雪人继续套围巾
scarfDecorator.setSnowman(capDecorator);
// 已经套上帽子和围巾的小雪人穿上鞋子
shoesDecorator.setSnowman(scarfDecorator);
// 执行装饰
shoesDecorator.decoratorSnowman();
}
七 结果分析
执行结果
我是可爱的小雪人
大红帽
红围巾
红色高跟鞋
在进行装饰的时候可以看见是将具体的装饰套在了具体组件类身上;有多少个具体装饰类就可以自由组合多少次套装具体装饰类身上,就等于添加了多少个职责;