结构型之【装饰器模式】

定义:

装饰器模式(Decorator Pattern) 也称为包装模式(Wrapper Pattern) 是指在不改变原有对象的基础之上,将功能附加到对象上,提供了比继承更有弹性的替代方案(扩展原有对象的功能),属于结构型模式。装饰器模式的核心是功能扩展,使用装饰器模式可以透明且动态地扩展类的功能

一、Person接口

public interface Person {
    void GetRole();
    void GetAge();
}

二、定义Father类并实现Person接口

public class Father implements Person  {

    @Override
    public void GetRole() {
        System.out.println("role : father");
    }
    @Override
    public void GetAge() {
        System.out.println("father age : 38 years");
    }
}

三、定义Mother类并实现Person接口

public class Mother implements Person {

    @Override
    public void GetRole() {
        System.out.println("role : Mother");
    }

    @Override
    public void GetAge() {
        System.out.println("Mother Age : 30 years");
    }

}

四、定义Son类并实现Person接口

public class Son  implements Person{
    @Override
    public void GetRole() {
        System.out.println("son Age : 10 years");
    }

    @Override
    public void GetAge() {
        System.out.println("role : son");
    }
}

五、定义PersonDecorator类并实现Person接口

public class PersonDecorator implements Person{
    private  Person person;

    public PersonDecorator(Person person) {
        this.person = person;
    }

    @Override
    public void GetAge() {
        person.GetAge();
    }

    @Override
    public void GetRole() {
        person.GetRole();
    }
}

六、定义PersonMaleDecorator类并继承PersonDecorator

public class PersonMaleDecorator extends PersonDecorator {
    public PersonMaleDecorator(Person person) {
        super(person);
    }

    @Override
    public void GetAge() {
        super.GetAge();
        this.SetAddFunction();
    }

    @Override
    public void GetRole() {
        super.GetRole();
    }

    // 附加方法
    private  void  SetAddFunction()
    {
        System.out.println("this is a addfunction");
    }
}

七、测试

public class Main {
    public static void main(String[] args) {

        Mother mother=new Mother();
        PersonMaleDecorator father=new PersonMaleDecorator(new Father());
        PersonMaleDecorator son=new PersonMaleDecorator(new Son());

        mother.GetRole();
        mother.GetAge();
        System.out.println("------------------------");

        father.GetRole();
        father.GetAge();
        System.out.println("------------------------");

        son.GetRole();
        son.GetAge();
        System.out.println("------------------------");
    }
}

结构型之【装饰器模式】

Original: https://www.cnblogs.com/sportsky/p/16588519.html
Author: SportSky
Title: 结构型之【装饰器模式】

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/610520/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 2021年想做的最后挣扎

    一年的时间转眼间就过完,感觉没变,又感觉跟一年前的今天变化还是蛮多的,树立个小目标争取年前完成把 读书一本书看一篇文章: 《百年孤独》:我总感觉虽然是只单身狗是孤单的,理解不了孤独…

    Linux 2023年6月14日
    097
  • 关于阿里云ECS Centos 5/6/7 Linux Glibc库严重安全漏洞修复方法

    本文来自转载http://www.shidehui.com/jingyan/about-ali-cloud-ecs-centos-567-linux-glibc-library-s…

    Linux 2023年6月13日
    0131
  • 命名空间、作用域、LEGB法则、垃圾回收机制

    一、命名空间、作用域、LEGB法则、 1.命名空间和作用域 :   命名&#x7A7…

    Linux 2023年6月8日
    089
  • GT/s和Gbps的关系

    GT/s 和 Gbps 数据传输表示通过数字接口传递的数据量。 当用较多的数据位对原始数据进行编码时,有效数据传输量低于实际传输的数据位数。例如:PCIe串行总线采用10位数据对8…

    Linux 2023年6月7日
    098
  • Redis 的 5 个常见使用场景

    在这篇文章中,我们将阐述 Redis 最常用的使用场景,以及那些影响我们选择的不同特性。 最常用的一种使用Redis的情景是会话缓存(session cache)。用Redis缓存…

    Linux 2023年5月28日
    0114
  • 关于博客园设置awescnb皮肤教程

    第一步:申请博客园 申请博客园,然后再申请js权限 第二步:设置博客园 页面定制勾选禁止模版使用css 页面定制css代码 .profile-menu{ display: none…

    Linux 2023年6月11日
    089
  • 新一代高性能USB转串口芯片CH342与CH343

    CH342与CH343是沁恒推出的第三代USB转串口产品,内部高度集成,外围精简,均提供VIO电源引脚,串口I/O支持独立供电。 CH342实现USB转两路高速异步串口,支持串口波…

    Linux 2023年6月7日
    0154
  • 设计模式——–代理模式

    代理模式:为其他对象提供一种代理以控制对这个对象的访问。 最简单的代理模式,分为三种角色: 抽象主题角色:代理类与被代理共同实现的接口,内部定义了最普通的业务类型。 具体主题角色:…

    Linux 2023年6月7日
    082
  • SlugRelatedField字段

    该字段用于外键字段该字段在序列化的时候多用于反向查询,在反序列化的时候用于接收关联表的唯一字段来生成该关联对象eg: 序列化 class PublishListSerializer…

    Linux 2023年6月14日
    0104
  • 在Linux下安装Redis

    1. 下载Redis的压缩包 [root@spirit-of-fire ~]# wget http://download.redis.io/releases/redis-5.0.5…

    Linux 2023年6月14日
    0101
  • [转帖]shell学习之shell执行方式及排错

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    Linux 2023年5月28日
    096
  • WPF 给 Pen 的 DashStyle 设置 0 0 的虚线数组将会让渲染线程消耗大量 CPU 资源

    给 WPF 的 Pen 的 DashStyle 属性设置 0 0 的虚线,在绘制几何图形时,绘制的几何图形的尺寸将关联渲染线程所使用的 CPU 资源。大约在周长大于 500 时,将…

    Linux 2023年6月6日
    063
  • Linux 配置Git

    前言:请各大网友尊重本人原创知识分享,谨记本人博客: 南国以南i 一、用git –version命令检查是否已经安装 二、下载git源码并解压 wget https:/…

    Linux 2023年6月14日
    096
  • 【6】2022年8月

    8月21日 OMG!!我真的是懒骨头!不到最后一刻丝毫不紧张!! 兄弟,八月底了阿!! 你为了明年的计划,要想同一时间内赚5万和成功上岸,这太不可思议了! 你压力好大的,别到最后放…

    Linux 2023年6月13日
    090
  • 最小二乘法

    背景:我们有一系列的点(x,y),如下图所示,实际上这就是一个y=10*x的一元一次曲线,再加上一个随机误差得到的数据。 我们想用一个线性方程来拟合它y=a*x+b为了达到最好的拟…

    Linux 2023年6月15日
    0126
  • 剑指offer计划25(模拟中等)—java

    1.1、题目1 剑指 Offer 29. 顺时针打印矩阵 1.2、解法 常规开头,先判断特殊情况,然后创建四个变量存放矩阵四边的长度限制。创建res数组存放结果。循坏开始,遍历完一…

    Linux 2023年6月11日
    098
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球