设计模式之装饰器模式

举报
chenyu 发表于 2021/07/27 01:11:41 2021/07/27
【摘要】 1 装饰器模式 装饰器模式允许向一个现有的对象添加新的功能,同时又不改变其结构,它是作为现有类的一个包装。       2 类图实现 这里最关键的是我们装饰器类(抽象类)既实现了原始功能接口(Shape接口)又和原始接口是关联关系(Shape接口作为这个抽象装饰类的成员变量)     &nbsp...

1 装饰器模式

装饰器模式允许向一个现有的对象添加新的功能,同时又不改变其结构,它是作为现有类的一个包装。

 

 

 

2 类图实现

这里最关键的是我们装饰器类(抽象类)既实现了原始功能接口(Shape接口)又和原始接口是关联关系(Shape接口作为这个抽象装饰类的成员变量)

 

 

 

3 代码实现


  
  1. public interface Shape {
  2. void draw();
  3. }

  
  1. public class Rectangle implements Shape {
  2. @Override
  3. public void draw() {
  4. System.out.println("Shape: Rectangle");
  5. }
  6. }

  
  1. public class Circle implements Shape {
  2. @Override
  3. public void draw() {
  4. System.out.println("Shape: Circle");
  5. }
  6. }

  
  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. 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 class DecoratorPatternDemo {
  2. public static void main(String[] args) {
  3. Shape circle = new Circle();
  4. ShapeDecorator redCircle = new RedShapeDecorator(new Circle());
  5. ShapeDecorator redRectangle = new RedShapeDecorator(new Rectangle());
  6. //Shape redCircle = new RedShapeDecorator(new Circle());
  7. //Shape redRectangle = new RedShapeDecorator(new Rectangle());
  8. System.out.println("Circle with normal border");
  9. circle.draw();
  10. System.out.println("\nCircle of red border");
  11. redCircle.draw();
  12. System.out.println("\nRectangle of red border");
  13. redRectangle.draw();
  14. }
  15. }

 

 

 

4 运行结果


  
  1. Circle with normal border
  2. Shape: Circle
  3. Circle of red border
  4. Shape: Circle
  5. Border Color: Red
  6. Rectangle of red border
  7. Shape: Rectangle
  8. Border Color: Red

 

 

 

5 优点

1)继承的缺点:如果我们用继承的方式增加新功能,继承为类引入静态特征,并且随着扩展功能的增多,子类会很膨胀

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

部分参考:https://www.runoob.com/design-pattern/decorator-pattern.html

文章来源: chenyu.blog.csdn.net,作者:chen.yu,版权归原作者所有,如需转载,请联系作者。

原文链接:chenyu.blog.csdn.net/article/details/103286559

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。