装饰器模式 超、凢脫俗 2021-09-12 02:16 373阅读 0赞 ![5057999-ef364c6262961125.png][] image.png 意图: 动态地给一个对象添加一些额外的职责。就增加功能来说,Decorator模式相比生成子类更为灵活。 设计原则: 1. 多用组合,少用继承。 利用继承设计子类的行为,是在编译时静态决定的,而且所有的子类都会继承到相同的行为。然而,如果能够利用组合的做法扩展对象的行为,就可以在运行时动态地进行扩展。 2. 类应设计的对扩展开放,对修改关闭。 #### 要点: #### 1. 装饰者和被装饰对象有相同的超类型。 2. 可以用一个或多个装饰者包装一个对象。 3. 装饰者可以在所委托被装饰者的行为之前或之后,加上自己的行为,以达到特定的目的。 4. 对象可以在任何时候被装饰,所以可以在运行时动态的,不限量的用你喜欢的装饰者来装饰对象。 5. 装饰模式中使用继承的关键是想达到装饰者和被装饰对象的类型匹配,而不是获得其行为。 6. 装饰者一般对组件的客户是透明的,除非客户程序依赖于组件的具体类型。在实际项目中可以根据需要为装饰者添加新的行为,做到“半透明”装饰者。 7. 适配器模式的用意是改变对象的接口而不一定改变对象的性能,而装饰模式的用意是保持接口并增加对象的职责。 #### 何时使用: #### 1. 需要扩展一个类的功能,或给一个类添加附加职责。 2. 需要动态的给一个对象添加功能,这些功能可以再动态的撤销。 3. 需要增加由一些基本功能的排列组合而产生的非常大量的功能,从而使继承关系变的不现实。 4. 当不能采用生成子类的方法进行扩充时。一种情况是,可能有大量独立的扩展,为支持每一种组合将产生大量的子类,使得子类数目呈爆炸性增长。另一种情况可能是因为类定义被隐藏,或类定义不能用于生成子类。 public class DecoratorTest { //Component(抽象构件) interface ProgramMonkey { void skills(); } //ConcreteComponent(具体构件) class AndroidProgramMonkey implements ProgramMonkey { @Override public void skills() { System.out.println("会写Android代码!"); } } //Decorator(抽象装饰类) class ProgramMonkeyDecorator implements ProgramMonkey { protected ProgramMonkey mProgramMonkey; public ProgramMonkeyDecorator(ProgramMonkey mProgramMonkey) { this.mProgramMonkey = mProgramMonkey; } public void skills() { mProgramMonkey.skills(); } } //ConcreteDecorator(具体装饰类) class PatternDecorator extends ProgramMonkeyDecorator { public PatternDecorator(ProgramMonkey mProgramMonkey) { super(mProgramMonkey); } @Override public void skills() { super.skills(); System.out.println("会设计模式!"); } } class PatternDecorator2 extends ProgramMonkeyDecorator { public PatternDecorator2(ProgramMonkey mProgramMonkey) { super(mProgramMonkey); } @Override public void skills() { super.skills(); System.out.println("会Python!"); } } @Test public void test() { //有一个Android程序猿只会写Android代码 ProgramMonkey programMonkey = new AndroidProgramMonkey(); programMonkey.skills(); //装饰一下他,装逼的技能,他竟然除了写Android还懂设计模式 programMonkey = new PatternDecorator(programMonkey); programMonkey.skills(); programMonkey = new PatternDecorator2(programMonkey); programMonkey.skills(); } } 装饰者更多关注的是“动态添加功能” 代理常用于“控制访问” ![5057999-93894cc068a4e802.png][] 装饰者模式在I/O中的应用 参考文章: [http://blog.csdn.net/yanbober/article/details/45395747][http_blog.csdn.net_yanbober_article_details_45395747] [http://www.cnblogs.com/god\_bless\_you/archive/2010/06/10/1755212.html][http_www.cnblogs.com_god_bless_you_archive_2010_06_10_1755212.html] [5057999-ef364c6262961125.png]: /images/20210811/4c3711acb4d8417eba29d6d10a7e5d08.png [5057999-93894cc068a4e802.png]: /images/20210811/eb67e6ffd692409aa3d9edc6651e0c8b.png [http_blog.csdn.net_yanbober_article_details_45395747]: https://link.jianshu.com?t=http://blog.csdn.net/yanbober/article/details/45395747 [http_www.cnblogs.com_god_bless_you_archive_2010_06_10_1755212.html]: https://link.jianshu.com?t=http://www.cnblogs.com/god_bless_you/archive/2010/06/10/1755212.html
相关 装饰器模式 装饰器模式就是一种通过组合方式实现扩展的设计模式,装饰器的核心思想是为已有实现类创建多个包装类,由这些新增的包装类完成新需求的扩展。 装饰器模 以你之姓@/ 2022年09月10日 08:18/ 0 赞/ 45 阅读
相关 装饰器模式 装饰器模式 <?php class BaseArticle{ protected $art = null; protected 我会带着你远行/ 2022年07月21日 01:28/ 0 赞/ 212 阅读
相关 装饰器模式 1 <?php 2 //装饰器模式-在不改变原有类的结构上,对类的功能那个作补充 3 4 //武器基类 5 abstract 秒速五厘米/ 2022年06月16日 00:00/ 0 赞/ 198 阅读
相关 装饰器模式 在学装饰器模式的时候,我想到了责任链模式中的级别这个概念,为什么这么说,在一个OA系统中我们会有不同级别(或者说权限范围不同)的管理员,首先我们要明确不同级别的管理员它也是管理 深碍√TFBOYSˉ_/ 2022年05月08日 06:14/ 0 赞/ 220 阅读
相关 装饰器模式 1、初识装饰器模式 装饰器模式,顾名思义,就是对已经存在的某些类进行装饰,以此来扩展一些功能。其结构图如下: ![watermark_type_ZmFuZ3poZW 小鱼儿/ 2022年04月24日 08:50/ 0 赞/ 246 阅读
相关 装饰器模式 ![Fpm6gbuGrUYHxqlnbEc-syPtY1Y3][] 什么是装饰器? 装饰器设计模式 > 装饰器模式(Decorator Pattern)允许向一个现有 ╰半橙微兮°/ 2022年04月21日 22:36/ 0 赞/ 235 阅读
相关 装饰器模式 一、基类 ![ContractedBlock.gif][] ![ExpandedBlockStart.gif][] /----------------------- £神魔★判官ぃ/ 2021年09月30日 08:42/ 0 赞/ 366 阅读
相关 装饰器模式 7.装饰器模式 ![70][] ![70 1][] class Program { static void Main( 拼搏现实的明天。/ 2021年09月16日 23:56/ 0 赞/ 334 阅读
相关 装饰器模式 ![5057999-ef364c6262961125.png][] image.png 意图: 动态地给一个对象添加一些额外的职责。就增加功能来说,Decorator模 超、凢脫俗/ 2021年09月12日 02:16/ 0 赞/ 374 阅读
相关 装饰器模式 饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。 这种... 小灰灰/ 2020年06月13日 05:56/ 0 赞/ 771 阅读
还没有评论,来说两句吧...