根据网易云课堂Java开发课程学习
- 装饰模式介绍
装饰模式以对客户透明的方式动态的给一个对象附加上更多的责任。换言之,客户并不会感到对象在装饰前后有什么不同。装饰模式可以在不使用创造更多子类的情况下,将对象的功能进行扩展(Java中的IO流就是用的这种模式)。
- 装饰模式中的角色:
1. 抽象组件(Componet)角色:给出一个抽象接口,以规范准备接收附加责任的对象。
说白了 定义一个接口
2. 具体组件(ConcreteComponent)角色:定义一个将要接收附加责任的类
实例化这个接口
3. 装饰(Decorator)角色:持有一个(Component)对象的实例,并定义一个与抽象组件一致的接口。
调用接口,实例化一个对象
4. 具体装饰(ConcreteDecorator)角色:负责给组件对象添加附加的功能。
继承Decorator,给对象添加功能。
- 下面是简单的代码演示
- 定义一个接口,接口里面有一个方法。
package com.test.decorate;
public interface Component {
public void doThingA();
}
2.实例化这个接口
package com.test.decorate;
public class ConCreateComponent implements Component {
@Override
public void doThingA() {
System.out.println("do A Thing !");
}
}
3.创建一个装饰类:
package com.test.decorate;
public class Decorator implements Component {
private Component component = null;
public Decorator(Component component) {
this.component = component;
}
@Override
public void doThingA() {
component.doThingA();
}
}
- 添加附加功能
package com.test.decorate;
public class ConCreateDecorator extends Decorator {
public ConCreateDecorator(Component component) {
super(component);
// TODO Auto-generated constructor stub
}
@Override
public void doThingA() {
super.doThingA();
doThingB();
}
private void doThingB() {
System.out.println("do B thing");
}
}
再加一个功能:
package com.test.decorate;
public class ConCreateDecorator1 extends Decorator {
public ConCreateDecorator1(Component component) {
super(component);
// TODO Auto-generated constructor stub
}
@Override
public void doThingA() {
super.doThingA();
doThingC();
}
private void doThingC() {
System.out.println("do C thing");
}
}