设计模式-装饰者模式

装饰者模式

结合看书和看菜鸟来说真的是一种比较好的学习方法,刚开始仅仅盯着书来学习,看的自己晕晕乎乎的。但是看完菜鸟教程的讲解以及例子之后,突然从一脸懵逼变得清醒过来。下面进行简单的整理。

简单描述:动态地将责任附加到对象上,若要扩展功能,装饰者模式提供了比继承更具有弹性的替代方案(可代替继承)

所属类型:结构性模式

适用情况:再不想增加很多子类的情况下扩展类

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

实现原则:将具体功能职责划分,同时继承装饰者模式。

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

这里利用菜鸟教程上的Shape的例子比较好理解。首先定义一个Shape接口类,让各个形状都来实现这个接口。代码如下所示:

package decorator;
​
public interface Shape {
    public void draw();
}
package decorator;
​
public class Circle implements Shape {
    @Override
    public void draw() {
        System.out.println("this is circle");
    }
}
复制代码
package decorator;
​
public class Rectangle implements Shape {
​
    @Override
    public void draw() {
        System.out.println("this is rectangle");
    }
}
复制代码

接着就来创建装饰者类,我们通过装饰者来在已经创建好的圆和方形的基础上对其进行装饰。具体代码如下:

复制代码
package decorator;
​
public abstract class ShapeDecorator implements Shape {
​
    protected Shape decorateShape;
​
    public ShapeDecorator(Shape decorateShape) {
        this.decorateShape = decorateShape;
    }
​
    public void draw() {
        decorateShape.draw();
    }
​
}
复制代码

装饰者对象已经创建好了,接着我们要进行细致的实现,也就是我们要在原先对象的基础上干什么,所以接下来创建一个RedShapeDecorator类来为我们之前创建的形状添加Red颜色。实现如下:

复制代码
package decorator;
​
public class RedShapeDecorator extends ShapeDecorator {
    public RedShapeDecorator(Shape decorateShape) {
        super(decorateShape);
    }
​
    @Override
    public void draw() {
        decorateShape.draw();
        setBorder();
    }
​
    private void setBorder() {
        System.out.println("Border : Red");
    }
}
复制代码

可以看到在实例化时调用了父类的构造方法,并且调用了父类的draw方法,随后又调用setBorder来为形状涂色。最后看一下效果如何:

复制代码
package decorator;
​
public class DecoratorDemo {
    public static void main(String[] args) {
        Shape circle = new Circle();
        circle.draw();
​
        System.out.println("------------------");
        ShapeDecorator redCircle = new RedShapeDecorator(new Circle());
        redCircle.draw();
​
        System.out.println("------------------");
        ShapeDecorator redRectangle = new RedShapeDecorator(new Rectangle());
        redRectangle.draw();
    }
}
复制代码

查看一下运行结果:

this is circle
------------------
this is circle
Border : Red
------------------
this is rectangle
Border : Red

从结果中可以看到,我们为形状添加的颜色在不新建一个红圈类的基础上实现了,也就是给这个圈装饰上了。自我理解装饰者模式是一个层层嵌套的方式来实现对对象的装饰效果的。

最后总结一下装饰者模式的相关要点。

Tips:

  • 继承属于扩展形式的一种,但不是达到弹性设计的最佳方案

  • 在设计中,应尽量允许行为可以被扩展,而无需修改现有的代码

  • 装饰者模式意味着用一个或多个装饰者类来包装具体的类

  • 装饰者一般对组件的客户是透明的,除非客户程序依赖于组件的具体类型

  • 装饰者会导致设计中出现许多小对象,如果过度使用,反而会使程序十分复杂

posted @   忠肝义胆-多隆  阅读(19)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
点击右上角即可分享
微信分享提示