没想到这么快俺又粗来了,在学习装饰者模式,这次使用的案例比较接近生活,嗯嗯,不用多想,就是超级英雄钢铁侠;
一 : 含义 什么是装饰者模式 ?
指在不改变现有对象结构的情况下,动态地给该对象增加一些职责(即增加其额外功能)的模式,它属于对象结构型模式。
二 : 解决的问题
一般的,我们为了扩展一个类经常使用继承方式实现,由于继承为类引入静态特征,并且随着扩展功能的增多,子类会很膨胀
三: 实例
3.1 模式结构
装饰器模式主要包含以下角色。
1.抽象构件(Component)角色:定义一个抽象接口以规范准备接收附加责任的对象。
2.具体构件(ConcreteComponent)角色:实现抽象构件,通过装饰角色为其添加一些职责。
3.抽象装饰(Decorator)角色:继承抽象构件,并包含具体构件的实例,可以通过其子类扩展具体构件的功能。
4.具体装饰(ConcreteDecorator)角色:实现抽象装饰的相关方法,并给具体构件对象添加附加的责任。
3.3 结构图 :
3.3 实现代码 :
步骤一 : 抽象装饰接口
* @Description 钢铁侠接口 抽象装饰角色
* @createTime 2021年05月11日 15:27:00
*/
public interface IranMan {
/**
* 描述
*/
void description();
}
步骤二 : 创建具体装饰对象
* @Description 史塔克 : 具体被装饰的对象
* @createTime 2021年05月11日 15:28:00
*/
public class Stark implements IranMan {
@Override
public void description() {
System.out.println("超级英雄钢铁侠史塔克 , 降临 !");
}
}
步骤三 : 装饰抽象类
public class Decorator implements IranMan {
@Override
public void description() {
}
}
步骤四 : Mark44 具体装饰类
* @Description Mark44 具体装饰类: 实现了反浩克功能
* @createTime 2021年05月11日 15:35:00
*/
public class Mark44 extends Decorator {
IranMan iranMan;
public Mark44(IranMan iranMan) {
this.iranMan=iranMan;
}
@Override
public void description(){
System.out.println("反浩克装甲加身 !");
iranMan.description();
}
}
步骤五 : Mark50 具体装饰类
* @Description Mark50 具体装饰类
* @createTime 2021年05月11日 15:53:00
*/
public class Mark50 extends Decorator {
IranMan iranMan;
public Mark50(IranMan iranMan) {
this.iranMan=iranMan;
}
@Override
public void description(){
System.out.println("纳米装甲,无敌大锤加身 !");
iranMan.description();
}
}
步骤六 : 实现
public static void main(String[] args) {
IranMan stark = new Stark();
stark = new Mark44(stark);
stark = new Mark50(stark);
stark.description();
}
四 总结 :
优点 :
1.装饰器是继承的有力补充,比继承灵活,在不改变原有对象的情况下,动态的给一个对象扩展功能,即插即用
2.通过使用不用装饰类及这些装饰类的排列组合,可以实现不同效果
3.装饰器模式完全遵守开闭原则
缺点 :
装饰器模式会增加许多子类,过度使用会增加程序得复杂性
应用场景 :
1.当需要给一个现有类添加附加职责,而又不能采用生成子类的方法进行扩充时。例如,该类被隐藏或者该类是终极类或者采用继承方式会产生大量的子类。
2.当需要通过对现有的一组基本功能进行排列组合而产生非常多的功能时,采用继承关系很难实现,而采用装饰器模式却很好实现。
3.当对象的功能要求可以动态地添加,也可以再动态地撤销时。
对装饰者模式的学习就记录这么多,如果对大家有帮助的话,可以点一个赞哈,你的鼓励也是创作的动力.共同在计算机的世界加油吧 !