美文网首页
23.装饰者模式

23.装饰者模式

作者: 测试员 | 来源:发表于2019-12-22 17:37 被阅读0次

简介

通过对客户端透明的方式来扩展对象的功能,是继承关系的一个替换方案。
使用对象的关联关系代替继承关系,更加灵活,同事避免了类型体系的快速膨胀。
通过创建一个包装对象,在不改变原有类的情况下,动态的为一个对象增加新的功能。

角色和责任

抽象组件角色
一个抽象接口,是被装饰类和装饰类的父接口。
具体组件角色
抽象组件的实现类。
抽象装饰角色
包含一个组件的引用,并定义了与抽象组件一直的接口。
具体装饰角色
抽象装饰角色的实现类,负责具体的装饰。

UML

image.png

代码实现

package com.yuan.dp.decorator;

/**
 * 制作蛋糕的接口
 */
public interface MakeCake {
    /**
     * 制作蛋糕的方法
     */
    void make();
}

/**
 * 父类:蛋糕_抽象类
 */
abstract class 蛋糕 implements MakeCake {
    /**
     * 制作蛋糕的方法
     */
    @Override
    public void make(){
        System.out.println("制作普通蛋糕");
    }
}

/**
 * 子类:巧克力蛋糕_普通类
 */
class 巧克力蛋糕 extends 蛋糕 {
    /**
     * 制作 巧克力 蛋糕
     */
    @Override
    public void make() {
        System.out.println("制作 巧乐力 蛋糕");
    }
}

/**
 * 子类:草莓蛋糕_普通类
 */
class 草莓蛋糕 extends 蛋糕 {
    /**
     * 制作 草莓 蛋糕
     */
    @Override
    public void make() {
        System.out.println("制作 草莓 蛋糕");
    }
}

/**
 * 子类:抹茶蛋糕_普通类
 */
class 抹茶蛋糕 extends 蛋糕 {
    /**
     * 制作 抹茶 蛋糕
     */
    @Override
    public void make() {
        System.out.println("制作 抹茶 蛋糕");
    }
}

/**
 * 修饰类的父类
 * 修饰类:蛋糕的修饰类_普通类【核心】
 * 核心:是你还有你,一切拜托你!
 */
class 蛋糕的修饰类 implements MakeCake {

    MakeCake makeCake;

    public 蛋糕的修饰类(MakeCake makeCake) {
        this.makeCake = makeCake;
    }

    @Override
    public void make() {
        makeCake.make();
        //如果这个方法没有被覆盖的话会出现这话【是不可能出现的,正常情况下】
        System.out.println("这个方法没有被增强");
    }
}

/**
 * 修饰类的子类
 * 增强:蛋糕中藏个口红
 */
class 口红蛋糕 extends 蛋糕的修饰类{


    public 口红蛋糕(MakeCake makeCake) {
        super(makeCake);
        make();
    }
    @Override
    public void make() {
        makeCake.make();
        System.out.println("并且偷偷塞进去一支 口红 ");
    }
}/**
 * 修饰类的子类
 * 增强:蛋糕中藏个钻戒
 */
class 钻戒蛋糕 extends 蛋糕的修饰类{


    public 钻戒蛋糕(MakeCake makeCake) {
        super(makeCake);

    }
    @Override
    public void make() {
        makeCake.make();
        System.out.println("并且偷偷塞进去一枚 钻戒 ");
    }
}

/**
 * 修饰类的子类
 * 增强:蛋糕中藏个卡片
 */
class 卡片蛋糕 extends 蛋糕的修饰类{


    public 卡片蛋糕(MakeCake makeCake) {
        super(makeCake);
        make();
    }
    @Override
    public void make() {
        makeCake.make();
        System.out.println("并且偷偷塞进去一支 卡片 ");
    }
}


测试类

package com.yuan.dp.decorator;

public class DecoratorTest {
    public static void main(String[] args) {
//        买一个巧克力蛋糕
        蛋糕 cake = new 巧克力蛋糕();
        cake.make();
        System.out.println("------------------");
//        买一个巧克力钻戒蛋糕
        钻戒蛋糕 exCake = new 钻戒蛋糕(cake);
        exCake.make();
        System.out.println("------------------");

//        制作 巧乐力 蛋糕
//        ------------------
//        制作 巧乐力 蛋糕
//        并且偷偷塞进去一枚 钻戒
//        ------------------

    }
}

案例与IO流对比

image.png image.png

相关文章

  • 23.装饰者模式

    简介 通过对客户端透明的方式来扩展对象的功能,是继承关系的一个替换方案。使用对象的关联关系代替继承关系,更加灵活,...

  • 如何利用装饰者模式在不改变原有对象的基础上扩展功能

    目录 什么是装饰者模式 普通示例 装饰者模式示例 类图关系 装饰者模式使用场景 装饰者模式优点 装饰者模式缺点 什...

  • 装饰者模式

    装饰者模式 装饰者模式和适配器模式对比 装饰者模式 是一种特别的适配器模式 装饰者与被装饰者都要实现同一个接口,主...

  • java IO 的知识总结

    装饰者模式 因为java的IO是基于装饰者模式设计的,所以要了解掌握IO 必须要先清楚什么事装饰者模式(装饰者模式...

  • 设计模式-装饰者模式

    装饰者模式概念: 装饰者模式又名包装(Wrapper)模式。装饰者模式以对客户端透明的方式扩展对象的功能,是继承关...

  • java - 装饰者模式

    装饰者模式 装饰者模式:动态将责任添加到对象上。如果需要扩展功能,装饰者提供了比继承更有弹性的解决方案。装饰者模式...

  • 设计模式之装饰者模式(Decorator Pattern)

    What: 装饰者模式又名包装(Wrapper)模式。装饰者模式动态地将责任附加到对象身上。若要扩展功能,装饰者提...

  • 装饰者(Decorator)模式

    装饰者(Decorator)模式装饰模式又名包装(Wrapper)模式。装饰模式是继承关系的一个替代方案。装饰模式...

  • 2、装饰者模式

    装饰者模式 一、基本概念 二、结构 三、案例1、装饰者模式案例2、JavaIO中使用装饰者模式 四、总结 一、基本...

  • PHP的设计模式-装饰者模式

    装饰者模式 装饰者模式 装饰者模式类似蛋糕,有草莓味、奶酪等种类,但是它们的核心都是蛋糕。 不断地将对象添加装饰的...

网友评论

      本文标题:23.装饰者模式

      本文链接:https://www.haomeiwen.com/subject/gmvonctx.html