当前位置: 首页 > article >正文

设计模式-结构型模式之装饰者设计模式

文章目录

    • 六、装饰者模式

六、装饰者模式

装饰者模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。它是作为现有的类的一个包装
装饰类和被装饰类可以独立发展,不会相互耦合,装饰者模式是继承的一个替代模式,装饰者模式可以动态扩展一个实现类的功能。

举个例子:还是绘画不同的形状的例子,加入系统中有画各种形状的功能,但随着功能后期的演化,需要画出带有边框的各种形状,那么此时就可以采用装饰者设计模式来做增强。

下面使用程序演示下上面的例子:

  1. 定义形状接口
public interface Shape {
   void draw();
}
  1. 定义圆形的实现
public class Circle implements Shape {
 
   @Override
   public void draw() {
      System.out.println("开始画圆形!");
   }
}
  1. 定义矩形的实现
public class Rectangle implements Shape {
 
   @Override
   public void draw() {
      System.out.println("开始画矩形!");
   }
}
  1. 定义装饰器的抽象模板
public abstract class ShapeDecorator implements Shape {
   protected Shape decoratedShape;
 
   public ShapeDecorator(Shape decoratedShape){
      this.decoratedShape = decoratedShape;
   }
 
   @Override
   public void draw(){
      decoratedShape.draw();
   }  
}
  1. 定义具体的边框装饰器
public class BorderShapeDecorator extends ShapeDecorator {
 
   public BorderShapeDecorator(Shape decoratedShape) {
      super(decoratedShape);     
   }
 
   @Override
   public void draw() {
      decoratedShape.draw();         
      setRedBorder(decoratedShape);
   }
 
   private void setRedBorder(Shape decoratedShape){
      System.out.println("画边框!");
   }
}
  1. 演示
public class demo {
   public static void main(String[] args) {
      Shape circle = new Circle();
      circle.draw();

      Shape shape = new BorderShapeDecorator(new Circle());
      shape.draw();

      Shape shape1 = new BorderShapeDecorator(new Rectangle());
      shape1.draw();
   }
}

在这里插入图片描述

上面可以看出再不改变原先类的基础上,做了画边框的效果,对原有做增强,使用装饰者设计模式,可以大大提高系统的可扩展性。


http://www.kler.cn/news/155513.html

相关文章:

  • vscode配置代码片段
  • 吴恩达《机器学习》11-1-11-2:首先要做什么、误差分析
  • Ubuntu Linux玩童年小霸王插卡游戏
  • [MySQL]日期和时间函数
  • [Rust] 可迭代类型, 迭代器, 如何正确的创建自定义可迭代类型
  • 安防视频监控/磁盘阵列/集中云存储平台EasyCVR设备录像保活不生效原因是什么?该如何解决?
  • jdk1.8 hashmap源码阅读
  • 轻易云AI:引领企业数智化转型提升企业AI效率
  • python查询、处理、批量存入数据
  • navicat某些表为什么不按主键排序
  • linux设置主机名
  • Java研学-配置文件
  • 算法设计与实现--贪心篇
  • Spring MVC学习随笔-控制器(Controller)开发详解:控制器跳转与作用域(一)
  • “B2B+OMS方案”,赋能家电巨头构建BC订单一体化能力,促进业务增长|徐礼昭
  • 决策 Diffie-Hellman DDH 和 CDH
  • 在Springboot中操作Redis——五大数据类型
  • Python标准库:copy模块【侯小啾python领航班系列(十五)】
  • 【Java进阶】-- 设计模式
  • 关于数据劫持原理(vue2和vue3)
  • IDEA2022 Git 回滚及回滚内容恢复
  • 关于我离破500粉丝感受
  • PHP:js中怎么使用PHP变量,php变量为数组时的处理
  • 分享84个节日PPT,总有一款适合您
  • 高光谱遥感影像分类项目开源
  • 前端请求patch接口,只传入已修改字段值的字段
  • Matlab下载许可证文件 教程(在账号有许可证的前提下)
  • C语言速通笔记(1-40)
  • JavaWeb(三)
  • 弦理论:技术视角下的宇宙密码