美文网首页
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.装饰者模式

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