第三章 装饰者(Decorator)模式
1.组合(Composite)和委托(delegation)可以在运行时具有继承行为的效果.
组合: 在类中引用另一个类,将其对象作为当前类的一个变量(类变量).
委托: 使程序员可以将方法引用封装在委托对象内。然后可以将该委托对象传递给可调用该引用方法的代码,而不必在编译时知道将调用哪个方法。
2.利用继承设计子类的行为,是在编译时静态决定的,而且所有的子类都会继承到相同的行为.然而,如果能够利用组合的做法扩展对象的行为,就可以运行时动态地进行扩展.
3.通过动态地组合对象,可以写新的代码添加新的功能,而无须修改现有代码.既然没有改变现有代码,那么引进bug或产生意外副作用的机会将大幅度减少.
4.代码应该如同晚霞中的莲花一样地关闭(免于改变),如同晨曦中的莲花一样地开放(能够扩展).
5.设计原则五: 类应该对扩展开放,对修改关闭(Open-Closed Principle,OCP).即在设计一个模块的时候,应当使这个模块可以在不被修改的前提下被扩展.
6.我们的目标是允许类容易扩展,在不修改代码的情况下,就可以搭配新的行为.这样的设计具有弹性可以应对改变,可以接受新的功能来应对改变的需求.
7.装饰者(Decorator)模式很好地遵循开放-关闭原则(OCP).
8.遵循开放-关闭原则,通常会引入新的抽象层次,增加代码的复杂度.在程序设计过程中,我们应当把注意力放在那些最有可能会变化的地方,然后应用开放-关闭原则(OCP).一般来说,不可能使(大的)程序完全地既对修改关闭又对扩展开放.并且往往对程序每一个部分实现这样的设计反而会得不偿失.
9.装饰者和被装饰者有相同的超类型.
10.既然装饰者和被装饰者有相同的超类型,所以在任何需要原始对象(被包装的)的场合,可以用装饰过的对象代替它.
11.对象可以在任何时候被装饰,所以可以在运行时动态地、不限量地用你喜欢的装饰者来装饰对象.
12.装饰者模式:动态地将责任附加到对象上.若要扩展功能,装饰者提供了比继承更有弹性的替代方案.
13.java.io包内的许多类都是装饰者.如: BufferedInputStream及LineNumberInputStream都扩展自FilterInputStream,而FilterInputStream是一个抽象的装饰类,这是InputStream的一个抽象装饰者.(LineNumberInputStream->BufferedInputStream->FilterInputStream)
FilterInputStream是被装饰的组件.Java I/O程序库提供了几个组件,包括了FileInputStream,StringBufferInputStream,ByteArrayInputStream...等.这些类都提供了最基本的字节读取功能.
BufferedInputStream是一个具体的装饰者,它加入了两种行为: 1.利用缓冲输入来改进性能 2.用一个readLine()方法(用来一次读取一行文本输入数据)来增强接口.
LineNumberInputStream是一个装饰者,它加上了计算行数的能力.
个人觉得,Scanner s = new Scanner(System.in);Scanner是System.in的一个装饰.
14.(缺点)装饰者模式的一个"缺点": 利用装饰者模式,常常造成设计中有大量的小类,数量实在太多,可能会造成使用些API程序员的困扰.
15.装饰者模式因为会在设计中加入了大量的小类,偶尔会导致不容易了解它的设计方式,造成混乱.就像Java I/O 库来说,人们第一次接触到这个库时,往往无法轻易理解它.
16.装饰者一个优点是,你通常可以透明地插入装饰者,客户程序甚至不需知道它是在和装饰者打交道。但是,如我刚刚所说的,有些代
码会依赖特定的类型,而这样的代码一导入装饰者,嘭!出状况了!
17.(缺点)采用装饰者在实例化组件时,将增加代码的复杂度.一旦使用装饰者模式,不只需要实例化组件,还要把此组件包装进装饰者中.
18.OO原则: 1.封闭变化 2.多用组合,少用继承 3.针对接口编程,不针对实现编程 4.为交互对象之间的松耦合而努力 5.对修改关闭,对扩展开放
OO模式: 装饰者模式: 动态地将责任附加到对象上.想要扩展功能,装饰者提供有别于继承的另一种选择.
19.组合和委托可用于在运行时动态地加上新的行为.而继承早在编译期就将对象的行为定好了.
20.(缺点)装饰者会导致设计中出现许多小对象,如果过度使用,会让程序变得很复杂.
21.装饰者类反映出被装饰的组件类型(事实上,他们具有相同的类型,都经过接口或继承实现).
分享到:
相关推荐
装饰者模式(Decorator)是一种设计模式,用于在运行时动态地给对象添加额外的责任或功能。它是结构型设计模式的一种,能将行为的增加与对象的创建分离,使得我们可以独立地扩展对象的功能。 在Java或其他面向对象...
装饰者模式(Decorator Pattern)是结构型设计模式之一,它允许在运行时向对象添加新的行为或职责,而无需修改对象的源代码。这个模式的名字来源于装饰艺术,它通过添加额外的装饰来增强一个物体的外观,同样地,...
【Decorator模式】是一种设计模式,它允许在运行时动态地给对象...在实际的软件开发中,Decorator模式同样适用于那些需要动态增减功能的对象,例如在UI设计中添加装饰元素,或者在数据库连接池中添加不同的连接策略等。
装饰模式(Decorator Pattern)是一种结构型设计模式,它在不改变原有对象的基础上,通过包裹一个对象并为其添加新的行为或责任,实现对对象功能的扩展。这种模式在软件开发中非常常见,尤其当需要在运行时动态改变...
在装饰者模式中,我们通常有两个主要的角色:Component(组件)和Decorator(装饰器)。Component是被装饰的对象接口,定义了所有装饰器和原始对象共同拥有的行为。Concrete Component是Component的具体实现,是实际...
装饰模式(Decorator Pattern)是设计模式中的一种结构型模式,它在不改变原有对象的基础上,通过添加额外的职责来扩展对象的功能。在C#中,装饰模式尤其适用于那些需要动态地增加或减少对象功能的情况,避免了使用...
装饰者模式是软件设计模式中的一种结构型模式,它的主要目的是动态地给对象添加新的功能,而无需修改原有代码。在Java中,装饰者模式通常通过继承和组合来实现,它提供了一种比继承更灵活的方式来扩展对象的功能。...
装饰模式(Decorator Pattern)是设计模式中的一种结构型模式,它允许在运行时给对象添加新的行为或职责,而无需改变对象的类。在Java中,装饰模式通常通过继承和组合来实现,使得代码具有更好的扩展性和灵活性。...
装饰器模式(Decorator)是一种设计模式,它允许在运行时向对象添加新的行为或责任,而无需修改对象的源代码。这种模式属于结构型模式,是面向对象设计中的一种非常实用的技术。 装饰器模式的核心思想是通过将一个...
装饰者模式(Decorator Pattern)是一种结构型设计模式,它允许我们向对象添加新的行为或职责,而无需修改对象的原始代码。在C++中实现装饰者模式,可以让我们灵活地扩展对象的功能,同时保持代码的可读性和可维护性...
装饰器(Decorator)模式 装饰器(Decorator)模式是一种典型的结构型模式,主要用意是动态地为对象添加一些额外的功能。它提供了一个灵活的替代方案来继承子类,以扩展对象的功能。 在《Element of Reusable ...
装饰者模式(Decorator Pattern)是一种结构型设计模式,它的定义是在不改变原有对象结构的基础上,动态地给该对象增加一些职责(即增加其额外功能)。这种模式允许向一个现有的对象添加新的功能,同时又不改变其...
装饰模式(Decorator)是软件设计领域中一种非常实用的结构型设计模式,它允许我们向一个对象添加新的行为或责任,而无需修改该对象的源代码。在C++编程语言中,装饰模式常用于动态地扩展类的功能,使得类的行为在...
装饰者模式是软件设计中的一种行为模式,它允许在运行时动态地给对象添加新的行为或职责,而无需改变对象的原始类。这种模式在不违反开闭原则的前提下,提供了扩展对象功能的能力,使得系统更加灵活,易于维护。 在...
装饰者模式是面向对象设计模式的一种,主要用于动态地给一个对象添加一些额外的职责,而不会改变该对象的类。这种模式允许我们独立于对象的类来扩展其功能,为对象增加新的行为或属性,同时保持了代码的可读性和可...
装饰模式(Decorator Pattern)是一种结构型设计模式,允许在不改变对象接口的情况下,动态地为对象添加额外的职责或功能。装饰模式通常用于需要扩展对象功能而又不希望使用子类化的场景。 装饰模式的组成 组件接口...