装饰者模式

简介: 一.装饰者模式定义:装饰模式是在不改变原类文件和不使用继承的情况下,动态的扩展一个对象的功能。(一个类包裹被增强类)目的:在不改变原文件条件下对类进行增强。优点:1.动态增强 2.不改变原文件,不使用继承 3.可以叠加装饰缺点:使类增多,结构变复杂。


一.装饰者模式

定义:装饰模式是在不改变原类文件不使用继承的情况下,动态的扩展一个对象的功能。(一个类包裹被增强类)

目的:在不改变原文件条件下对类进行增强。

优点:1.动态增强

          2.不改变原文件,不使用继承

          3.可以叠加装饰

缺点:使类增多,结构变复杂。

类图:

image.png

代码:

被增强类接口

1. public interface Component {
2. 
3. void method();
4. 
5. }

被增强类实现

1. public class ConcreteComponent implements Component{
2. 
3. public void method() {
4.         System.out.println("原来的方法");
5.     }
6. 
7. }

增强类抽象类

1. public abstract class Decorator implements Component{
2. 
3. protected Component component;
4. 
5. public Decorator(Component component) {
6. super();
7. this.component = component;
8.     }
9. 
10. public void method() {
11.         component.method();
12.     }
13. 
14. }

增强类实现A

1. public class ConcreteDecoratorA extends Decorator{
2. 
3. public ConcreteDecoratorA(Component component) {
4.         super(component);
5.     }
6. 
7. public void methodA(){
8.         System.out.println("被装饰器A扩展的功能");
9.     }
10. 
11. public void method(){
12.         System.out.println("针对该方法加一层A包装");
13.         super.method();
14.         System.out.println("A包装结束");
15.     }
16. }

增强类实现B

1. public class ConcreteDecoratorB extends Decorator{
2. 
3. public ConcreteDecoratorB(Component component) {
4.         super(component);
5.     }
6. 
7. public void methodB(){
8.         System.out.println("被装饰器B扩展的功能");
9.     }
10. 
11. public void method(){
12.         System.out.println("针对该方法加一层B包装");
13.         super.method();
14.         System.out.println("B包装结束");
15.     }
16. }

调用

1. public class Main {
2. 
3. public static void main(String[] args) {
4.         Component component =new ConcreteComponent();//原来的对象
5.         System.out.println("------------------------------");
6.         component.method();//原来的方法
7.         ConcreteDecoratorA concreteDecoratorA = new ConcreteDecoratorA(component);//装饰成A
8.         System.out.println("------------------------------");
9.         concreteDecoratorA.method();//原来的方法
10.         concreteDecoratorA.methodA();//装饰成A以后新增的方法
11.         ConcreteDecoratorB concreteDecoratorB = new ConcreteDecoratorB(component);//装饰成B
12.         System.out.println("------------------------------");
13.         concreteDecoratorB.method();//原来的方法
14.         concreteDecoratorB.methodB();//装饰成B以后新增的方法
15.         concreteDecoratorB = new ConcreteDecoratorB(concreteDecoratorA);//装饰成A以后再装饰成B
16.         System.out.println("------------------------------");
17.         concreteDecoratorB.method();//原来的方法
18. //调用父类的构造方法时,传入的是concreteDecoratorA的类,所以super.method调用到了concreteDecoratorA中类的method,实现了两次装饰
19.         concreteDecoratorB.methodB();//装饰成B以后新增的方法
20.     }
21. }

结果:

image.png


相关文章
装饰者模式
装饰者模式
89 0
打扮一下(装饰模式)
打扮一下(装饰模式)
86 0
|
前端开发 BI
关于装饰器模式我所知道的
关于装饰器模式我所知道的
89 0
|
设计模式 uml
【结构型模式】二十三天学会设计模式之装饰者模式
【结构型模式】二十三天学会设计模式之装饰者模式
【结构型模式】二十三天学会设计模式之装饰者模式
|
Java
结构型模式-装饰者模式
结构型模式-装饰者模式
97 0
|
Java 数据库连接 数据库
装饰者模式学习笔记
快速学习装饰者模式
108 0
装饰者模式学习笔记
|
缓存 Java 数据库连接
深入理解装饰者模式
深入理解装饰者模式
167 0
深入理解装饰者模式
装饰者模式详解
装饰者模式详解

热门文章

最新文章