针对问题:在两个集合中的对象期望做到任意组合,而这样的组合的可能性是太多了,在实现起来无疑会导致类爆炸。所以必须有一种方法在运行时动态的创建出我期望的类型,有这样的一种解决方案可以做到:让两个集合的对象(装饰者、被装饰者)实现同一接口,也就是说让装饰者、被装饰者属于同一类型,并且在装饰者中组合这一接口,这样装饰者就可以组合(装饰)任意的被装饰者,更重要的是装饰完成之后的类型又可以作为被装饰者来被装饰,然后就可以一直这样循环装饰下去,用这样类似递归的形式就可以在运行时动态的组合出任意我想要的类型了。
装饰者模式结构图:
装饰者模式实现代码:
/**
* 装饰、被装饰的抽象
* @author bruce
*
*/
public abstract class Component {
public void operation(){};
}
/**
* 装饰者抽象(区分主体)
* @author bruce
*
*/
public abstract class Decorator extends Component{
}
/**
* 主体(被装饰)
* @author bruce
*
*/
public class ConcreteComponent extends Component{
@Override
public void operation() {
// TODO Auto-generated method stub
System.out.println("主体");
}
}
/**
* 装饰者A
* @author bruce
*
*/
public class ConcreteDecoratorA extends Decorator{
/**
* 组合接口
*/
private Component component;
public ConcreteDecoratorA(Component component){
this.component=component;
}
@Override
public void operation() {
System.out.println("为主体装饰A功能");
component.operation();
}
}
/**
* 装饰者B
* @author bruce
*
*/
public class ConcreteDecoratorB extends Decorator{
/**
* 组合接口
*/
private Component component;
public ConcreteDecoratorB(Component component){
this.component=component;
}
@Override
public void operation() {
System.out.println("为主体装饰B功能");
component.operation();
}
}
/**
* 测试
* @author bruce
*
*/
public class Client {
public static void main(String[] args) {
Component component=new ConcreteComponent();//创建主体
Component decoratorA=new ConcreteDecoratorA(component);//创建装饰者A,并装饰主体
System.out.println("----------");
decoratorA.operation();
Component decoratorB=new ConcreteDecoratorB(component);//创建装饰者B,并装饰主体
System.out.println("----------");
decoratorB.operation();
decoratorB=new ConcreteDecoratorB(decoratorA);//创建装饰者B,并装饰decoratorA
System.out.println("----------");
decoratorB.operation();
/**
* output:
* ----------
为主体装饰A功能
主体
----------
为主体装饰B功能
主体
----------
为主体装饰B功能
为主体装饰A功能
主体
*/
}
}
- 大小: 120 KB
分享到:
相关推荐
扩展系统功能——装饰模式(三) 扩展系统功能——装饰模式(四) 外观模式-Facade Pattern 深入浅出外观模式(一) 深入浅出外观模式(二) 深入浅出外观模式(三) 享元模式-Flyweight Pattern 实现对象的复用——...
在这个名为"Designpattern.zip"的压缩包中,我们聚焦于Java编程语言中的一个关键设计模式——工厂模式。这个模式属于创建型模式,它提供了一种创建对象的最佳方式,旨在简化对象的创建过程,并提高代码的可读性和可...
装饰模式的核心在于抽象装饰类的设计,其典型代码如下所示://维持一个对抽象构件对象的引用public Decorator(Component component
《Head First Design Patterns》是设计模式领域的一本经典著作,以其独特的教学方式——结合生动的插图和幽默易懂的实例,深入浅出地解析了23种经典的GoF设计模式。这本书旨在帮助读者理解并掌握如何在实际的面向...
《设计模式:可复用面向对象软件的基础》是Gang of Four(GoF)四位作者——Erich Gamma、Richard Helm、Ralph Johnson和John Vlissides合著的一本经典书籍,它在软件工程领域具有深远影响。这本书系统地介绍了23种...
为了帮助 .NET 开发者更好地理解和应用这些设计模式,《Head First 设计模式》为 .NET 2.0 特别推出了一个配套文档——《设计模式框架》(Design Pattern FrameworkTM),该文档涵盖了原书中介绍的所有设计模式,并...
通过阅读GOF23种设计模式.docx文档和探索DesignPattern项目中的代码,你可以深入理解每种模式的用途、优点以及如何在C#和.NET Core环境中实现它们。对于想要提升编程技能和代码质量的开发者来说,这是一个宝贵的资源...
虽然对于初学者来说,面对英文资料可能会感到困难,但“Design Pattern In C# (英文).pdf”这本书为读者提供了23种经典设计模式的详细解释,包括了它们的概念、实现方式以及在C#中的应用实例。尽管阅读时可能会遇到...
2. 结构型模式:这类模式主要关注如何将类或对象组合成更大的结构,如适配器模式(Adapter)、桥接模式(Bridge)、装饰模式(Decorator)、外观模式(Facade)、享元模式(Flyweight)、组合模式(Composite)和...
就增加功能而言,装饰模式相比生成子类更为灵活。 #### 3.5 外观模式 外观模式为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。 #### 3.6 享元模式 ...
本压缩包"design-pattern(设计模式,包括创建型、结构型、行为型三大类共23种常见的设计模式和J2EE常见设计模式等).zip"提供了全面的设计模式学习资源,适用于初学者和有经验的开发者,帮助他们提升软件设计能力。...
- 装饰模式:动态地给一个对象添加一些额外的职责,可以增加或修改其功能。 - 外观模式:为子系统提供一个统一的接口,使得子系统更容易使用。 - 代理模式:为其他对象提供一种代理以控制对这个对象的访问。 3. ...
**设计模式**(Design Patterns)是软件工程中的一个重要概念,它是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。本章节将从多个角度对设计模式进行深入探讨。 #### 二、设计模式的基本定义 ...
- 装饰模式(Decorator):动态地给一个对象添加一些额外的职责,增加功能而不改变其结构。 - 享元模式(Flyweight):使用共享对象,有效地支持大量细粒度的对象。 3. **行为型模式**: - 责任链模式(Chain of...
#### 第3章:装饰对象——装饰者模式 装饰者模式允许在不修改原始类的情况下向对象添加新的功能。通过使用装饰者模式,可以在运行时动态地增加对象的功能,而不是通过继承机制来扩展类的行为。这为程序带来了更高的...