把书读薄 | 《设计模式之美》设计模式与范式(结构型-装饰器模式)(上)

简介: 本文对应设计模式与范式:结构型(50),装饰器模式 (Decorator Pattern)。装饰器模式和上节学的**桥接模式**(分离实体和行为) 代码结构非常相似,都是用组合来扩展原有类,但解决的问题大不相同。Tips:二手知识加工难免有所纰漏,感兴趣有时间的可自行查阅原文,谢谢。

0x1、定义


允许动态地向一个现有的对象添加新功能,同时不改变其结构,相当于对现有对象的进行了一个包装。


很好理解,就是套了一层,跟代理模式又不一样,装饰器模式可以套娃一样套多层。


0x2、写个例子


桥接模式广度装饰器模式深度,咋体现?还是上节形状的例子:


abstract class Shape {
    abstract void show();
}
// 形状
public class Circle extends Shape {
    @Override void show() { System.out.println("圆形"); }
}
public class Square extends Shape {
    @Override void show() { System.out.println("矩形"); }
}
// 引入颜色
public class RedCircle extends Shape {
    @Override void show() { System.out.println("红色圆形"); }
}
public class RedSquare extends Shape {
    @Override void show() { System.out.println("红色矩形"); }
}
public class BlueCircle extends Shape {
    @Override void show() { System.out.println("蓝色圆形"); }
}
public class BlueSquare extends Shape {
    @Override void show() { System.out.println("蓝色矩形"); }
}


上节是形状或者颜色变多,现在不是,是需求开始变多,比如添加 质感:磨砂和光滑


public class SmoothRedCircle extends RedCircle      // 光滑红色圆形
public class SmoothRedSquare extends RedSquare      // 光滑红色矩形
public class SmoothBlueCircle extends BlueCircle    // 光滑蓝色圆形
public class SmoothBlueSquare extends BlueSquare    // 光滑蓝色矩形
public class MatteRedCircle extends RedCircle       // 磨砂红色圆形
public class MatteRedSquare extends RedSquare       // 磨砂红色矩形
public class MatteBlueCircle extends BlueCircle     // 磨砂蓝色圆形
public class MatteBlueSquare extends BlueSquare     // 磨砂蓝色矩形


可以,子类变成8个了,接着添加 大小:大中小,子类会变成8*3=24个,再加?直接类爆炸~


这种深度多层继承的场景,用装饰器模式就很适合了:


// 抽象组件(接口和抽象类都可以)
interface IShape {
    String show();
}
// 抽象装饰类(内部有一个指向组件对象的引用,用来调装饰前对象的方法)
public abstract class BaseDecorator implements IShape {
    private IShape shape;
    public BaseDecorator(IShape shape) { this.shape = shape; }
    @Override public String show() { return shape.show(); }
}
// 具体组件类
public class CircleShape implements IShape {
    @Override public String show() { return "圆形"; }
}
public class SquareShape implements IShape {
    @Override public String show() { return "矩形"; }
}
// 颜色具体装饰类(可调用抽象装饰类中定义的方法,也可新增方法来扩展对象行为)
public class RedDecorator extends BaseDecorator {
    public RedDecorator(IShape shape) { super(shape); }
    @Override public String show() { return "红色" + super.show(); }
}
public class BlueDecorator extends BaseDecorator {
    public BlueDecorator(IShape shape) { super(shape); }
    @Override public String show() { return "蓝色" + super.show(); }
}
// 材质具体装饰类
public class SmoothDecorator extends BaseDecorator {
    public SmoothDecorator(IShape shape) { super(shape); }
    @Override public String show() { return "光滑" + super.show(); }
}
public class MatteDecorator extends BaseDecorator {
    public MatteDecorator(IShape shape) { super(shape); }
    @Override public String show() { return "磨砂" + super.show(); }
}
// 大小具体装饰类
public class BigDecorator extends BaseDecorator {
    public BigDecorator(IShape shape) { super(shape); }
    @Override public String show() { return "大" + super.show(); }
}
public class MiddleDecorator extends BaseDecorator {
    public MiddleDecorator(IShape shape) { super(shape); }
    @Override public String show() { return "中" + super.show(); }
}
public class SmallDecorator extends BaseDecorator {
    public SmallDecorator(IShape shape) { super(shape); }
    @Override public String show() { return "小" + super.show(); }
}
// 测试用例
public class DecoratorTest {
    public static void main(String[] args) {
        IShape circle = new CircleShape();
        IShape square = new SquareShape();
        IShape redCircle =  new RedDecorator(circle);
        IShape smoothBlueSquare = new SmoothDecorator(new BlueDecorator(square));
        IShape bigMatteRedCircle = new BigDecorator(new MatteDecorator(redCircle));
        System.out.println(circle.show());
        System.out.println(square.show());
        System.out.println(redCircle.show());
        System.out.println(smoothBlueSquare.show());
        System.out.println(bigMatteRedCircle.show());
    }
}


