`
ai_longyu
  • 浏览: 481979 次
社区版块
存档分类
最新评论

设计模式学习----装饰器模式

 
阅读更多

这两天本来是自在学习java collection Framework的Fail Fast底层机制,看到核心的部分时,突然意识到设计模式的问题,上大学到现在我还没有真正理解过设计模式的概念,于是用了大半天好好的学习了一下装饰器模式,回头再看jdk的源码,舒服多了,的确验证了那句话,设计模式非学不可啊,可以说自己是个十足的菜鸟,连基本的java接口机制和继承都忘得差不多了,这一天全拾起来了~

首先解释一下忘记接口的同学难点,接口其实就是java的抽象机制,不提供方法的具体实现,但是可以有多个类来实现这个接口,一个类也可以实现多个接口,接口带来的好处是创建实例时,用户不必关注具体的实现,比如我例子中的DecoratorPattern.java文件中 ,创建实现Basket接口的一个实例时,返回值是接口,下面再使用show方法时,我们就不必去关注谁实现了。接口作为返回值的一个经典的应用是使用ArrayList时,他的iterator方法会返回一个Iterator接口。这样开发者使用it.next方法,再不用去研究每一种list是怎么实现查询了。

下面解释装饰器模式是如何引起的,深入浅出模式设计的例子很好,就是喝咖啡,有个调料的类,你可以加糖、冰、牛奶等等好多原料,那么生成调配方案时,可以通过继承来实现,但是大家也都知道排列组合,继承的类系统庞大可想而知了。

这就诞生了装饰器模式,他的原则是,保持原有的接口,并为原来的动态的添加新的功能。

下面是维基百科的解释:相信大家都可以看懂

通过使用修饰模式,可以在运行时扩充一个类的功能。原理是:增加一个修饰类包裹原来的类,包裹的方式一般是通过在将原来的对象作为修饰类的构造函数的参数。装饰类实现新的功能,但是,在不需要用到新功能的地方,它可以直接调用原来的类中的方法。修饰类必须和原来的类有相同的接口。

修饰模式是类继承的另外一种选择。类继承在编译时候增加行为,而装饰模式是在运行时增加行为。

当有几个相互独立的功能需要扩充时,这个区别就变得很重要。在有些面向对象的编程语言中,类不能在运行时被创建,通常在设计的时候也不能预测到有哪几种功能组合。这就意味着要为每一种组合创建一个新类。相反,修饰模式是面向运行时候的对象实例的,这样就可以在运行时根据需要进行组合。一个修饰模式的示例是JAVA里的Java I/O Streams的实现

//补充一下,还有个经典的例子是java Collection framework也就是我们经常使用的ArrayList的底层实现机制,也是利用了装饰器模式。


再引用网上的一个设计图,很清晰了,我在代码中的实现,并没有实现装饰器基类,而是直接去装饰了。


下面介绍我这个演示的demo,假设我们有一个水果篮子,厘米可以装苹果,香蕉、或者橘子。这是可以典型的应用装饰器模式,比如我们用三个修饰器来修饰水果篮子里面装的内容。假设我们使用继承的话,那么要想获得所有情况,根据排列组合那么就有8种可能,需要有7个子类(空篮子就是本身,不需继承了)。装饰器模式就简单多了


第一个是Basket接口


下面是被装饰的对象,也就是对接口的一个实现,注意可以有多个实现


接下来是三个装饰器的实现






最后就是实现的效果,我们三个修饰器全部用到,装满了篮子,当然也可以只装一个苹果或香蕉

演示的结果:

run:
The original Basket contains
An Oranage
A Banana
an Apple
成功生成(总时间:0 秒)



实训期间时间比较紧张,写的不清晰,所以大家有疑问可以私下联系我吧,欢迎留言

分享到:
评论

相关推荐

    《C++20设计模式》学习笔记-第9章装饰器模式-配套代码

    《C++20设计模式》学习笔记-第9章装饰器模式-配套代码

    设计模式--C++

    1.1 什么是设计模式 2 1.2 Smalltalk MVC 中的设计模式 3 1.3 描述设计模式 4 1.4 设计模式的编目 5 1.5 组织编目 7 1.6 设计模式怎样解决设计问题 8 1.6.1 寻找合适的对象 8 1.6.2 决定对象的粒度 9 1.6.3 指定对象...

    设计模式--可复用面向对象软件的基础

    1.2 Smalltalk MVC中的设计模式 1.3 描述设计模式 1.4 设计模式的编目 1.5 组织编目 1.6 设计模式怎样解决设计问题 1.7 怎样选择设计模式 1.8 怎样使用设计模式 第二章 实例研究:设计一个文档编辑器 2.1 设计问题...

    JAVA设计模式学习12——装饰器模式

    NULL 博文链接:https://alaric.iteye.com/blog/1911949

    设计模式_装饰器模式.zip

    装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。 这种模式创建了一个装饰类,用来包装原有的类,并在...

    浅谈Java设计模式系列-装饰器模式

    主要介绍了Java设计模式系列-装饰器模式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

    设计模式:可复用面向对象软件的基础--详细书签版

     “[设计模式]在实用环境下特别有用,因为它分类描述了一组设计良好,表达清楚的面向对象软件设计模式。整个设计模式领域还很新,本书的四位作者也许已占据了这个领域造诣最深的专家中的半数,因而他们定义模式的方法...

    装饰器模式的简单demo

    简单了说明,并用代码的方式解释了什么是装饰器模式,方便想要学习设计模式的童靴可以更好的学习和掌握设计模式,是自己的代码变得更高效和优雅

    尚硅谷设计模式源码笔记课件.zip

    2) 设计模式包含了大量的编程思想,讲授和真正掌握并不容易,网上的设计模式课程不少,大多讲解的比较晦涩,没有真实的应用场景和框架源码支撑,学习后,只知其形,不知其神。就会造成这样结果: 知道各种设计模式,...

    研磨设计模式-part2

    也可以作为高效学生深入学习设计模式的参考读物! 第1章 设计模式基础 第2章 简单工厂 第3章 外观模式 第4章 适配器模式(Adapter) 第5章 单例模式(Singleton) 第6章 工厂方法模式(Factory Method) 第7章...

    常用设计模式学习脑图

    常用设计模式脑图,脑图中根据每个设计模式进行了详细的备注解释!我们的最强大脑在哪里?...(单例模式、原型模式、工厂模式、代理模式、策略模式、适配器模式、委派模式、装饰器模式、观察者模式)

    研磨设计模式-part4

    也可以作为高效学生深入学习设计模式的参考读物! 第1章 设计模式基础 第2章 简单工厂 第3章 外观模式 第4章 适配器模式(Adapter) 第5章 单例模式(Singleton) 第6章 工厂方法模式(Factory Method) 第7章...

    研磨设计模式-part3

    也可以作为高效学生深入学习设计模式的参考读物! 第1章 设计模式基础 第2章 简单工厂 第3章 外观模式 第4章 适配器模式(Adapter) 第5章 单例模式(Singleton) 第6章 工厂方法模式(Factory Method) 第7章...

    java后端开发+java23种设计模式学习demo

    结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。 行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、...

    研磨设计模式(完整带书签).part2.pdf

    也可以作为高效学生深入学习设计模式的参考读物! 第1章 设计模式基础 第2章 简单工厂 第3章 外观模式 第4章 适配器模式(Adapter) 第5章 单例模式(Singleton) 第6章 工厂方法模式(Factory Method) 第7章...

    设计模式可复用面向对象软件的基础.zip

    书名: 设计模式可复用面向对象软件的基础 英文原书名: Design Patterns:Elements of Reusable Object-Oriented software 作者: Erich Gamma 等 译者: 李英军 马晓星 蔡敏 刘建中 书号: 7-111-07575-7 页码: 254 定价...

    23种设计模式 - 各种模式的学习

    23种设计模式 目录 创建型 1. Factory Method(工厂方法) 2. Abstract Factory(抽象工厂) 3. Builder(建造者) 4. Prototype(原型) 5. Singleton(单例) 结构型 6. Adapter Class/Object(适配器) ...

    23种Python设计模式示例演示源码包.rar

    23种Python设计模式示例演示源码包,比如包括了工厂模式、Bridge桥接模式、Builder构建模式、Facade外观模式、Adapter适配器模式,Composite组合模式、Decorator装饰器模式,FactoryMethod工厂方法模式、Flyweight享...

    设计模式-7种开发语言(C#、JAVA、JavaScript、C++、Python、Go、PHP).pdf

    第十六节 装饰器模式 第十七节 迭代器模式 第十八节 中介者模式 第十九节 备忘录模式 第二十节 状态模式 第二十一节 访问者模式 第二十二节 原型模式 第二十三节 享元模式 第二十四节 责任链模式 第二十五节 解释器...

    设计模式学习之装饰器模式.docx

    定义一个抽象类ChineseHamburger代表肉夹馍,小摊卖的所有夹馍都需继承自此类,有两个方法: getDescription(),抽象方法,可以返回是什么肉夹馍,由子类实现; cost()方法是抽象的,由子类来实现;...

Global site tag (gtag.js) - Google Analytics