zoukankan      html  css  js  c++  java
  • 《设计模式》之装饰器模式

    装饰器模式

    装饰器模式中主要有两个角色:

    • 装饰器(夹克,帽子)
    • 被装饰的对象(老王)

    装饰器和被装饰的对象有两个特点,也是装饰器模式的关键:

    • 他们实现同一个接口
    • 装饰器中使用了被装饰的对象

    使用:

    /**
     * <p>
     *定义一个接口
     * </p>
     *
     * @author aodeng-低调小熊猫
     * @since 19-7-11
     */
    public interface Person {
        /**
         * 计算累计消费
         * @return
         */
        public Double cost();
    
        /**
         * 输出信息
         */
        public void show();
    }
    
    /**
     * <p>
     *老王( 被装饰的对象 )实现定义的接口
     * </p>
     *
     * @author aodeng-低调小熊猫
     * @since 19-7-11
     */
    public class LaoWang implements Person{
        @Override
        public Double cost() {
            //没消费,消费为0
            return 0.0;
        }
    
        @Override
        public void show() {
            System.out.println("老王我现在消费"+this.cost());
        }
    }
    
    /**
     * <p>
     *装饰器超类,和被装饰的对象实现同一个接口 Person :
     * </p>
     *
     * @author aodeng-低调小熊猫
     * @since 19-7-11
     */
    public abstract class ClothesDecorator implements Person{
        /**
         * 装饰器中要使用被装饰器的对象,构造方法中传入
         */
        protected Person person;
    
        public ClothesDecorator(Person person){
            this.person=person;
        }
    }
    
    /**
     * <p>
     *具体的装饰,夹克
     * </p>
     *
     * @author aodeng-低调小熊猫
     * @since 19-7-11
     */
    public class Jacket extends ClothesDecorator{
    
        public Jacket(Person person){
            /**
             * super 指向自己超(父)类
             */
            super(person);
        }
        @Override
        public Double cost() {
            //消费一件夹克
            return person.cost()+100;
        }
    
        @Override
        public void show() {
            person.show();
            System.out.println("老王我现在又消费了一件夹克100,累计用了"+this.cost());
        }
    }
    
    /**
     * <p>
     *具体的装饰,帽子
     * </p>
     *
     * @author aodeng-低调小熊猫
     * @since 19-7-11
     */
    public class Hat extends ClothesDecorator{
    
        public Hat(Person person){
            //指向自己超(父)类
            super(person);
        }
    
        @Override
        public Double cost() {
            return person.cost()+200;
        }
    
        @Override
        public void show() {
            person.show();
            System.out.println("老王我现在又消费了一件帽子200,累计用了"+this.cost());
        }
    }
    

    测试

    /**
     * <p>
     *程序入口
     * </p>
     *
     * @author aodeng-低调小熊猫
     * @since 19-7-11
     */
    public class LearnMain {
        public static void main(String[] args) {
            //创建一个老王
            Person laoWang=new LaoWang();
            //老王买了一件夹克
            laoWang=new Jacket(laoWang);
            //老王买了一个帽子
            laoWang=new Hat(laoWang);
            laoWang.show();
    /*
            控制台输出:
            老王我现在消费0.0
            老王我现在又消费了一件夹克100,累计用了100.0
            老王我现在又消费了一件帽子200,累计用了300.0*/
        }
    }
    

    源码

    源码地址:https://github.com/java-aodeng/hope

    本文由低调小熊猫一文多发操作发布! 欢迎关注公众号:低调小熊猫

  • 相关阅读:
    Android RSS阅读器
    X86汇编语言学习教程之1 ————前言
    beanstalk源码剖析——概述
    从软件质量看如何写代码(1)
    软件开发模型
    软件质量思考
    数据结构概述
    Don't Distract New Programmers with OOP(转)
    Linus Torvalds’s Lessons on Software Development Management(转)
    谈测试驱动开发
  • 原文地址:https://www.cnblogs.com/aodeng/p/11777220.html
Copyright © 2011-2022 走看看