设计模式之装饰器模式

简介: 设计模式之装饰器模式

装饰器模式:在不改变原文件以及使用继承的情况下,对一个类动态的增加功能。实际上就是创建一个装饰对象,把真实的对象放入装饰对象中,然后进行扩展。

代码实现

前言:举个栗子,我现在就是钢铁侠,现在雷神的弟弟洛基来到了地球。我为了保护地球,必须打败洛基,但是洛基可是诡计之神啊,我想打败他很困难。所以现在我需要对我的马克7号进行改造,在我的马克7号上面添加几种武器,使我的战衣更加强大,才能打败洛基。但是我不能直接把我的战衣拆掉重新改造,如果拆掉再改造再装好,地球都已经毁灭了,我需要直接将武器装在已有的战衣上,这个时候,我们就用到了装饰器模式

钢铁侠(抽象构件 Component)

@AllArgsConstructor
@NoArgsConstructor
@Data
public abstract class IronMan {
    private String suitName;
    public abstract void show();
}

马克7号(具体构件 Concrete Component)

public class Mark7 extends IronMan {
    @Override
    public void show() {
        this.setSuitName("马克7号");
        System.out.println("战衣名称:" + this.getSuitName());
    }
}

改造类(抽象装饰 Decorator)

public abstract class Remould extends IronMan {
    private IronMan ironMan;
    public void remould(IronMan ironMan) {
        this.ironMan = ironMan;
    }
    @Override
    public void show() {
        if (ironMan != null) {
            ironMan.show();
        }
    }
}

电弧脉冲炮(具体装饰 Concrete Decorator)

public class ArcPulseGun extends Remould {
    @Override
    public void show() {
        super.show();
        System.out.println("名称:电弧脉冲炮,描述:发射一种双效功能的非杀伤电弧型刺激弹");
    }
}

集束炮(具体装饰 Concrete Decorator)

public class ClusterGun extends Remould {
    @Override
    public void show() {
        super.show();
        System.out.println("名称:集束炮,描述:集束炮是集中于胸部一点的直线型远距离攻击,画面上常表现为一束高能、密集、持续的粒子流");
    }
}

激光武器(具体装饰 Concrete Decorator)

public class LaserWeapons extends Remould {
    @Override
    public void show() {
        super.show();
        System.out.println("名称:激光武器,描述:用高能的激光对远距离的目标进行精确射击或用于防御导弹等的武器");
    }
}

测试类

public class DecoratorTest {
    public static void main(String[] args) {
        IronMan ironMan = new Mark7();
        System.out.println("改进战衣");
        ArcPulseGun arcPulseGun = new ArcPulseGun();
        arcPulseGun.remould(ironMan);
        ClusterGun clusterGun = new ClusterGun();
        clusterGun.remould(arcPulseGun);
        LaserWeapons laserWeapons = new LaserWeapons();
        laserWeapons.remould(clusterGun);
        laserWeapons.show();
    }
}

结果

改进战衣
战衣名称:马克7号
名称:电弧脉冲炮,描述:发射一种双效功能的非杀伤电弧型刺激弹
名称:集束炮,描述:集束炮是集中于胸部一点的直线型远距离攻击,画面上常表现为一束高能、密集、持续的粒子流
名称:激光武器,描述:用高能的激光对远距离的目标进行精确射击或用于防御导弹等的武器

源码分析

对于io流,基本上就是用的此设计模式,对于基本的文件输入流,可以在包裹一层缓冲流。

DataInputStream dis = new DataInputStream(new FileInputStream("c:\\decorator.txt"));

可以看到FileInputStream是被增强的对象,然后DataInputStream是装饰类,在装饰类中可以放入被增强对象,然后对其进行增强。

优缺点

优点:

通过使用不同的具体装饰类以及这些装饰类的排列组合,动态的方式来扩展一个对象的功能。

相比于继承,装饰器模式可以提供比继承更多的灵活性。

缺点:

使用装饰器模式会产生比使用继承关系更多的对象,多层装饰比较复杂。

相关文章
|
6月前
|
设计模式 存储 缓存
聊聊Java设计模式-装饰器模式
装饰器模式允许向一个现有的对象添加新的功能,同时不改变其结果。比如Java 中的IO框架中,`FileInputStream`(处理文件)、`ByteArrayInputStream`(处理字节数组)、`BufferedInputStream`(带缓存的处理类)等就是对`InputStream`进行的功能扩展,这就是装饰器模式的典型应用。
61 1
聊聊Java设计模式-装饰器模式
|
6月前
|
设计模式 Java
常用设计模式(工厂方法,抽象工厂,责任链,装饰器模式)
有关设计模式的其他常用模式请参考 单例模式的实现 常见的设计模式(模板与方法,观察者模式,策略模式)
60 2
|
6月前
|
设计模式
设计模式之装饰器模式
设计模式之装饰器模式
|
6月前
|
设计模式
设计模式-装饰器模式
设计模式-装饰器模式
|
1月前
|
设计模式 XML Java
【设计模式】装饰器模式(定义 | 特点 | Demo入门讲解)
【设计模式】装饰器模式(定义 | 特点 | Demo入门讲解)
31 0
|
6月前
|
设计模式 Java
Java一分钟之-设计模式:装饰器模式与代理模式
【5月更文挑战第17天】本文探讨了装饰器模式和代理模式,两者都是在不改变原有对象基础上添加新功能。装饰器模式用于动态扩展对象功能,但过度使用可能导致类数量过多;代理模式用于控制对象访问,可能引入额外性能开销。文中通过 Java 代码示例展示了两种模式的实现。理解并恰当运用这些模式能提升代码的可扩展性和可维护性。
63 1
|
2月前
|
设计模式 Java
Java设计模式-装饰器模式(10)
Java设计模式-装饰器模式(10)
|
5月前
|
设计模式 Java
Java设计模式:深入装饰器模式的三种写法(六)
Java设计模式:深入装饰器模式的三种写法(六)
|
5月前
|
设计模式 架构师 安全
设计模式第五讲-装饰器模式和代理模式详解
远程代理,这种方式通常是为了隐藏目标对象存在于不同地址空间的事实,方便客户端访问。例如,用户申请某些网盘空间时,会在用户的文件系统中建立一个虚拟的硬盘,用户访问虚拟硬盘时实际访问的是网盘空间。
264 0
|
6月前
|
设计模式 传感器 数据处理
探索设计模式的魅力:为什么你应该了解装饰器模式-代码优化与重构的秘诀
装饰器模式是一种设计模式,它允许在运行时向对象添加额外的职责,而无需修改其代码。这种模式提供了一种动态扩展对象功能的方法,同时保持了对象的单一职责原则。本文介绍了装饰器模式的基本概念、原理、优势、适用场景、实现方法、最佳实践和注意事项。通过装饰器模式,可以将多个行为组合成一个更复杂的行为,而无需使用继承或大量的接口实现。装饰器模式适用于需要对一个对象进行一系列的增强处理的情况,而这些增强处理可以以一种松耦合的方式进行组合。通过使用装饰器模式,可以提高代码的可维护性、可扩展性和灵活性,使系统更加灵活和易于维护
121 1
探索设计模式的魅力:为什么你应该了解装饰器模式-代码优化与重构的秘诀