设计模式之装饰器模式

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

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

代码实现

前言:举个栗子,我现在就是钢铁侠,现在雷神的弟弟洛基来到了地球。我为了保护地球,必须打败洛基,但是洛基可是诡计之神啊,我想打败他很困难。所以现在我需要对我的马克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是装饰类,在装饰类中可以放入被增强对象,然后对其进行增强。

优缺点

优点:

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

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

缺点:

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

相关文章
|
19天前
|
设计模式 存储 缓存
聊聊Java设计模式-装饰器模式
装饰器模式允许向一个现有的对象添加新的功能,同时不改变其结果。比如Java 中的IO框架中,`FileInputStream`(处理文件)、`ByteArrayInputStream`(处理字节数组)、`BufferedInputStream`(带缓存的处理类)等就是对`InputStream`进行的功能扩展,这就是装饰器模式的典型应用。
33 1
聊聊Java设计模式-装饰器模式
|
19天前
|
设计模式 Java
常用设计模式(工厂方法,抽象工厂,责任链,装饰器模式)
有关设计模式的其他常用模式请参考 单例模式的实现 常见的设计模式(模板与方法,观察者模式,策略模式)
41 2
|
19天前
|
设计模式
设计模式之装饰器模式
设计模式之装饰器模式
|
19天前
|
设计模式
二十三种设计模式全面解析-装饰器模式-超越继承的灵活装扮
二十三种设计模式全面解析-装饰器模式-超越继承的灵活装扮
|
19天前
|
设计模式
设计模式-装饰器模式
设计模式-装饰器模式
|
8月前
|
设计模式
【面试题精讲】javaIO设计模式之装饰器模式
【面试题精讲】javaIO设计模式之装饰器模式
|
17天前
|
设计模式 Java
Java一分钟之-设计模式:装饰器模式与代理模式
【5月更文挑战第17天】本文探讨了装饰器模式和代理模式,两者都是在不改变原有对象基础上添加新功能。装饰器模式用于动态扩展对象功能,但过度使用可能导致类数量过多;代理模式用于控制对象访问,可能引入额外性能开销。文中通过 Java 代码示例展示了两种模式的实现。理解并恰当运用这些模式能提升代码的可扩展性和可维护性。
32 1
|
19天前
|
设计模式 缓存 监控
设计模式之装饰器模式
**装饰器模式**是一种设计模式,用于在运行时动态添加或移除对象的功能,保持接口不变,无需修改原始代码。它适用于不修改已有代码而需动态扩展功能的场景。常见应用包括GUI组件增强、Web开发中的函数扩展、缓存与代理、日志记录、数据库连接池和事务管理等。在Java的Web开发中,Spring框架的拦截器(Interceptor)是一个实现示例,用于权限控制等预处理或后处理任务。
|
19天前
|
设计模式 Java
23种设计模式,装饰器模式的概念优缺点以及JAVA代码举例
【4月更文挑战第5天】装饰器模式(Decorator Pattern)是一种结构型设计模式,它允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式作为现有类的一个包装。
41 6
|
19天前
|
设计模式 传感器 数据处理
探索设计模式的魅力:为什么你应该了解装饰器模式-代码优化与重构的秘诀
装饰器模式是一种设计模式,它允许在运行时向对象添加额外的职责,而无需修改其代码。这种模式提供了一种动态扩展对象功能的方法,同时保持了对象的单一职责原则。本文介绍了装饰器模式的基本概念、原理、优势、适用场景、实现方法、最佳实践和注意事项。通过装饰器模式,可以将多个行为组合成一个更复杂的行为,而无需使用继承或大量的接口实现。装饰器模式适用于需要对一个对象进行一系列的增强处理的情况,而这些增强处理可以以一种松耦合的方式进行组合。通过使用装饰器模式,可以提高代码的可维护性、可扩展性和灵活性,使系统更加灵活和易于维护
49 1
探索设计模式的魅力:为什么你应该了解装饰器模式-代码优化与重构的秘诀