• 设计模式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-装饰者设计模式相关推荐

  1. 设计模式03 - 装饰者模式

    引入: 曾今以为继承能解决一切问题.在程序运行时发现,扩展的威力远大于编译时扩展的威力. 装饰者模式: 好处: 一旦知道装饰的技巧,你将能给你的(或别人的)对象一个新的责任,而不需要对底层class的 ...

  2. 03 装饰着设计模式

    装饰者设计模式的原理 1. 类支持扩展,不支持修改.避免类爆炸的现象.(核心) 2. 装饰者模式:动态的将新功能附加到对象上,在对新功能扩展方面比继承更有弹性. 3.装饰者模式可以理解为打包快递 1) ...

  3. java培训 | Java设计模式之装饰者设计模式

    星巴克咖啡订单项目 星巴克咖啡订单项目(咖啡馆): 1) 咖啡种类/单品咖啡:Espresso(意大利浓咖啡).ShortBlack.LongBlack(美式咖啡).Decaf(无因咖啡) 2) 调料 ...

  4. 结构设计模式 - 装饰器设计模式

    结构设计模式 - 装饰设计模式 装饰器设计模式用于在运行时修改对象的功能.同时,同一类的其他实例不会受此影响,因此单个对象将获得已修改的行为.装饰器设计模式是结构设计模式之一(如Adapter Pat ...

  5. 初学Java常用设计模式之——装饰器模式

    声明:转载请附上原文链接 提示:标题序号从8开始,是照应不同设计模式笔记发布的顺序而定的,比如,上一篇文章 初学Java常用设计模式之--桥接模式和组合模式 序号从7开始. 8. 装饰器设计模式(重点 ...

  6. 装饰者设计模式(结构型设计模式)

    一.装饰者设计模式简介 装饰器设计模式(Decorator Pattern) 也叫包装设计模式,属于结构型模式,它是作为现有的类的⼀个包装,允许向⼀个现有的对象添加新的功能, 同时⼜不改变其结构给对象 ...

  7. 《Head First设计模式》 读书笔记03 装饰对象

    <Head First设计模式>读书笔记03 装饰对象 问题引入 咖啡店的类设计: 一个饮料基类,各种饮料类继承这个基类,并且计算各自的价钱. 饮料中需要加入各种调料,考虑在基类中加入一些 ...

  8. 装饰者模式 php,PHP设计模式之装饰器模式

    装饰器设计模式 什么是装饰器模式 装饰器模式就是对一个已有的结构增加装饰.装饰模式是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能.它是通过创建一个包装对象,也就是装饰来包裹真实的对象 ...

  9. Java设计模式(装饰者模式-组合模式-外观模式-享元模式)

    Java设计模式Ⅳ 1.装饰者模式 1.1 装饰者模式概述 1.2 代码理解 2.组合模式 2.1 组合模式概述 2.2 代码理解 3.外观模式 3.1 外观模式概述 3.2 代码理解 4.享元模式 ...

  10. 前端也要学系列:设计模式之装饰者模式

    什么是装饰者模式 今天我们来讲另外一个非常实用的设计模式:装饰者模式.这个名字听上去有些莫名其妙,不着急,我们先来记住它的一个别名:包装器模式. 我们记着这两个名字来开始今天的文章. 首先还是上< ...

最新文章

  1. Python 函数初识 (1)
  2. C++ Exercises(十八)
  3. java 静态分派_Java中的静态分派与动态分派
  4. Playfair加密算法(C 实现)
  5. 4-3利用神经网络解决分类和回归问题(1)
  6. C#中几种代码复用的方式
  7. 一步一步写算法(之 A*算法)
  8. android屏幕共享实现方式,基于WebRtc在Android端实现屏幕共享
  9. Deep Learning-Deep feedforward network
  10. 软件测试工具Winrunner TSL命令简介
  11. 微信小程序实现仿美团外卖饿了么左右联动页面
  12. Python数组索引
  13. 项目管理知识体系系指南学习总结(一)
  14. 笔记 How Powerful are Spectral Graph Neural Networks
  15. arch(linux)挂接小鹤音形输入法
  16. k-means用于图像的颜色聚类
  17. 为什么成年人都不学习了
  18. 一代宗师威廉·欧奈尔的选股法则详解
  19. 程序员的中年危机好可怕
  20. 对市场周期常存敬畏之心

热门文章

  1. 网络设备中的日志分析
  2. 获取文件编码格式 java_java实现获取文本文件的字符编码
  3. CoinCola可盈可乐区块链行业周报第十二期(1.16-1.31)
  4. 支付宝:直播上演“就业风云”
  5. 联想R7000 2020双系统+无人机仿真环境配置
  6. Python视频教程及最佳学习路线图
  7. web 页面静态化设计
  8. 版本更新android联想,终于升级到Android10,联想ZUI11.5 内测版上线
  9. Git版本控制:GitMojo及常用DOS命令
  10. 未来集市是什么做什么的?为什么朋友圈有那么多人在做?邀请码686040