装饰模式基本含义是:能够动态的为一个对象添加一些额外的功能。
在面向对象的世界里,对于为一个对象添加一些额外的功能,我们很自然的会想到一个面向对象的重要特征:继承,通过使用 继承我们可以获得:对父类的方法进行覆盖 对子类添加新的方法
既然使用继承有这么多的好处,那我们为什么还要费力搞出一个装饰模式呢?
因为继承这种语法特性是在编译期就“额外添加” 的功能确定好了的,这就决定了继承这种方式注定是静态的,无法满足我们在运行期添加新功能的欲望。而且随着我们要获取的 功能的增多,子类急剧膨胀;另一方面,java的单继承规则也限定了继承这种方式的灵活性。
为了解决这种为了动态添加对象额外的行为职责而过度地依赖继承来进行行为扩展---装饰(Decorator)模式横空出世...
装饰模式中涉及的角色:
1.原始接口:Component
2.默认的目标实现类:TagartComponent---对原始接口的默认实现 在装饰模式中 是有待进行装饰的类,其中operate方法被作为有待扩展的方法
3.装饰实现类:ComponentDecorator---与默认实现类同样实现了原始接口,装饰实现类既可以是抽象类也可以是具体的实现类,其内部封装了一个 目标实现类的对象作为其内部变量 具体装饰实现类:ComponentDecoratorA,ComponentDecoratorB:继承装饰实现类,我们可以在这些具体的装饰实现类内部通过装饰实现类 的默认目标实现类的对象invoke TagartComponent.operate()。然后对其行为职责进行装饰, 也可以添加addBehavior进行新添行为职责。
自此,我们可以总结出要实现装饰模式的基本条件: 默认目标实现类与装饰实现类共同实现了原始接口 装饰实现类或其子类中持有默认目标实现类的引用
使用装饰模式的最大好处就是:可以在运行期对对象进行行为职责扩展,而且对于扩展非常方便
对于装饰模式的应用也是屡见不鲜,像
HttpServletRequest HttpServletRequestWrapper HttpServletResponse HttpServletResponseWrapper
此处不表...
我心目中目前我觉得将装饰模式实践的最好的是:
/** * Wraps an XWork type conversion class for as an OGNL TypeConverter */ public class OgnlTypeConverterWrapper implements ognl.TypeConverter { private TypeConverter typeConverter;//注意这里并不是ognl.TypeConverter public OgnlTypeConverterWrapper(TypeConverter conv) { if (conv == null) { throw new IllegalArgumentException("Wrapped type converter cannot be null"); } this.typeConverter = conv; } public Object convertValue(Map context, Object target, Member member, String propertyName, Object value, Class toType) { return typeConverter.convertValue(context, target, member, propertyName, value, toType); } public TypeConverter getTarget() { return typeConverter; } }
By the way:这里的原始接口和装饰实现类持有的引用并不以同一个Class Type,
一个是com.opensymphony.xwork2.conversion.TypeConverter。
一个是 ognl.TypeConverter。
struts2在引入Ognl时,在TypeConverter扩展方面做的非常巧妙。 Struts2并没有使用Ognl本身的ognl.TypeConverter接口作为其原始接口,而是自己搞了一个与ognl.TypeConverter拥有相同方法的接口: com.opensymphony.xwork2.conversion.TypeConverter。
这样做一方面将XWork的TypeConverter的实现细节很好的屏蔽,另一方面, 将XWork对TypeConverter的扩展实现纳入到XWork容器管理,也有利于XWork自身在装饰器中插入框架提供的用户自定义的TypeConverter 功能扩展。
相关推荐
装饰模式(Decorator Pattern)是一种结构型设计模式,它在不改变原有对象的基础上,通过包裹一个对象并为其添加新的行为或责任,实现对对象功能的扩展。这种模式在软件开发中非常常见,尤其当需要在运行时动态改变...
装饰模式(Decorator)是软件设计领域中一种非常实用的结构型设计模式,它允许我们向一个对象添加新的行为或责任,而无需修改该对象的源代码。在C++编程语言中,装饰模式常用于动态地扩展类的功能,使得类的行为在...
装饰模式(Decorator Pattern)是设计模式中的一种结构型模式,它在不改变原有对象的基础上,通过添加额外的职责来扩展对象的功能。在C#中,装饰模式尤其适用于那些需要动态地增加或减少对象功能的情况,避免了使用...
装饰模式(Decorator Pattern)是一种结构型设计模式,允许在不改变对象接口的情况下,动态地为对象添加额外的职责或功能。装饰模式通常用于需要扩展对象功能而又不希望使用子类化的场景。 装饰模式的组成 组件接口...
装饰模式(Decorator)是软件设计模式中的一种结构型模式,其主要目的是在不改变对象原有类的基础上,通过添加新的行为或职责来扩展对象的功能。这种模式使得代码的扩展性非常优秀,避免了由于频繁地使用继承而导致...
装饰者模式(Decorator)是一种设计模式,用于在运行时动态地给对象添加额外的责任或功能。它是结构型设计模式的一种,能将行为的增加与对象的创建分离,使得我们可以独立地扩展对象的功能。 在Java或其他面向对象...
装饰模式(Decorator Pattern)是设计模式中的一种结构型模式,它允许在运行时给对象添加新的行为或职责,而无需改变对象的类。在Java中,装饰模式通常通过继承和组合来实现,使得代码具有更好的扩展性和灵活性。...
装饰者模式(Decorator Pattern)是结构型设计模式之一,它允许在运行时向对象添加新的行为或职责,而无需修改对象的源代码。这个模式的名字来源于装饰艺术,它通过添加额外的装饰来增强一个物体的外观,同样地,...
装饰器模式的核心思想是通过将一个类包装在一个与之具有相同接口的类中来扩展其功能。这样做的好处是,它保持了原始类的接口不变,不会破坏类的封装性,同时也避免了使用继承带来的类膨胀问题。装饰器模式可以动态地...
装饰器模式(Decorator Pattern)是一种结构型设计模式,主要用于在运行时动态地给对象添加新的...尽管装饰器模式在某些情况下可能会增加实现的复杂性,但其带来的灵活性和扩展性是其成为设计模式重要成员的原因之一。
装饰模式(Decorator Pattern)是一种结构型设计模式,它允许你向一个现有的对象添加新的功能,同时又不改变其结构。装饰模式通过创建一个装饰类,该类包装了原始类的实例,并在调用原始类方法之前或之后添加额外的...
【Decorator模式】是一种设计模式,它允许在运行时动态地给对象...在实际的软件开发中,Decorator模式同样适用于那些需要动态增减功能的对象,例如在UI设计中添加装饰元素,或者在数据库连接池中添加不同的连接策略等。
Decorator模式,也称为装饰模式,是设计模式中的一个重要组成部分,它在不改变原有对象接口的前提下,动态地给对象添加新的功能,从而扩展了对象的能力。这篇博客()将深入探讨这个模式的细节。 装饰模式的核心...
装饰器(Decorator)模式 装饰器(Decorator)模式是一种典型的结构型模式,主要用意是动态地为对象添加一些额外的功能。它提供了一个灵活的替代方案来继承子类,以扩展对象的功能。 在《Element of Reusable ...
在C#中,装饰模式是通过创建一个包装类(Decorator),该包装类实现了与被装饰对象相同的接口,并持有被装饰对象的引用,从而在不改变原有对象的基础上增加功能。 在C#中,装饰模式通常涉及到以下几个关键组件: 1....
装饰模式是一种设计模式,属于结构型模式,其主要目的是在不改变对象本身的基础上,通过向对象添加新的行为或属性来扩展其功能。这种模式遵循“开闭原则”,即对扩展开放,对修改关闭。 在装饰模式中,有四个关键...
装饰者模式是软件设计中的一种行为模式,它允许在运行时动态地给对象添加新的行为或职责,而无需改变对象的原始类。这种模式在不违反开闭原则的前提下,提供了扩展对象功能的能力,使得系统更加灵活,易于维护。 在...