java 设计模式之装饰器模式学习

简介: java 设计模式之装饰器模式学习

装饰器模式

介绍

装饰器模式是一种用于代替继承的技术,无需通过继承增加子类就能扩展对象的新功能。使

用对象的关联关系代替继承关系,更加灵活,同时避免类型体系的快速膨胀。

装饰器UML图如下

3.png1、 组件(component): 定义了全部组件类和装饰器类的行为。

2、装饰器抽象类(decorator):实现了component接口的抽象类,封装了一个被修饰的component对象。

3、组件实现类(ConcreteComponent): 实现 Component 接口,组件实现类就是被装饰器装饰的原始对象,新功能或者附加功能都是通过装饰器添加到该类的对象上的

4、具体装饰器类(ConcreteDecorator):该实现类要向被装饰的对象添加某些功能

代码实现

假如有这么一个需求,你女朋友想要和红豆奶茶,然后她还想喝珍珠奶茶,还想要燕麦的,总不能点三杯把,这个时候装饰器模式就用上了。

代码如下:

组件类 MilkyTea:

/**
 *  组件:定义了全部组件类和装饰器实现的行为
 */
public interface MilkyTea {
    /**
     *  喝奶茶
     */
    String drink();
}

装饰器抽象类 MilkyTeaDecorator:

public abstract class MilkyTeaDecorator implements MilkyTea{
    private MilkyTea milkyTea;
    public MilkyTeaDecorator(MilkyTea milkyTea) {
        this.milkyTea = milkyTea;
    }
    @Override
    public String drink() {
        return milkyTea.drink();
    }
}

组件实现类 RedBeanMilkyTea :

/**
 * 组件实现类
 */
public class RedBeanMilkyTea implements MilkyTea {
    @Override
    public String drink() {
        return "红豆奶茶 ";
    }
}

具体装饰器类:

public class AddPearl extends MilkyTeaDecorator{
    public AddPearl(MilkyTea milkyTea) {
        super(milkyTea);
    }
    @Override
    public String drink() {
        return super.drink() + " + 珍珠";
    }
}


public class AddOat extends MilkyTeaDecorator{
    public AddOat(MilkyTea milkyTea) {
        super(milkyTea);
    }
    @Override
    public String drink() {
        return super.drink()+" + 麦片";
    }
}

测试类:

public class MilkTeaDemo {
    public static void main(String[] args) {
        MilkyTea redBean = new RedBeanMilkyTea();
        // 加燕麦
        redBean = new AddOat(redBean);
        System.out.println(redBean.drink());
        // 加奶茶
        redBean = new AddPearl(redBean);
        System.out.println(redBean.drink());
    }
}

结果:

红豆奶茶  + 麦片
红豆奶茶  + 麦片 + 珍珠

总结

装饰器相对于继承,装饰器模式灵活性更强,扩展性更强:

1、灵活性:装饰器模式将功能切分成一个个独立的装饰器,在运行期可以根据需要动态的添加功能,甚至对添加的新功能进行自由的组合;

2、扩展性:当有新功能要添加的时候,只需要添加新的装饰器实现类,然后通过组合方式添加这个新装饰器,无需修改已有代码,符合开闭原则;


能力有限,水平一般,如有错误,请多指教


目录
相关文章
|
4天前
|
设计模式 安全 Java
【JAVA】Java 中什么叫单例设计模式?请用 Java 写出线程安全的单例模式
【JAVA】Java 中什么叫单例设计模式?请用 Java 写出线程安全的单例模式
|
2天前
|
算法 Java 大数据
Java从入门到精通学习报告
Java从入门到精通学习报告
9 1
|
2天前
|
消息中间件 监控 安全
【JAVAEE学习】探究Java中多线程的使用和重点及考点
【JAVAEE学习】探究Java中多线程的使用和重点及考点
|
3天前
|
Java
【专栏】如何在 Java 8 中使用 Streams?结合多种案例剖析学习!
【4月更文挑战第28天】Java 8 的 Streams 提供了一种处理数据集合的新方式,增强了代码的可读性和可维护性。本文介绍了 Streams 的基本概念,如从数据源创建 Stream,以及中间和终端操作。通过过滤、映射、归并、排序、分组等案例,展示了 Streams 的使用,包括并行 Streams 提高效率。学习 Streams 可以提升代码质量和效率,文章鼓励读者在实际开发中探索更多 Streams 功能。
|
3天前
|
存储 监控 Java
Java 零基础入门学习(小白也能看懂!)四
Java 零基础入门学习(小白也能看懂!)四
|
3天前
|
存储 安全 Java
Java 零基础入门学习(小白也能看懂!)三
Java 零基础入门学习(小白也能看懂!)三
|
3天前
|
存储 机器学习/深度学习 Java
Java 零基础入门学习(小白也能看懂!)二
Java 零基础入门学习(小白也能看懂!)二
|
3天前
|
Java 编译器 程序员
Java 零基础入门学习(小白也能看懂!)一
Java 零基础入门学习(小白也能看懂!)一
|
3天前
|
Java
Java学习——类与对象(二)
Java学习——类与对象(二)
|
3天前
|
Java C++
Java学习——类与对象(一)
Java学习——类与对象(一)