结构型之【装饰器模式】

定义:

装饰器模式(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)

大家都在看

  • Linux 下 SVN 的安装和配置

    SVN 是一个自由开源的版本管理系统,它可以按照时间的顺序去管理文件、目录以及对其进行的修改。于今,它被广泛的用于互联网公司的项目版本管理中 工作原理 它的工作原理如下图所示 它是…

    Linux 2023年6月13日
    092
  • 源码安装apache脚本部署

    源码安装apache脚本部署 [root@localhost ~]# ls anaconda-ks.cfg httpd.tar.xz [root@localhost ~]# tar…

    Linux 2023年6月6日
    0100
  • Python 多线程

    import threading import time def userTest(aa,bb): print(aa) time.sleep(3) print(bb) if __n…

    Linux 2023年6月6日
    074
  • linux编译安装nginx

    本文升级过程,适用于大部分nginx编译版本 常用编译选项说明nginx大部分常用模块,编译时./configure –help以–without开头的都默认安装。 –prefix…

    Linux 2023年5月27日
    080
  • 2020年12月-第02阶段-前端基础-CSS Day05

    CSS Day05 学成在线页面制作 理解 能够说写单页面我们基本的流程能说出常见的css初始化语句能说出我们CSS属性书写顺序 应用 能利用ps切图能引入外部样式表能把psd文件…

    Linux 2023年6月8日
    0107
  • mit 6.824 lab2A ,raft 领导人选举实现(lab2D中有关于此处大量代码修改,找出了很多错误)

    lab2 说明: https://pdos.csail.mit.edu/6.824/labs/lab-raft.html 参考博客: https://zhuanlan.zhihu….

    Linux 2023年6月7日
    0124
  • NO.4 计算机组成原理-笔记

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

    Linux 2023年6月7日
    086
  • linux mv 命令中断的解决办法

    背景:使用mv对服务器文件进行迁移的过程中,因为网络中断,所以迁移到一半被停止了。 现状:有一部分文件没有迁移完,但是文件夹已经存在了,重新mv提示文件夹已经存在,切已经有文件,所…

    Linux 2023年6月14日
    076
  • 如何入行软件开发——常见问题及岗位分工

    —— 你以为我每天上班就是为了几个臭钱么!? —— 是的,你说对了…… IT是一个有些让业外同行羡慕嫉妒恨的行业,统计数据来说平均薪资应当是仅次于金融行业的…

    Linux 2023年6月13日
    088
  • LeetCode 84.柱状图中最大的矩形 | 单调栈的使用 | 解题思路及算法 Java

    给定(n)个非负整数,用来表示柱状图中每个柱子的高度。每个柱子相邻且宽度为1。求这个柱状图中能容纳的最大矩形的面积。 对于一个柱状图中的最大矩形,我们可以观察出如下性质: 根据上面…

    Linux 2023年6月13日
    0106
  • nand

    nand flash裸机编程第001节_NAND_FLASH操作原理第002节_NandFlash时序及初始化第003节_NandFlash的芯片id读取第004节_NandFla…

    Linux 2023年6月13日
    069
  • APACHE快速安装流程梳理

    快速安装开始: 【环境配置1】 yum -y install gcc gcc-c++ wget 保留操作(可跳过): yum -y removeapr-util-devel apr…

    Linux 2023年6月6日
    086
  • Linux与Windows文件同步

    本次采用的同步方式是rsync,Rsync是一款免费且强大的同步软件,可以镜像保存整个目录树和文件系统,同时保持原来文件的权限、时间、软硬链接。第一次同步时会复制全部内容,下次只传…

    Linux 2023年6月8日
    0123
  • 并查集详解 图解引入到实现| Disjoint Sets details, intro to implementation with figures.

    Introduction of Disjoint Sets It’s easy to tell whether someone you know is your rel…

    Linux 2023年6月13日
    0103
  • Github访问加速

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

    Linux 2023年6月8日
    078
  • 使用Supervisor监控mysql

    监控文件配置: [program:mysql] ; 管理的子程序名字,要和项目有关联,不能乱写command=/usr/local/mysql/bin/mysqld_safe &#…

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