IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> 设计模式之装饰器模式 -> 正文阅读

[Java知识库]设计模式之装饰器模式

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

代码实现

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

优缺点

优点:

通过使用不同的具体装饰类以及这些装饰类的排列组合,动态的方式来扩展一个对象的功能。
相比于继承,装饰器模式可以提供比继承更多的灵活性。

缺点:

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

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-03-22 20:22:50  更:2022-03-22 20:24:40 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 7:14:31-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码