设计模式:装饰模式

概念

动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生存子类更为灵活。
使用装饰模式时,将上一步装饰地结果作为参数传入到下一步地装饰中。

代码

要装饰的对象

public  class SunWukong {
    public  void show(){
    }
}

抽象的装饰类

public abstract class Finery extends SunWukong {
    protected SunWukong sunWukong;

    public void decorate(SunWukong sunWukong){
        this.sunWukong = sunWukong;
    }

    @Override
    public void show() {
        if (this.sunWukong != null) {
            this.sunWukong.show();
        }
    }
}

具体的装饰类一

public class HupiSkirt extends Finery {
    @Override
    public void show() {
        this.sunWukong.show();
        System.out.println("穿上了虎皮裙");
    }
}

具体的装饰类二

public class JinguStick extends Finery {

    @Override
    public void show() {
        sunWukong.show();
        System.out.println("拿起了金箍棒");
    }
}

具体的装饰类三

public class ZijinCrown extends Finery {
      @Override
    public void show() {
        sunWukong.show();
        System.out.println("戴上了紫金冠");
    }
}

开始装饰

public class Client  {
    public static void main(String[] args) {
        SunWukong sunWukong = new SunWukong();

        HupiSkirt hupiSkirt = new HupiSkirt();
        JinguStick jinguStick = new JinguStick();
        ZijinCrown zijinCrown = new ZijinCrown();

        System.out.println("+++++穿戴一+++++");
        hupiSkirt.decorate(sunWukong);
        jinguStick.decorate(hupiSkirt);
        zijinCrown.decorate(jinguStick);
        zijinCrown.show();

        System.out.println("+++++穿戴二+++++");
        zijinCrown.decorate(sunWukong);
        hupiSkirt.decorate(zijinCrown);
        jinguStick.decorate(hupiSkirt);
        jinguStick.show();
    }
}
//        +++++穿戴一+++++
//        穿上了虎皮裙
//        拿起了金箍棒
//        戴上了紫金冠
//        +++++穿戴一+++++
//        戴上了紫金冠
//        穿上了虎皮裙
//        拿起了金箍棒

特点

使用装饰模式装饰对象时,不需要事先知道装饰的顺序,因此可以动态地装饰对象。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值