设计模式03-装饰者设计模式
- 设计模式03-装饰者设计模式
- 第5个设计原则(开放-关闭原则)
- 定义
- 特征
- 缺点->可以看java.io类
- 案例分析
- 建立超类英雄
- 建立具体子类
- 提莫队长
- 蛮王
- 建立装饰者类
- 建立具体装饰者
- 技能Q
- 技能R
- 使用
- 结果
- UML
设计模式03-装饰者设计模式
主要来源Head First设计模式(书)
第5个设计原则(开放-关闭原则)
类应该对扩展开放,对修改关闭。
第1.2.3设计原则(GitHub地址)
第4个设计模式(GitHub地址)
我们的目标时允许类容易扩展,在不修改现有代码的情况下,就可搭配新的行为。如果实现这样的目标有什么好处呢?这样的设计具有弹性可以应对改变,可以接受新的功能来应对改变的需求。
定义
动态地将责任附加到对象上。若要扩展功能,装饰者提供了比继承更有弹性的替代方案。
特征
- 装饰者和被装饰者有相同的超类型
- 你可以用一个或多个装饰者包装一个对象
- 既然装饰者和被装饰者有相同的超类型,所以在任何需要原始对象(被包装的)场合,可以用装饰过的对象替代它。
- 装饰者可以在所委托被装饰者的行为之前与/或之后,加上自己的行为,以达到特定的目的。
- 对象可以在任何时候被装饰。所以可以在运行时动态的、不限量的用你喜欢的装饰者来装饰对象
缺点->可以看java.io类
造成设计中有大量的小类,从而导致理解不太容易。
案例分析
英雄联盟
建立超类英雄
abstract class 英雄 {protected var mName = "未知英雄"fun getName(): String {return mName}/*** 英雄花费价格*/abstract fun cost(): Int
}
建立具体子类
提莫队长
class 提莫队长 : 英雄() {init {mName = "提莫队长"}override fun cost(): Int {Log.d("123===", "买提莫队长花费100")return 100}
}
蛮王
class 蛮王 : 英雄() {init {mName = "蛮王"}override fun cost(): Int {Log.d("123===", "买蛮王花费200")return 200}
}
建立装饰者类
abstract class 技能(val 子英雄: 英雄) : 英雄() {init {子英雄.getName()}abstract fun 学习技能(): String
}
建立具体装饰者
技能Q
class 技能Q(子英雄: 英雄) : 技能(子英雄) {init {mName = 子英雄.getName() + ",学习技能Q"}override fun 学习技能(): String {return "学习技能Q"}override fun cost(): Int {val cost = 子英雄.cost() + 1Log.d("123===", "学习Q技能花费1")return cost}
}
技能R
class 技能R(子英雄: 英雄) : 技能(子英雄) {init {mName = 子英雄.getName() + ",学习技能R"}override fun 学习技能(): String {return "学习技能R"}override fun cost(): Int {val cost = 子英雄.cost() + 2Log.d("123===", "学习R技能花费2")return cost}
}
使用
var a: 英雄 = 提莫队长()a = 技能Q(a)a = 技能R(a)Log.d("123===", "流程:${a.getName()}")Log.d("123===", "一共花费了${a.cost()}")
结果
流程:提莫队长,学习技能Q,学习技能R买提莫队长花费100学习Q技能花费1学习R技能花费2一共花费了103
UML
uml下载地址
设计模式03-装饰者设计模式相关推荐
- 设计模式03 - 装饰者模式
引入: 曾今以为继承能解决一切问题.在程序运行时发现,扩展的威力远大于编译时扩展的威力. 装饰者模式: 好处: 一旦知道装饰的技巧,你将能给你的(或别人的)对象一个新的责任,而不需要对底层class的 ...
- 03 装饰着设计模式
装饰者设计模式的原理 1. 类支持扩展,不支持修改.避免类爆炸的现象.(核心) 2. 装饰者模式:动态的将新功能附加到对象上,在对新功能扩展方面比继承更有弹性. 3.装饰者模式可以理解为打包快递 1) ...
- java培训 | Java设计模式之装饰者设计模式
星巴克咖啡订单项目 星巴克咖啡订单项目(咖啡馆): 1) 咖啡种类/单品咖啡:Espresso(意大利浓咖啡).ShortBlack.LongBlack(美式咖啡).Decaf(无因咖啡) 2) 调料 ...
- 结构设计模式 - 装饰器设计模式
结构设计模式 - 装饰设计模式 装饰器设计模式用于在运行时修改对象的功能.同时,同一类的其他实例不会受此影响,因此单个对象将获得已修改的行为.装饰器设计模式是结构设计模式之一(如Adapter Pat ...
- 初学Java常用设计模式之——装饰器模式
声明:转载请附上原文链接 提示:标题序号从8开始,是照应不同设计模式笔记发布的顺序而定的,比如,上一篇文章 初学Java常用设计模式之--桥接模式和组合模式 序号从7开始. 8. 装饰器设计模式(重点 ...
- 装饰者设计模式(结构型设计模式)
一.装饰者设计模式简介 装饰器设计模式(Decorator Pattern) 也叫包装设计模式,属于结构型模式,它是作为现有的类的⼀个包装,允许向⼀个现有的对象添加新的功能, 同时⼜不改变其结构给对象 ...
- 《Head First设计模式》 读书笔记03 装饰对象
<Head First设计模式>读书笔记03 装饰对象 问题引入 咖啡店的类设计: 一个饮料基类,各种饮料类继承这个基类,并且计算各自的价钱. 饮料中需要加入各种调料,考虑在基类中加入一些 ...
- 装饰者模式 php,PHP设计模式之装饰器模式
装饰器设计模式 什么是装饰器模式 装饰器模式就是对一个已有的结构增加装饰.装饰模式是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能.它是通过创建一个包装对象,也就是装饰来包裹真实的对象 ...
- Java设计模式(装饰者模式-组合模式-外观模式-享元模式)
Java设计模式Ⅳ 1.装饰者模式 1.1 装饰者模式概述 1.2 代码理解 2.组合模式 2.1 组合模式概述 2.2 代码理解 3.外观模式 3.1 外观模式概述 3.2 代码理解 4.享元模式 ...
- 前端也要学系列:设计模式之装饰者模式
什么是装饰者模式 今天我们来讲另外一个非常实用的设计模式:装饰者模式.这个名字听上去有些莫名其妙,不着急,我们先来记住它的一个别名:包装器模式. 我们记着这两个名字来开始今天的文章. 首先还是上< ...
最新文章
- Python 函数初识 (1)
- C++ Exercises(十八)
- java 静态分派_Java中的静态分派与动态分派
- Playfair加密算法(C 实现)
- 4-3利用神经网络解决分类和回归问题(1)
- C#中几种代码复用的方式
- 一步一步写算法(之 A*算法)
- android屏幕共享实现方式,基于WebRtc在Android端实现屏幕共享
- Deep Learning-Deep feedforward network
- 软件测试工具Winrunner TSL命令简介
- 微信小程序实现仿美团外卖饿了么左右联动页面
- Python数组索引
- 项目管理知识体系系指南学习总结(一)
- 笔记 How Powerful are Spectral Graph Neural Networks
- arch(linux)挂接小鹤音形输入法
- k-means用于图像的颜色聚类
- 为什么成年人都不学习了
- 一代宗师威廉·欧奈尔的选股法则详解
- 程序员的中年危机好可怕
- 对市场周期常存敬畏之心
热门文章
- 网络设备中的日志分析
- 获取文件编码格式 java_java实现获取文本文件的字符编码
- CoinCola可盈可乐区块链行业周报第十二期(1.16-1.31)
- 支付宝:直播上演“就业风云”
- 联想R7000 2020双系统+无人机仿真环境配置
- Python视频教程及最佳学习路线图
- web 页面静态化设计
- 版本更新android联想,终于升级到Android10,联想ZUI11.5 内测版上线
- Git版本控制:GitMojo及常用DOS命令
- 未来集市是什么做什么的?为什么朋友圈有那么多人在做?邀请码686040