《大话设计模式》num06---装饰模式
时间:2019-10-17
本文章向大家介绍《大话设计模式》num06---装饰模式,主要包括《大话设计模式》num06---装饰模式使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
装饰模式
当系统需要新的功能的时候,一般都是向旧的类中添加新的代码。比如一个人这个类,需要新增穿衣的功能,那么就会在人这个类中去添加对应的穿衣方法代码,用来增强人这个类的行为功能。但是这样做,会因为新加入的字段、方法等逻辑代码,导致原有 人 这个类变得复杂,新加入的穿衣功能并非 人 这个类的核心功能,穿衣只是某种情况下的特定功能,会与类中人的核心功能【比如吃饭】代码糅杂在一起。
装饰模式,把要装饰的功能(穿衣)放在一个单独的类中,并让这个类包含他需要装饰的对象(人),当需要执行特定穿衣功能的时候,客户端灵活去装饰主类对象。这样可以使得主类(人)代码简洁,不会变的越来越复杂,使得主类 的核心功能 与 不断增加的 特定功能 分开,也能去重相关装饰逻辑,做到复用。
下面写一个例子:
创建人 类作为主类:
public class Person { //人的 核心功能 吃喝拉撒 public void eat() { System.out.println("人的核心功能:吃喝拉撒"); } //穿衣功能 新增 public void show() { System.out.println("====完成穿衣"); } }
创建装饰抽象类:
* @description :装饰抽象类 */ public abstract class Decorate extends Person { //Decorate extends Person //Person是被装饰者, Decorate是装饰者,两者有共同的父类,这里简化了用继承来表示这种关系。目的是表明二者为同一类型,二者本身行为属性没有任何逻辑上的继承关系 //被装饰对象 人 类 private Person person; //装饰操作方法,为了让子类调用,不能为private public void decorate(Person person) { this.person = person; } //装饰行为效果 @Override public void show() { if(person != null) { person.show(); } } }
创建三个装饰类,继承上面的装饰抽象类,来实现具体的装饰过程效果:
* @description :女仆装装饰类 */ public class Nvzhuang extends Decorate { @Override public void show() { System.out.println("穿女仆装"); super.show(); } } * @description :裤子装饰类 */ public class Kuzi extends Decorate { @Override public void show() { System.out.println("穿裤子"); super.show(); } } * @description :马甲装饰类 */ public class Majia extends Decorate { @Override public void show() { System.out.println("穿马甲"); super.show(); } }
测试主类:
*/ public class Main { public static void main(String[] args) { Person xiaomingPerson = new Person();//创建被装饰对象,小明 Nvzhuang nvzhuang = new Nvzhuang();//女装 装饰类 Majia majia = new Majia();//马甲装饰类 Kuzi kuzi = new Kuzi();//裤子装饰类 //如何装饰?随便自定义顺序 nvzhuang.decorate(xiaomingPerson);// 把下面定义的穿衣装饰顺序 套到 目标对象上 majia.decorate(nvzhuang);//先穿马甲,再穿女装 kuzi.decorate(majia); //先穿裤子,再穿马甲 kuzi.show(); } }
效果:
穿裤子
穿马甲
穿女仆装
====完成穿衣
原文地址:https://www.cnblogs.com/dxxdsw/p/11692246.html
- LCS 算法:Javascript 最长公共子序列
- 短网址(short URL)系统的原理及其实现
- 设计和实现一款轻量级的爬虫框架
- JavaScript实现模糊推荐的input框(类似搜索框)
- hadoop streaming编程小demo(python版)
- 一个scrapy框架的爬虫(爬取京东图书)
- mongodb生产环境(副本集模式)集群搭建配置
- ELK日志收集分析系统配置
- 【学术】如何在15分钟内建立一个深度学习模型?
- Elasticsearch(GEO)空间检索查询
- java spark-streaming接收TCP/Kafka数据
- hiveQL求差集
- hiveQL去重
- springboot高并发redis细粒度加锁(key粒度加锁)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Hibernate的入门(Hibernate的环境搭建、Hibernate的API)
- pytest 测试框架学习(9):pytest.main
- 深入了解ActiveMQ!
- 完美解决 python ImportError: Failed to import any qt binding
- 爬取娱乐圈排行榜数据
- 如何解决Linux系统下pyaudio安装缺少文件问题error: portaudio.h: 没有那个文件或目录
- pytest 测试框架学习(10):pytest.param
- pytest 测试框架学习(11):pytest.raises
- Hibernate第二天:Hibernate的一级缓存、其他的API
- pytest 测试框架学习(12):pytest.deprecated_call
- Pinstaller(Python打包为exe文件
- pytest 测试框架学习(14):pytest.warns
- ImportError: /lib64/libm.so.6: version `CXXAB_1.3.8.' not found (required by /usr/local/python37/lib
- pytest 测试框架学习(15):pytest.freeze_includes
- Linux: scp文件,目录上传下载标准版