• 结构型模式-装饰器模式


    允许向一个现有的对象添加新的功能,同时又不改变其结构,这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。

    装饰器模式通过将对象包装在装饰器类中,以便动态地修改其行为。

    这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。

    意图:动态地给一个对象添加一些额外的职责。就增加功能来说,装饰器模式相比生成子类更为灵活。

    主要解决:一般的,我们为了扩展一个类经常使用继承方式实现,由于继承为类引入静态特征,并且随着扩展功能的增多,子类会很膨胀。

    何时使用:在不想增加很多子类的情况下扩展类。

    如何解决:将具体功能职责划分,同时继承装饰者模式。

    关键代码: 1、Component 类充当抽象角色,不应该具体实现。 2、修饰类引用和继承 Component 类,具体扩展类重写父类方法。

    应用实例: 1、孙悟空有 72 变,当他变成"庙宇"后,他的根本还是一只猴子,但是他又有了庙宇的功能。 2、不论一幅画有没有画框都可以挂在墙上,但是通常都是有画框的,并且实际上是画框被挂在墙上。在挂在墙上之前,画可以被蒙上玻璃,装到框子里;这时画、玻璃和画框形成了一个物体。

    优点:装饰类和被装饰类可以独立发展,不会相互耦合,装饰模式是继承的一个替代模式,装饰模式可以动态扩展一个实现类的功能。

    缺点:多层装饰比较复杂。

    使用场景: 1、扩展一个类的功能。 2、动态增加功能,动态撤销。

    注意事项:可代替继承。

    1. public interface Shape {
    2. void draw();
    3. }
    1. public class Circle implements Shape{
    2. @Override
    3. public void draw() {
    4. System.out.println("this is Circle.draw");
    5. }
    6. }
    1. public class Rectangle implements Shape{
    2. @Override
    3. public void draw() {
    4. System.out.println("this is Rectangle.draw");
    5. }
    6. }
    1. public class RedShapeDecorator extends ShapeDecorator{
    2. public RedShapeDecorator(Shape decoratedShape) {
    3. super(decoratedShape);
    4. }
    5. @Override
    6. public void draw() {
    7. decoratedShape.draw();
    8. setRedBorder(decoratedShape);
    9. }
    10. private void setRedBorder(Shape decoratedShape){
    11. System.out.println("Border Color: Red");
    12. }
    13. }
    1. public abstract class ShapeDecorator implements Shape {
    2. protected Shape decoratedShape;
    3. public ShapeDecorator(Shape decoratedShape){
    4. this.decoratedShape = decoratedShape;
    5. }
    6. public void draw(){
    7. decoratedShape.draw();
    8. }
    9. }
    1. @Test
    2. public void test6(){
    3. Shape circle = new Circle();
    4. ShapeDecorator redCircle = new RedShapeDecorator(new Circle());
    5. ShapeDecorator redRectangle = new RedShapeDecorator(new Rectangle());
    6. circle.draw();
    7. System.out.println("-----------");
    8. redCircle.draw();
    9. System.out.println("-----------");
    10. redRectangle.draw();
    11. }

    this is Circle.draw
    -----------
    this is Circle.draw
    Border Color: Red
    -----------
    this is Rectangle.draw
    Border Color: Red
     

  • 相关阅读:
    AI绘画部署及模型推荐和下载
    离散信号的卷积与相关
    【操作系统笔记十三】Shell脚本编程
    LeetCode:第304场周赛【总结】
    maven打jar包运行jar包
    OpenHarmony环境搭建报错: ImportError: cannot import name ‘VERSION‘ from ‘hb.__main__‘
    1.3数据结构之复杂度 力扣题目移除元素
    hzero-resource秒退
    GC暂停时间过长——排查分析
    微服务生态组件之Spring Cloud LoadBalancer详解和源码分析
  • 原文地址:https://blog.csdn.net/weixin_44233087/article/details/132818623