设计模式(二)之装饰模式 | 说好了面向对象,谁也不许赖谁~

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

单一职责原则:就一个类而言,应该仅有一个引起它变化的原因。也就是说功能要单一。

  1. 优点: 灵活性,可复用性。
  2. 如果一个类承担的职责太多,就等于把这些职责耦合在一起,一个职责的变化可能会削弱或者阻碍其他职责能力,这种耦合会导致脆弱的设计,当变化发生时,设计会发生意想不到的变化。

开放封闭原则:软件应该可以扩展,但不可以修改。对于扩展是开放的,对于更改是封闭的。

  1. 面对需求,对程序的改动是通过增加新代码进行的,而不是更改现有代码,这就是开放封闭原则的精神所在。
  2. 优点:可扩展 可复用 灵活性好。

依赖倒转原则:抽象不应该依赖细节,细节不应该依赖抽象。针对对接口编程,不要对实现编程。即高层模块不依赖底层模块,底层模块不依赖高层模块。

  1. 其实就是谁也不依赖谁,除了约定的接口,大家都可以灵活自如。

里氏代换原则:子类型必须能够替换掉他们的父类型,只有当子类可以替换掉父类,软件单位功能不受影响时,父类才能真正被复用。

装饰模式

定义:动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活。

装饰模式是为已有功能动态的添加更多功能的一种方式。

代码实现:

//需要被装饰的对象public class Person {
    private String name;
    public Person(String name) {        super();        this.name = name;    }
    public Person() {        super();    }
    public void show(){
        System.out.println("装扮的"+name);    }
}
//功能的抽象类
public class Finery extends Person{
    protected Person component;    //打扮    public void Decorate(Person component){        this.component = component;    }    @Override    public void show(){        if(component != null){            component.show();        }    }
}//继承功能类public class BigTrouser extends Finery {    @Override
    public void show(){        System.out.println("垮裤");        super.show();    }
}
//继承功能类
public class TShirts extends Finery {
    @Override
    public void show(){        System.out.println("大T恤");        super.show();    }
}//继承功能类public class WearSneakers extends Finery {    @Override    public void show(){        System.out.println("破球鞋");        super.show();
    }
}
//继承功能类public class WearSuit extends Finery{    @Override    public void show(){        System.out.println("西装");        super.show();    }}
//动态给对象添加功能
public class Test {    public static void main(String[] args) {
        Person xc = new Person("小菜");
        System.out.println("第一种装扮:");
        WearSneakers w = new WearSneakers();
        WearSuit ws = new WearSuit();
        BigTrouser bt = new BigTrouser();
        /*
         * 首先实例化person对象
         * 再用WearSneakers类包装person
         * 再用WearSuit类来包装WearSneakers对象         * 再用BigTrouser类包装WearSuit对象         * 最终执行BigTrouser的show方法。         * 
         */
        w.Decorate(xc);   
        ws.Decorate(w);
        bt.Decorate(ws);
        bt.show();
    }
}

输出结果:

第一种装扮: 垮裤 西装 破球鞋 装扮的小菜

什么时候使用装饰模式

  • 当系统需要新功能时,是向旧的类中添加新的代码,这些新代码通常装饰了原有的核心职责或主要行为。
  • 把每个要装饰的功能放在单独的类中,并让这个类包装它所有装饰的对象。

优点:

  • 把类的核心职责和装饰功能区分开来,去除相关类中重复的装饰逻辑。
  • 简化原有类。

为你推荐以下文章

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

务实基础篇--Java内存模型及GC原理

深入理解Java中的List、Set与Map集合

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

原文发表时间:2018-04-27

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏高性能服务器开发

API设计原则 – QT官网的设计实践总结

原文链接:API Design Principles – Qt Wiki 链接:(http://wiki.qt.io/API_Design_Principles...

33120
来自专栏林冠宏的技术文章

经典面试问题: Top K 之 ---- 海量数据找出现次数最多或,不重复的。

作者:林冠宏 / 指尖下的幽灵 掘金:https://juejin.im/user/587f0dfe128fe100570ce2d8 博客:htt...

728150
来自专栏编程之旅

Python——搞定烦人的字符串编码

在学习Python之前,就听说过Python的版本圣战,最可怕的是有的写Py3的程序员觉得Py2是另一种语言....所以在刚开始学习的时候,我索性把Python...

10730
来自专栏Crossin的编程教室

【Python 第26课】 操作list

上周给list开了个头,知道了什么是list。假设我们现在有一个list: l = [365, 'everyday', 0.618, True] 除了用for...

373110
来自专栏老马说编程

计算机程序的思维逻辑 (1)

程序大概是怎么回事 计算机就是个机器,这个机器主要由CPU、内存、硬盘和输入输出设备组成。计算机上跑着操作系统,如Windows或Linux,操作系统上运行着各...

213100
来自专栏青玉伏案

代码重构(一):函数重构规则

重构是项目做到一定程度后必然要做的事情。代码重构,可以改善既有的代码设计,增强既有工程的可扩充、可维护性。随着项目需求的不断迭代,需求的不断更新,我们在项目中所...

26450
来自专栏用户1191492的专栏

物联网平台设计文档:精简GC(垃圾回收)

许多高级编程语言的自动内存管理功能让编程变成了比较容易的一件事。然而,嵌入式平台经常缺少这一部分功能,这是有原因的:现代垃圾收集(GC)系统使用的...

30250
来自专栏杨建荣的学习笔记

实用的位运算应用(r4笔记第97天)

对于位运算,之前在一篇博文中分享了一下在c语言和oracle中的位运算实现 http://blog.itpub.net/23718752/viewspace-1...

29350
来自专栏Android干货

自定义控件:数独游戏(二)

43170
来自专栏编程

更高级的C+,Qt对象模型

今天我们来看看Qt的对象模型,但在讲述之前,先来看看C++对象模型。 1 C++对象模型 学习过C语言的同学都知道,在C语言中,数据和函数是分开的,也就是说,语...

297100

扫码关注云+社区

领取腾讯云代金券