运行输出结果如下


网络异常,图片无法展示
|


用继承要24个子类,用装饰器模式只要10个,顺带画出UML类图:


网络异常,图片无法展示
|

相关文章
|
28天前
|
设计模式 XML Java
【设计模式】装饰器模式(定义 | 特点 | Demo入门讲解)
【设计模式】装饰器模式(定义 | 特点 | Demo入门讲解)
28 0
|
6月前
|
设计模式 Java
Java一分钟之-设计模式:装饰器模式与代理模式
【5月更文挑战第17天】本文探讨了装饰器模式和代理模式,两者都是在不改变原有对象基础上添加新功能。装饰器模式用于动态扩展对象功能,但过度使用可能导致类数量过多;代理模式用于控制对象访问,可能引入额外性能开销。文中通过 Java 代码示例展示了两种模式的实现。理解并恰当运用这些模式能提升代码的可扩展性和可维护性。
62 1
|
2月前
|
设计模式 Java
Java设计模式-装饰器模式(10)
Java设计模式-装饰器模式(10)
|
5月前
|
设计模式 Java
Java设计模式:深入装饰器模式的三种写法(六)
Java设计模式:深入装饰器模式的三种写法(六)
|
5月前
|
设计模式 程序员
结构型设计模式之适配器模式
结构型设计模式之适配器模式
|
5月前
|
设计模式
结构型设计模式之装饰模式
结构型设计模式之装饰模式
|
5月前
|
设计模式 编解码 网络安全
结构型设计模式之代理模式
结构型设计模式之代理模式
|
5月前
|
设计模式 架构师 安全
设计模式第五讲-装饰器模式和代理模式详解
远程代理,这种方式通常是为了隐藏目标对象存在于不同地址空间的事实,方便客户端访问。例如,用户申请某些网盘空间时,会在用户的文件系统中建立一个虚拟的硬盘,用户访问虚拟硬盘时实际访问的是网盘空间。
260 0
|
8天前
|
设计模式 安全 Java
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式
|
2月前
|
设计模式 数据库连接 PHP
PHP中的设计模式:提升代码的可维护性与扩展性在软件开发过程中,设计模式是开发者们经常用到的工具之一。它们提供了经过验证的解决方案,可以帮助我们解决常见的软件设计问题。本文将介绍PHP中常用的设计模式,以及如何利用这些模式来提高代码的可维护性和扩展性。我们将从基础的设计模式入手,逐步深入到更复杂的应用场景。通过实际案例分析,读者可以更好地理解如何在PHP开发中应用这些设计模式,从而写出更加高效、灵活和易于维护的代码。
本文探讨了PHP中常用的设计模式及其在实际项目中的应用。内容涵盖设计模式的基本概念、分类和具体使用场景,重点介绍了单例模式、工厂模式和观察者模式等常见模式。通过具体的代码示例,展示了如何在PHP项目中有效利用设计模式来提升代码的可维护性和扩展性。文章还讨论了设计模式的选择原则和注意事项,帮助开发者在不同情境下做出最佳决策。