开发者社区> 兴化> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

设计模式-2-装饰器模式

简介: 装饰器模式(Decorator Pattern)就是在不改变原始对象本质的前提下,对现有类进行包装,从而提供出额外的功能。
+关注继续查看

装饰器模式(Decorator Pattern)就是在不改变原始对象本质的前提下,对现有类进行包装,从而提供出额外的功能。

    不改变现有类而提供额外的功能,听起来好像是说类继承,没错,装饰器模式就是继承的另一种代替方案,使用继承方式为类引入静态特征,并且随着扩展功能的增多,子类会很膨胀,所以装饰器模式比起类继承实现更加的灵活。

    装饰器模式的核心就是功能扩展。设计模式类型属于结构型模式。就是是作为现有的类的一个包装。

我们用代码实现一下:

目的:

       给一个图形附上一些色彩,图形依旧是图形(原始类不变),但是通过装饰类,我们给各个图形附上色彩。

一、原始现有类

1.建一个接口

package com.xing.design.decorator;
/**
 * 画
 * @author xing
 */
public interface Shape {
void draw();
}

2.两个图形实现类

package com.xing.design.decorator;
public class Rectangle implements Shape{
@Override
public void draw() {
    System.out.println("Shape的实现类 Rectangle->矩形");
  }
}
package com.xing.design.decorator;
public class Circle implements Shape{
@Override
public void draw() {
    System.out.println("Shape的实现类Circle->圆形");
  }
}

3.现在就是现有类,画出两个图形。

二、建立装饰器

1.搞个抽象装饰类

package com.xing.design.decorator;
/**
 * 装饰类
 * @author xing
 */
public abstract class ShapeDecorator implements Shape {
// 注入原始类
protected Shape decoratedShape;
public ShapeDecorator(Shape decoratedShape){
this.decoratedShape = decoratedShape;
  }
// 增强画图形 覆盖父类
public void draw(){
    decoratedShape.draw();
  }
}

2.继承抽象类

package com.xing.design.decorator;
/**
 * 装饰类实现
 * @author xing
 */
public class RedShapeDecorator extends ShapeDecorator {
public RedShapeDecorator(Shape decoratedShape) {
super(decoratedShape);
  }
@Override
public void draw() {
// 原有的话图形方法
    decoratedShape.draw();
// 增强的方法
    setRedBorder(decoratedShape);
  }
/**
   * 画红色的
   * @param decoratedShape
   */
private void setRedBorder(Shape decoratedShape){
    System.out.println("以上图形是红色的: Red");
  }
}

3.调用测试一下

package com.xing.design.decorator;
public class DecoratorPattern {
public static void main(String[] args) {
// 画个图形
    Shape circle = new Circle();
    System.out.println("原始类画图:");
    circle.draw();
    Rectangle rectangle = new Rectangle();
    System.out.println("原始类画图:");
    rectangle.draw();
// 装饰类1
    ShapeDecorator redCircle = new RedShapeDecorator(new Circle());
// 装饰类2
    ShapeDecorator redRectangle = new RedShapeDecorator(new Rectangle());
    System.out.println("\n装饰类1的画图:");
    redCircle.draw();
    System.out.println("\n装饰类2的画图:");
    redRectangle.draw();
  }
}


装饰器模式的实现原理:

       让装饰器实现与被装饰类相同的接口,使得装饰器与被扩展类类型一致,并在构造函数中传入该接口对象,然后在实现这个接口的被包装类对象的现有功能上添加新功能。由于装饰器与被包装类属于同一类型(实现自同一接口),且构造函数的参数为其实现接口类,因此装饰器模式具备嵌套扩展功能,这样就能使用装饰器模式一层一层地对底层被包装类进行功能扩展了。


总结:

       我们在没有改变图形类的前提下,添加了图形是红色的说明。用装饰类来包装原有的图形类,并在保持类方法签名完整性的前提下,提供了额外的功能。


END

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
装饰者设计模式
装饰者设计模式
7 0
【设计模式】装饰器
【设计模式】装饰器
28 0
设计模式-装饰器模式
装饰器模式(Decorator),动态地给一个对象添加一些额外的职责,就增加功能来说,装饰器模式比生成子类更为灵活;它允许向一个现有的对象添加新的功能,同时又不改变其结构。装饰器模式属于结构型模式。
47 0
入门设计模式之装饰
版权声明:本文为博主原创文章,未经博主允许不得转载。博客源地址为zhixiang.org.cn https://blog.csdn.net/myFirstCN/article/details/80871450 ...
770 0
设计模式:装饰者模式
  设计模式系列目录   装饰者模式么,在生活中我们是经常接触的。比如像我们这么快节奏的生活,好多都是早上去买煎饼。一般我们会这么说:“来一个粗粮煎饼,加两个鸡蛋,加一根肠” 或者:“来个山东煎饼,只加土豆丝”等等。
1102 0
设计模式之六(装饰模式)
原文:设计模式之六(装饰模式) 前言 装饰模式:动态の给一个对象添加有些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活。 装饰模式结构图   Component是定义一个对象接口,可以给这些对象动态添加职责 ConcreteComponent是定义了一个具体的对象,也可以给这个对象...
836 0
设计模式之六(装饰模式)
前言 装饰模式:动态の给一个对象添加有些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活。 装饰模式结构图   Component是定义一个对象接口,可以给这些对象动态添加职责 ConcreteComponent是定义了一个具体的对象,也可以给这个对象添加一些职责 Decorato...
558 0
设计模式系列-装饰模式
一、上篇回顾       通过上篇的简单描述,我们知道了桥接模式主要是为了解决,一个对象的多个维度的变化因素的变化太快,难以控制的问题,我们通过将每个维度 的变化因素进行抽象, 然后我们的对象只要依赖于抽象即可,具体的实现调用我们不关心,通过对象组合的方式,我们就能组合出我们想要的对象。
688 0
+关注
兴化
码中自由一片天地。。。
文章
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载