Design-装饰者模式

装饰者模式

  • 介绍
  • 实现
  • 代码

介绍

装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。

这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。

我们通过下面的实例来演示装饰器模式的用法。其中,我们将把一个形状装饰上不同的颜色,同时又不改变形状类。
意图:动态地给一个对象添加一些额外的职责。就增加功能来说,装饰器模式相比生成子类更为灵活。

主要解决:一般的,我们为了扩展一个类经常使用继承方式实现,由于继承为类引入静态特征,并且随着扩展功能的增多,子类会很膨胀。

何时使用:在不想增加很多子类的情况下扩展类。

如何解决:将具体功能职责划分,同时继承装饰者模式。

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

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

缺点:多层装饰比较复杂。

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

注意事项:可代替继承。

实现

我们将创建一个 Shape 接口和实现了 Shape 接口的实体类。然后我们创建一个实现了 Shape 接口的抽象装饰类 ShapeDecorator,并把 Shape 对象作为它的实例变量。

RedShapeDecorator 是实现了 ShapeDecorator 的实体类。

DecoratorPatternDemo,我们的演示类使用 RedShapeDecorator 来装饰 Shape 对象。

在这里插入图片描述

代码

Shape接口

public interface Shape {
    public void draw();
}

circle实现接口

public class Circle implements Shape{

    @Override
    public void draw() {
        System.out.println("这是圆");
    }
}

rectangle实现接口

public class Rectangle implements Shape{

    @Override
    public void draw() {
        System.out.println("这是矩形");
    }
}

创建实现了 Shape 接口的抽象装饰类

public abstract class ShapeDecorator implements Shape{
    protected Shape shape;
    public ShapeDecorator(Shape shape){
        this.shape = shape;
    }

    @Override
    public void draw(){
        this.shape.draw();
    }
}

创建扩展了 ShapeDecorator 类的实体装饰类

public class RedShapeDecorator extends ShapeDecorator{

    public RedShapeDecorator(Shape shape) {
        super(shape);
    }

    @Override
    public void draw() {
        shape.draw();
        setRedBorder();
    }
    private void setRedBorder() {
        System.out.println("Border Color: Red");
    }
}

使用 RedShapeDecorator 来装饰 Shape 对象

public class DecoratorPatternDemo {
    public static void main(String[] args) {
        /**没有装饰的 **/
        Circle circle = new Circle();
        circle.draw();
        ShapeDecorator shapeDecorator = new RedShapeDecorator(new Circle());
        shapeDecorator.draw();
        ShapeDecorator shapeDecorator1 = new RedShapeDecorator(new Rectangle());
        shapeDecorator1.draw();
    }
}

热门文章

暂无图片
编程学习 ·

latex在线编辑公式(可快速查看latex码)

在发表论文时,常常会用到latex进行排版,但是会遇到mathtype转换为latex的问题,这里提供了一个latex在线编辑公式的网址,效果如下: http://latex.codecogs.com/eqneditor/editor.php
暂无图片
编程学习 ·

CSS滚动指示器

一、CSS滚动指示器 滚动指示器指的是页面的顶端会有一个进度条,指示滚动的进度。效果如下GIF所示(点击播放):CSS滚动指示器指的是不借助JavaScript,纯CSS实现滚动进度效果。 二、传统的实现方法 传统CSS实现方法由一个名叫 Mike的人首先提出,时间应该是16年,这个CodePen…
暂无图片
编程学习 ·

MapReduce原理及编程

文章目录一.关于MapReduce(一)什么是MapReduce?(二) MapReduce的设计思想(三) MapReduce特点(四)MapReduce实现WordCount(五)MapReduce执行过程(六)Key&Value类型二.MapReduce编程模型(一)InputFormat接口(二)Mapper类(三)Combiner类(四)Partitioner类(五)Reducer类(六)Ou…
暂无图片
编程学习 ·

基于SSM的在线考试系统的毕业设计

一、启动说明项目为maven管理,最近集成了redis,所以在运行项目是先要下载redis并启动客户端,方可正常运行项目,除了基本的maven,mysql外,只需要下载redis,无需其他配置,这里就不做过多说明。 二、相关技术说明集成redis来保存用户登录信息,添加过滤器重置用户登录有效…
暂无图片
编程学习 ·

分享 github 上JavaArticle 知识库

我喜欢那些闪光的东西,比如冬日的雪花,天上的星星,还有你发光的眼睛。 以前都是被别人授之以鱼,尝到了鱼肉的鲜美,我学习了捕鱼之术,以后希望不仅能授之以鱼,同时也能授之以渔。 面试学会龙叔这套面试秘诀,一套大招带走面试官 当你面试“自我介绍”还在我是XXX时,看到…
暂无图片
编程学习 ·

Springboot之PostMapping无法获取数据

