设计模式(二) | 装饰模式---穿什么有这么重要?

category: 大话设计模式

装饰模式

装饰模式之前的面向对象原则介绍

  • 单一职责原则:就一个类而言,应该仅有一个引起它变化的原因。也就是说功能要单一。
  • 优点: 灵活性,可复用性。
  • 如果一个类承担的职责太多,就等于把这些职责耦合在一起,一个职责的变化可能会削弱或者阻碍其他职责能力,这种耦合会导致脆弱的设计,当变化发生时,设计会发生意想不到的变化。
  • 开放封闭原则:软件应该可以扩展,但不可以修改。对于扩展是开放的,对于更改是封闭的。
  • 面对需求,对程序的改动是通过增加新代码进行的,而不是更改现有代码,这就是开放封闭原则的精神所在。
  • 优点:可扩展 可复用 灵活性好
  • 依赖倒转原则:抽象不应该依赖细节,细节不应该依赖抽象。针对对接口编程,不要对实现编程。即高层模块不依赖底层模块,底层模块不依赖高层模块。
  • 其实就是谁也不依赖谁,除了约定的接口,大家都可以灵活自如。
  • 里氏代换原则:子类型必须能够替换掉他们的父类型,只有当子类可以替换掉父类,软件单位功能不受影响时,父类才能真正倍复用。

装饰模式

  • 装饰模式:动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活。
  • 装饰模式是为已有功能动态的添加更多功能的一种方式。
  • 代码实现:
    1. //需要被装饰的对象
    2. public class Person {
    3. private String name;
    4. public Person(String name) {
    5. super();
    6. this.name = name;
    7. }
    8. public Person() {
    9. super();
    10. }
    11. public void show(){
    12. System.out.println("装扮的"+name);
    13. }
    14. }
    15. //功能的抽象类
    16. public class Finery extends Person{
    17. protected Person component;
    18. //打扮
    19. public void Decorate(Person component){
    20. this.component = component;
    21. }
    22. @Override
    23. public void show(){
    24. if(component != null){
    25. component.show();
    26. }
    27. }
    28. }
    29. //继承功能类
    30. public class BigTrouser extends Finery {
    31. @Override
    32. public void show(){
    33. System.out.println("垮裤");
    34. super.show();
    35. }
    36. }
    37. //继承功能类
    38. public class TShirts extends Finery {
    39. @Override
    40. public void show(){
    41. System.out.println("大T恤");
    42. super.show();
    43. }
    44. }
    45. //继承功能类
    46. public class WearSneakers extends Finery {
    47. @Override
    48. public void show(){
    49. System.out.println("破球鞋");
    50. super.show();
    51. }
    52. }
    53. //继承功能类
    54. public class WearSuit extends Finery{
    55. @Override
    56. public void show(){
    57. System.out.println("西装");
    58. super.show();
    59. }
    60. }
    61. //动态给对象添加功能
    62. public class Test {
    63. public static void main(String[] args) {
    64. Person xc = new Person("小菜");
    65. System.out.println("第一种装扮:");
    66. WearSneakers w = new WearSneakers();
    67. WearSuit ws = new WearSuit();
    68. BigTrouser bt = new BigTrouser();
    69. /*
    70. * 首先实例化person对象
    71. * 再用WearSneakers类包装person
    72. * 再用WearSuit类来包装WearSneakers对象
    73. * 再用BigTrouser类包装WearSuit对象
    74. * 最终执行BigTrouser的show方法。
    75. *
    76. */
    77. w.Decorate(xc);
    78. ws.Decorate(w);
    79. bt.Decorate(ws);
    80. bt.show();
    81. }
    82. }
  • 输出结果:
    1. 第一种装扮:
    2. 垮裤
    3. 西装
    4. 破球鞋
    5. 装扮的小菜
    6. 什么时候使用装饰模式:
  • 当系统需要新功能时,是向旧的类中添加新的代码,这些新代码通常装饰了原有的核心职责或主要行为。
  • 把每个要装饰的功能放在单独的类中,并让这个类包装它所有装饰的对象。
  • 优点:
  • 把类的核心职责和装饰功能区分开来,去除相关类中重复的装饰逻辑。
  • 简化原有类。

往期回顾

设计模式(一) | 啥是工厂模式和策略模式?

原文发布于微信公众号 - 轮子工厂(Programmer-ing)

原文发表时间:2017-09-02

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏web前端教室

JS代码超过1000行,该怎么维护?

1000行JS代码,听起来挺多的,但实际上真不算什么,随便一个功能完备、代码健壮的JS应用或是模块,很轻松的就写出1000多行,看这里,我以前写的一个tabel...

27070
来自专栏木可大大

编写优雅代码的最佳实践

Robert Martin曾说过"在代码阅读中说脏话的频率是衡量代码质量额唯一标准"。同时,代码的写法应当使别人理解它所需的时间最小化,也就是说我们写的代码是给...

464200
来自专栏java一日一条

Java 中的十个”单行代码编程” ( One Liner )

本文列举了十个使用一行代码即可独立完成(不依赖其他代码)的业务逻辑,主要依赖的是Java8中的Lambda和Stream等新特性以及try-with-resou...

10320
来自专栏java学习

Java每日一练(2017/8/12)

最新通知 ●回复"每日一练"获取以前的题目! ●【新】Android视频更新了!(回复【安卓视频】获取下载链接) ●【新】Ajax知识点视频更新了!(回复【学习...

28540
来自专栏小樱的经验随笔

BugkuCTF 矛盾

15920
来自专栏为数不多的Android技巧

一种绕过Android P对非SDK接口限制的简单方法

众所周知,Android P 引入了针对非 SDK 接口(俗称为隐藏API)的使用限制。这是继 Android N上针对 NDK 中私有库的链接限制之后的又一次...

72230
来自专栏较真的前端

新手们容易在Promise上挖的坑~

25450
来自专栏chafezhou

Python 工匠:使用数字与字符串的技巧

数字是几乎所有编程语言里最基本的数据类型,它是我们通过代码连接现实世界的基础。在 Python 里有三种数值类型:整型(int)、浮点型(float)和复数(c...

10310
来自专栏Java爬坑系列

【Java入门提高篇】Day2 接口

  上一篇讲完了抽象类,这一篇主要讲解比抽象类更加抽象的内容——接口。   什么是接口呢?先来看一个现实中的栗子,我们常用的插座,一般分为两孔和三孔,所以基本上...

19980
来自专栏Jimoer

Java设计模式之GoF设计模式概述

最近要开始学习设计模式了,以前是偶尔会看看设计模式的书或是在网上翻到了某种设计模式,就顺便看看,也没有仔细的学习过。前段时间看完了JVM的知识,然后就想着JVM...

11130

扫码关注云+社区

领取腾讯云代金券