Decorator(装饰)
意图:
动态地给 一个对象添加一些额外的职责。就添加功能来说,Decorator模式相比生成子类更为灵活。
类图:
代码:
/**
*
* @ClassName: CheeseCake
* @Description: 蛋糕实现类
* @author 雨ゆこ
* @date 2018年5月1日
* @version yuko1.0
*/
public class CheeseCake extends Cake{
@Override
public void show() {
System.out.println("CheeseCake");
}
}
/**
*
* @ClassName: Cake
* @Description: 抽象蛋糕类
* @author 雨ゆこ
* @date 2018年5月1日
* @version yuko1.0
*/
public abstract class Cake {
public abstract void show();
}
/**
*
* @ClassName: CheeseCake
* @Description: 蛋糕实现类
* @author 雨ゆこ
* @date 2018年5月1日
* @version yuko1.0
*/
public class CheeseCake extends Cake{
@Override
public void show() {
System.out.println("CheeseCake");
}
}
/**
*
* @ClassName: FruitCake
* @Description: 蛋糕实现类
* @author 雨ゆこ
* @date 2018年5月1日
* @version yuko1.0
*/
public class FruitCake extends Cake{
@Override
public void show() {
System.out.println("FruitCake");
}
}
/**
*
* @ClassName: Decorator
* @Description: 蛋糕实现类 蛋糕装饰器
* @author 雨ゆこ
* @date 2018年5月1日
* @version yuko1.0
*/
public abstract class Decorator extends Cake {
Cake cake;
public Decorator(Cake cake) {
this.cake = cake;
}
@Override
public void show() {
cake.show();
funExtends();
}
public abstract void funExtends();
}
/**
*
* @ClassName: WithFlag
* @Description: 蛋糕装饰器实现类
* @author 雨ゆこ
* @date 2018年5月1日
* @version yuko1.0
*/
public class WithFlag extends Decorator{
public WithFlag(Cake cake) {
super(cake);
}
@Override
public void funExtends() {
System.out.println("FunExtends");
}
}
/**
*
* @ClassName: WithFlower
* @Description: 蛋糕装饰器实现类
* @author 雨ゆこ
* @date 2018年5月1日
* @version yuko1.0
*/
public class WithFlower extends Decorator{
public WithFlower(Cake cake) {
super(cake);
}
@Override
public void funExtends() {
System.out.println("WithFlower");
}
}
/**
*
* @ClassName: Yufan
* @Description: 装饰器测试类
* @author 雨ゆこ
* @date 2018年5月1日
* @version yuko1.0
*/
public class Yufan {
public static void main(String[] args) {
Cake c = new WithFlag(new FruitCake());
Cake c1 = new WithFlower(new CheeseCake());
c.show();
c1.show();
}
}
测试结果:
个人理解:
对原来接口的功能进行扩展,添加上新的功能。
装饰器 本身就是该接口的 一个实现。同时需要兼容其他实现,所以提供了一个带参数的构造方法。
在接口的基础上利用抽象来进行扩展。