在使用SpringBoot的PostMapping注解的时候,发现无法获取数据(get方法可行),经过一番查证,发现需要添加新的注解,举例如下://接受单个参数,使用RequestParam,并且添加上name属性,保证前后端的参数名称一致@PostMapping(value = "/users")public RestfulResp…
暂无图片
编程学习 ·

火狐浏览器网页不显示文字内容

网页的内容是个表格。表头只显示了 一部分内容。问题页面如下:但是在谷歌浏览器里显示正常。然后发现火狐里面多个标签他只显示一行,后面的都消失了。改好后效果如下:
暂无图片
编程学习 ·

flutter textfield设置高度后内容无法居中

Container(height: 50,width: MediaQuery.of(context).size.width * 2 / 3,alignment: Alignment.center,child: TextField(autofocus: true,decoration: InputDecoration(//这行代码是关键,设置这个之后,居中contentPadding: EdgeInsets.all(2),hintText: 请输入手机号,pref…
暂无图片
编程学习 ·

python 实现螺旋矩阵

创建一个大小为m * n的矩阵, 并以螺旋方式遍历它。 在遍历时,我们跟踪变量“ val”以填充下一个值, 我们将“ val”一个接一个地递增,并将其值放入矩阵中。 以下是简单实现: def spiral_matrix(m,n)::param x: colunm index:param y: row indexa = [[0 for _ in range(m)]…
暂无图片
编程学习 ·

靶机实战(DC-4)

DC-4实验环实验过程信息收集主机发现端口扫描服务发现网站指纹漏洞发现漏洞利用提权总结 实验环 靶机:DC-4 测试机:kali(IP:192.168.186.128),win10 实验过程 信息收集 主机发现 netdiscover -I eth0 -r 192.168.186.0/24 nmap -sn 192.168.186.0/24 arp-scan -l ,arp-sc…
暂无图片
编程学习 ·

MySQL配置文件

MySQL配置文件 1.配置环境变量 新建MYSQL_HOME变量,变量值是包的路径。 2.然后再path中添加:%MYSQL_HOME%\bin 3.执行mysqld install命令当出现Service successfully installed时表示mysql服务安装完成 4.MySQL初始化 :输入: mysqld --initialize --console 执行完成后,会…
暂无图片
编程学习 ·

vue.js 生命周期(五)

每个vue 实例在被创建时都要经过一系列的初始化过程,例如设置数据监听,编译模板,将实例挂载到DOM并在数据变换时自动更新DOM邓。同时在这过程中会运行一些叫生命周期钩子的函数。 这些函数在vue 实例中 以 属性 : 函数的形式定义。 常用函数: //在实例初始化之后,数据观测…
暂无图片
编程学习 ·

小样本如何选择学习方法

小样本该如何学习: https://zhuanlan.zhihu.com/p/152122909 小样本学习专栏:https://zhuanlan.zhihu.com/c_1258398000180768768 若喜欢,请关注知乎专栏账号,后面持续更新小样本学习相关内容。
暂无图片
编程学习 ·

Centos7 配置FTP服务器

1.实验描述 注: vsftpd是一个较为安全的FTP服务器软件,本次使用vsftpd配置ftp服务器。 本次实验适用于新手入门学习 ①实验内容 1)开放实体用户登录 使用者登陆FTP的时候显示欢迎消息;系统帐号不允许登陆;允许实体用户进行上传、下载、建立目录及修改文件;设置用户新建…
暂无图片
编程学习 ·

奥运五环的绘制

#奥运五环的绘制 import turtle turtle.width(10) turtle.color(“blue”) turtle.circle(50) turtle.penup() turtle.goto(120,0) turtle.pendown() turtle.color(“black”) turtle.circle(50) turtle.penup() turtle.goto(240,0) turtle.pendown() turtle.color(“red”) tu…
暂无图片
编程学习 ·

手把手教你理解Volatile关键字

volatile关键字volatile 关键字是java提供的一种轻量级同步机制。他能够保证可见性和有序性,但是不能保证原子性。volatile可见性可见性表示被这个关键字所修饰的实例,在被修改后,其他的线程均可见。class MyData { // 如果没有volatile关键字的话,那我们在修改number的…
暂无图片
编程学习 ·

2.2.1String字符串

字符串比较equals():s1.equals(s2); equalsIgnoreCase():忽略大小写比较。去首尾空白字符 trim():" \tHello\r\n ".trim(); // "Hello" 替换子串根据字符或字符串替换:String s = "hello"; s.replace(l, w); // "hewwo",所有字符l…
暂无图片
编程学习 ·

虚拟养老院,新型养老模式,究竟有什么作用呢?-新导智能

提到“虚拟养老院”很多人是不是榜首想到的是好像黑客帝国相同的“虚拟现实”,难道虚拟养老院是把老人冷冻催眠,然后让他们在-个虚拟的精力世界里边实现养老?其实,虚拟养老院没有这么夸大,它只是基于“居家养老”理念提出的一种利用现代化通讯和服务体系建立的养老模式。在…