23.装饰者模式

简介

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

角色和责任

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

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.装饰者模式)