一、装饰器模式介绍
①定义:
装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。
②使用场景
- 扩展一个类的功能。
- 动态增加功能,动态撤销。
③优缺点
- 优点:饰类和被装饰类可以独立发展,不会相互耦合,装饰模式是继承的一个替代模式,装饰模式可以动态扩展一个实现类的功能。
- 缺点:多层装饰比较复杂。
④小结
- 装饰模式用于动态地给一个对象增加一些额外的职责,是一种对象结构型模式。
- 装饰模式包含四个角色。
- 比生成子类实现更为灵活。
- 装饰模式可分为透明装饰模式和半透明装饰模式。
二、代码示例
public interface Apple {
/**
* 描述
*/
void res();
}
public class ConcreteApple implements Apple {
@Override
public void res() {
System.out.println("普通的苹果");
}
}
public abstract class Decorator implements Apple {
protected Apple apple;
public Decorator(Apple apple) {
super();
this.apple = apple;
}
@Override
public void res() {
apple.res();
}
}
public class ConcreteDecoratorA extends Decorator{
public ConcreteDecoratorA(Apple apple) {
super(apple);
}
public void resA(){
System.out.println("被装饰器A扩展的功能");
}
@Override
public void res(){
System.out.println("装饰器A=>装饰成红色的");
super.res();
System.out.println("装饰器A=>装饰结束");
}
}
public class ConcreteDecoratorB extends Decorator{
public ConcreteDecoratorB(Apple apple) {
super(apple);
}
public void resB(){
System.out.println("被装饰器B扩展的功能");
}
@Override
public void res(){
System.out.println("装饰器B=>装饰成绿色的");
super.res();
System.out.println("装饰器B=>装饰结束");
}
}
public class Main {
public static void main(String[] args) {
Apple apple =new ConcreteApple();
System.out.println("-----------未装饰-------------------\n");
apple.res();//原来的方法
System.out.println("------------------------------------\n");
test2(apple) ;
}
private static void test2(Apple apple){
ConcreteDecoratorB decoratorB = new ConcreteDecoratorB(apple);
System.out.println("\n-----------装饰后-------------------\n");
decoratorB.res();
System.out.println("------------------------------");
}
}