装饰模式是常见的Java设计模式之一,用途非常的广,下面我就重点详解装饰模式的实现与使用@mikechen
装饰模式定义
装饰模式(Decorator Pattern)是一种结构型设计模式,它允许在不改变对象的基本结构的情况下,动态地给一个对象添加新的功能。
装饰模式使用场景
装饰模式通常适用于以下场景:
- 在不改变已有代码的情况下,动态地为对象增加新的功能,避免修改原有代码带来的风险。
- 需要扩展一个类的功能,但是使用继承会导致类的数目增加,不利于代码的维护。
- 需要动态地给一个对象增加一些额外的职责,而且这些职责可以被动态地撤销,例如在运行时动态地给一个窗口控件增加边框、滚动条等功能。
装饰模式实现
装饰模式的实现,包含以下角色:
1.抽象组件(Component)
定义被装饰对象的接口,可以是一个抽象类或接口。
2.具体组件(Concrete Component)
实现抽象组件接口,即被装饰的对象。
3.抽象装饰器(Decorator)
继承自抽象组件,包含一个指向抽象组件的引用,以及一个实现抽象组件接口的方法。
4.具体装饰器(Concrete Decorator)
继承自抽象装饰器,实现自己的装饰逻辑,并在必要的时候调用被装饰对象的方法。
5.客户端(Client)
创建被装饰对象,并通过一系列装饰器来对被装饰对象进行装饰。
装饰模式使用实例
下面是一个装饰模式的示例代码:
// 抽象组件 interface Component { void operation(); } // 具体组件 class ConcreteComponent implements Component { @Override public void operation() { System.out.println("ConcreteComponent operation"); } } // 抽象装饰类 abstract class Decorator implements Component { protected Component component; public Decorator(Component component) { this.component = component; } public void operation() { component.operation(); } } // 具体装饰类A class ConcreteDecoratorA extends Decorator { public ConcreteDecoratorA(Component component) { super(component); } public void operation() { super.operation(); System.out.println("ConcreteDecoratorA operation"); } } // 具体装饰类B class ConcreteDecoratorB extends Decorator { public ConcreteDecoratorB(Component component) { super(component); } public void operation() { super.operation(); System.out.println("ConcreteDecoratorB operation"); } } // 客户端 public class Client { public static void main(String[] args) { Component component = new ConcreteComponent(); component = new ConcreteDecoratorA(component); component = new ConcreteDecoratorB(component); component.operation(); } }
在上述示例代码中:
- 抽象组件 Component 定义了被装饰对象的接口;
- 具体组件 ConcreteComponent 是被装饰的对象;
- 抽象装饰类 Decorator 是所有具体装饰类的基类,定义了一个组件对象的引用,并实现了抽象组件的接口;
- 具体装饰类 ConcreteDecoratorA 和 ConcreteDecoratorB 继承自抽象装饰类 Decorator,并实现了自己的装饰功能。
以上就是装饰模式详解,更多设计模式请查看:Java设计模式:23种设计模式(万字图文全面总结)
陈睿mikechen
十余年BAT架构经验,资深技术专家,就职于阿里、淘宝、百度等一线互联网大厂。
关注「mikechen」公众号,获取更多技术干货!
后台回复【面试】即可获取《史上最全阿里Java面试题总结》,后台回复【架构】,即可获取《阿里架构师进阶专题全部合集》