【设计模式】-装饰者模式

一 装饰者模式介绍

装饰者模式是指动态的给对象添加一些职责,其重点是动态扩展对象的功能;如下图,雪人组件接口(Snowman)定义了雪人的功能(装饰雪人),装饰类(Decorator)继承雪人的功能,具体的装饰者实现者类(ShoesDecorator,ScarfDecorator等)继承装饰类,并对其功能进行添加扩展;具体的组件类(SmallSnowman)和装饰类一样继承组件接口(Snowman);我们可以用具体的装饰类(ShoesDecorator,ScarfDecorator等)将具体的组件类(SmallSnowman)进行装饰打扮(添加职责);

在这里插入图片描述

二 雪人组件接口(Snowman)

在雪人组件接口中定义了一个雪人的公共方法-------装饰打扮雪人;

public interface Snowman {

    // 装饰雪人
    void decoratorSnowman();
}

三 装饰者(Decorator)

装饰者其实就像给父类进行一层包装;将父类装进了自己的构造器,并且实现了父类的装饰方法,在方法内部调用的是父类的同名方法;

/**
 * @Author lsc
 * @Description <p>装饰雪人 </p>
 * @Date 2019/11/9 20:27
 */
public class Decorator implements Snowman {

    private Snowman snowman;
    // 构造器 将父类装进子类
    public void setSnowman(Snowman snowman){
        this.snowman = snowman;
    }

    @Override
    public void decoratorSnowman() {
        if (snowman!=null){
            // 调用父类装饰方法
            snowman.decoratorSnowman();
        }
    }
}

四 具体的装饰者

具体的装饰者继承装饰者,理论上是可以无限多个具体的装饰者,取决于你对具体组件类的扩展;具体的装饰者实现父类的方法,并且在内部调用父类的同名方法,还可以在实现方法中添加特有的职责;

4.1 围巾装饰者

/**
 * @Author lsc
 * @Description <p> </p>
 * @Date 2019/11/9 21:11
 */
public class ScarfDecorator extends Decorator {

    private String scarf;

    @Override
    public void decoratorSnowman() {
        // 继承父类装饰
        super.decoratorSnowman();
        // 添加职责
        scarf = "红围巾";
        System.out.println(scarf);

    }
}

4.2 鞋子装饰者

/**
 * @Author lsc
 * @Description <p> </p>
 * @Date 2019/11/9 21:16
 */
public class ShoesDecorator extends Decorator {

    private String shoes;

    @Override
    public void decoratorSnowman() {
        // 继承父类职责
        super.decoratorSnowman();
        // 添加新职责
        shoes = "红色高跟鞋";
        System.out.println(shoes);
    }
}

4.3 帽子装饰者

/**
 * @Author lsc
 * @Description <p> 装饰帽子 </p>
 * @Date 2019/11/9 20:43
 */
public class CapDecorator extends Decorator {

    private String cap;

    @Override
    public void decoratorSnowman() {
        // 继承父类职责
        super.decoratorSnowman();
        // 添加新功能
        cap = "大红帽";
        System.out.println(cap);
    }
}

五 具体的组件类

具体的组件类实现组件接口;

/**
 * @Author lsc
 * @Description <p> 雪人具体组件 </p>
 * @Date 2019/11/9 21:19
 */
public class SmallSnowman implements Snowman {

    @Override
    public void decoratorSnowman() {
        // 小雪人的装饰
        System.out.println("我是可爱的小雪人");
    }
}    

六 装饰具体组件

    public static void main(String[] args) {
        // 创建小雪人
        SmallSnowman smallSnowman = new SmallSnowman();
        // 选择需要的帽子装饰
        CapDecorator capDecorator = new CapDecorator();
        // 选择需要的围巾装饰
        ScarfDecorator scarfDecorator = new ScarfDecorator();
        // 选择需要的鞋子装饰
        ShoesDecorator shoesDecorator = new ShoesDecorator();

        // 小雪人套帽子
        capDecorator.setSnowman(smallSnowman);
        // 已经套上帽子的小雪人继续套围巾
        scarfDecorator.setSnowman(capDecorator);
        // 已经套上帽子和围巾的小雪人穿上鞋子
        shoesDecorator.setSnowman(scarfDecorator);
        // 执行装饰
        shoesDecorator.decoratorSnowman();

    }

七 结果分析

执行结果

我是可爱的小雪人
大红帽
红围巾
红色高跟鞋

在进行装饰的时候可以看见是将具体的装饰套在了具体组件类身上;有多少个具体装饰类就可以自由组合多少次套装具体装饰类身上,就等于添加了多少个职责;
在这里插入图片描述

发布了95 篇原创文章 · 获赞 106 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/youku1327/article/details/103106114