装饰者模式 谁践踏了优雅 2021-12-03 15:25 341阅读 0赞 装饰者模式,在不改变一个对象本身功能的基础上给对象增加额外的新行为。比如,我们到书店买书,在不改变书籍本身的基础上,赠送个书签,或者要个包装袋 **装饰者模式(Decorator Pattern):**在不改变原有对象的基础上,动态的给对象增加一些额外的职责。就给对象增加功能来说,装饰者模式比继承的方式更加灵活。装饰者模式是一种对象结构型模式 装饰者模式,无须定义子类动态给对象增加职责,用对象之间的关联关系取代类之间的继承关系 装饰者模式结构,需要4个角色,抽象构件、具体构件、抽象装饰类、具体装饰类 抽象构件(Component):具体构件和抽象装饰类的共同父类,声明了具体构件中实现的业务方法 具体构件(ConcreteComponent):抽象构件类的子类,定义具体构件对象 抽象装饰类(Decorator):抽象构件类的子类,作用是给具体构件增加功能,具体功能在其子类中实现 具体装饰类(ConcreteDecorator):抽象装饰类的子类,给构件添加新的功能 下面还是以买书为例,讲解装饰者模式 去书店买书,增加书签不要钱,增加一个书的包装袋,需额外加钱 定义抽象书籍类,在这里相当于抽象构件 package com.design.structural.decorator; /** * 抽象书籍类 */ public abstract class AbstractBook { //书名 public abstract void bookName(); //价格 public abstract void bookPrice(); } 定义具体书籍红楼梦,售价60元,相当于具体构件 package com.design.structural.decorator; public class TheDreamofRedMansionBook extends AbstractBook{ @Override public void bookName() { System.out.println("红楼梦"); } @Override public void bookPrice() { System.out.println("售价60元"); } } 定义抽象书籍装饰类,相当于抽象装饰类 package com.design.structural.decorator; public class AbstractDecorator extends AbstractBook{ private AbstractBook abstractBook; public AbstractDecorator(AbstractBook abstractBook){ this.abstractBook = abstractBook; } @Override public void bookName() { this.abstractBook.bookName(); } @Override public void bookPrice() { this.abstractBook.bookPrice(); } } 定义书签装饰类,相当于具体装饰类 package com.design.structural.decorator; /** * 书签装饰类 */ public class BookmarkDecorator extends AbstractDecorator{ public BookmarkDecorator(AbstractBook abstractBook) { super(abstractBook); } @Override public void bookName() { super.bookName(); System.out.println("增加一个书签"); } @Override public void bookPrice() { super.bookPrice(); } } 定义包装袋装饰类,相当于具体装饰类 package com.design.structural.decorator; /** * 包装袋装饰 */ public class PackDecorator extends AbstractDecorator{ public PackDecorator(AbstractBook abstractBook) { super(abstractBook); } @Override public void bookName() { super.bookName(); System.out.println("增加一个包装袋"); } @Override public void bookPrice() { super.bookPrice(); System.out.println("增加2元钱"); } } 类图如下 ![watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dzanp6Y2Jx_size_16_color_FFFFFF_t_70][] 测试调用 不要书签和包装袋 package com.design.structural.decorator; public class TestMain { public static void main(String[] args) { AbstractBook abstractBook = new TheDreamofRedMansionBook(); //abstractBook = new BookmarkDecorator(abstractBook); //abstractBook = new PackDecorator(abstractBook); abstractBook.bookName(); abstractBook.bookPrice(); } } ![20190718202548632.png][] 要书签和包装袋 package com.design.structural.decorator; public class TestMain { public static void main(String[] args) { AbstractBook abstractBook = new TheDreamofRedMansionBook(); abstractBook = new BookmarkDecorator(abstractBook); abstractBook = new PackDecorator(abstractBook); abstractBook.bookName(); abstractBook.bookPrice(); } } ![watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dzanp6Y2Jx_size_16_color_FFFFFF_t_70 1][] **扩展** 透明装饰者模式与半透明装饰者模式 **透明装饰者模式(Transparent):**标准的装饰者模式就是透明装饰者模式。透明装饰者模式要求客户端完全针对抽象编程,且对象全部声明为抽象构件类型。可以对一个已装饰过的对象进行多次装饰,得到更为复杂、功能更强大的对象。实现透明装饰者模式时,需要具体装饰类的方法覆盖抽象装饰类的方法,比如上边代码中的 bookName() 方法和 bookPrice() 方法,除此之外,还可以调用其他方法,增加新的功能 **半透明装饰者模式(Semi-Transparent):**用具体装饰类型来定义装饰之后的对象,用抽象构件类型来定义具体构件类型。即相对于客户端来说,具体构件类型无须关心,是透明的,但具体装饰类型必须指定,它是不透明的 请看下边代码,示例半透明装饰者模式 抽象书籍装饰类,相当于抽象装饰类 package com.design.structural.decorator; public class AbstractDecorator extends AbstractBook{ private AbstractBook abstractBook; public AbstractDecorator(AbstractBook abstractBook){ this.abstractBook = abstractBook; } @Override public void bookName() { this.abstractBook.bookName(); } @Override public void bookPrice() { this.abstractBook.bookPrice(); } } 书签装饰类,相当于具体装饰类 package com.design.structural.decorator; /** * 书签装饰类 */ public class BookmarkDecorator extends AbstractDecorator{ public BookmarkDecorator(AbstractBook abstractBook) { super(abstractBook); } @Override public void bookName() { super.bookName(); System.out.println("增加一个书签"); } @Override public void bookPrice() { super.bookPrice(); } public void pencil(){ System.out.println("赠送一个铅笔"); } } 书签装饰类,即具体装饰类,自行增加了 pencil() 方法,这个方法在其父类抽象书籍装饰类中是没有的,因此是不透明的。这种方式更加灵活,设计相对简单,但最大的缺点是同一个对象不能多次装饰,且客户端需要有区别地对待装饰之前的对象和装饰之后的对象 **装饰者模式总结** 优点:继承的有力补充、比继承灵活;符合开闭原则; 缺点:增加更多的代码,增加程序复杂性;多次装饰的对象,较为复杂,不易调试 适用场景:扩展一个类,或给一个类添加职责;动态给对象添加功能;不能采用继承方式扩展系统或继承方式不利于扩展和维护系统时,采用装饰者模式 [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dzanp6Y2Jx_size_16_color_FFFFFF_t_70]: /images/20211203/9c3b4fd67eec41bd86ce6d11bbad9eb9.png [20190718202548632.png]: /images/20211203/65b55e6e381d484983083b569d06cb59.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dzanp6Y2Jx_size_16_color_FFFFFF_t_70 1]: /images/20211203/e1604b94776d4f20b20c48407936dfe8.png
相关 装饰者模式 《Head First Design Patterns》装饰者模式学习练习: 装饰者模式我们常见的Demo:文件读写io时候,会有InputStream,FileInputS 小灰灰/ 2022年07月13日 02:58/ 0 赞/ 95 阅读
相关 装饰者模式 package C\_Decker; /\\ \ 设计原则:类应该对扩展开放,对修改关闭。 \ 装饰者模式:动态地将责任和行为附加到对象上。若要扩展功能,装饰者提供了 骑猪看日落/ 2022年07月12日 12:17/ 0 赞/ 194 阅读
相关 装饰者模式 1.定义: 装饰模式是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。使用Decorator模式相比用 快来打我*/ 2022年06月05日 06:14/ 0 赞/ 180 阅读
相关 装饰者模式 引言 还是以热干面,加鸡蛋的热干面,加牛肉的热干面举例子 代码如下 1.先创建一个面条的接口 public interface Noodle { 朴灿烈づ我的快乐病毒、/ 2022年05月26日 10:52/ 0 赞/ 167 阅读
相关 装饰者模式 作用:可以给一个对象添加职责,可以用来扩展,比继承更有弹性。 装饰者模式 Decorator模式(别名Wrapper):动态将职责附加到对象上 蔚落/ 2022年05月25日 07:49/ 0 赞/ 172 阅读
相关 装饰者模式 装饰者模式有一个设计非常巧妙的结构,可以为对象动态添加功能。在基本的设计原则中,有一个重要的原则叫做合成/聚合复用原则。根据该原则的思想,代码复用应该尽可能使用委托,而不是继承 红太狼/ 2022年05月14日 02:50/ 0 赞/ 200 阅读
相关 装饰者模式 装饰者模式: 动态的将责任附加到对象上.若要扩展功能,装饰者提供了比继承更加有弹性的代替方案 继承和组合的区别: 继承: 我就是我/ 2022年05月11日 14:12/ 0 赞/ 216 阅读
相关 装饰者模式 TB - top bottom(自上而下) BT - bottom top(自下而上) RL - right left(从右到左) LR - left 亦凉/ 2022年02月18日 11:23/ 0 赞/ 204 阅读
相关 装饰者模式 装饰者模式,在不改变一个对象本身功能的基础上给对象增加额外的新行为。比如,我们到书店买书,在不改变书籍本身的基础上,赠送个书签,或者要个包装袋 装饰者模式(Decora 谁践踏了优雅/ 2021年12月03日 15:25/ 0 赞/ 342 阅读
相关 装饰者模式 一 点睛 我们先来看一个快餐店的例子。 快餐店有炒面、炒饭这些快餐,可以额外附加鸡蛋、火腿、培根这些配菜,当然加配菜需要额外加钱,每个配菜的价钱通常不太一样,那么计算 悠悠/ 2021年07月24日 19:11/ 0 赞/ 376 阅读
还没有评论,来说两句吧...