装饰模式主要是为了扩展被装饰类的功能,而且是动态的.装饰类中需要注入被装饰对象,且装饰类和被装饰类都需要实现同一个接口.
装饰模式步骤如下:
- 编写一个类,实现与被装饰的类相同的接口,目的是使他们有相同的行为
- 定义一个实例变量,引用被装饰对象,目的和原来的老对象进行交接
- 定义构造方法,把被装饰对象注入进来(也可以使用其他方式注入)
- 对于不需要改写的方法,调用被装饰对象的.
- 对于要改写的方法,改写即可
装饰类和被装饰类实现同一个接口
package design.decorator;
/**
* 装饰类和被装饰的类都会实现这个接口
*
* @author Minhellic
*
*/
public interface Sourcable {
/**
* 演示在装饰类中重写这个方法
*/
public void method_1();
/**
* 演示在装饰类中直接调用被装饰类的方法
*/
public void method_2();
}
被装饰的类
package design.decorator;
/**
* 被装饰的类
* @author Minhellic
*
*/
public class Source implements Sourcable {
@Override
public void method_1() {
System.out.println("Source.method_1 ...");
}
@Override
public void method_2() {
System.out.println("Source.method_2 ...");
}
}
装饰类
package design.decorator;
/**
* 装饰类,实现和被装饰类同样的接口
* 改写需要改写的方法,对于不需要改写的方法,直接调用注入的被包装类的方法
* @author Minhellic
*
*/
public class Decorator implements Sourcable {
//定义被包装类的实例,以便调用其中的方法
private Source source;
//通过构造方法将被包装类注入进装饰类
public Decorator(Source source) {
this.source = source;
}
/**
* 在装饰类中,改写这个方法
*/
@Override
public void method_1() {
System.out.println("Decorator.method_1 ...");
}
/**
* 在装饰类中,调用被装饰类的方法
*/
@Override
public void method_2() {
source.method_2();
}
}
测试类
package design.test;
import design.decorator.Decorator;
import design.decorator.Sourcable;
import design.decorator.Source;
public class Test {
public static void main(String[] args) {
/*
* 创建接口的实例对象时,使用的是装饰类的实例,
* 使用构造方法将被装饰类注入进去
*/
Sourcable decorator = new Decorator(new Source());
decorator.method_1();
decorator.method_2();
}
}