/*
* 装饰模式
* 优点
* 装饰类和被装饰类可以独立发展,而不会相互耦合
* 装饰模式是继承关系的一个替代方案
* 装饰模式可以动态地扩展一个实现类的功
* 缺点
* 装饰越多越复杂
*/
public class MyMain {
public static void main(String[] args) {
//实例一个礼物
AbstractGift gift=new Gift();
//为礼物包装蓝色装饰
gift=new BlueDecorator(gift);
//为礼物包装黑色装饰
gift=new BlackDecorator(gift);
//为礼物包装红色装饰
gift=new RedDecorator(gift);
//展示礼物
gift.show();
}
}
//定义一个抽象的礼物(抽象构件)
abstract class AbstractGift{
//定义一个抽象的方法展示礼物
abstract void show();
}
//具体的礼物(具体构件:被装饰核心)
class Gift extends AbstractGift{
@Override
void show() {
System.out.println("礼物");
}
}
//定义一个抽象的礼物装饰(装饰角色)
abstract class AbstractDecorator extends AbstractGift{
//被装饰的礼物
private AbstractGift gift;
public AbstractDecorator(AbstractGift gift) {
this.gift=gift;
}
//展示礼物
@Override
public void show() {
gift.show();
}
}
//一个具体的蓝色礼物装饰(具体装饰角色)
class BlueDecorator extends AbstractDecorator{
public BlueDecorator(AbstractGift gift) {
super(gift);
}
//展示装饰
private void showDecorator() {
System.out.println("蓝色装饰的");
}
@Override
public void show() {
showDecorator();
super.show();
}
}
//一个具体的红色礼物装饰(具体装饰角色)
class RedDecorator extends AbstractDecorator{
public RedDecorator(AbstractGift gift) {
super(gift);
}
//展示装饰
private void showDecorator() {
System.out.println("红色装饰的");
}
@Override
public void show() {
showDecorator();
super.show();
}
}
//一个具体的黑色礼物装饰(具体装饰角色)
class BlackDecorator extends AbstractDecorator{
public BlackDecorator(AbstractGift gift) {
super(gift);
}
//展示装饰
private void showDecorator() {
System.out.println("黑色装饰的");
}
@Override
public void show() {
showDecorator();
super.show();
}
}