zoukankan      html  css  js  c++  java
  • 装饰者模式——Java设计模式

    装饰模式

    1.概念

    动态地为对象附加上额外的职责
    其目的是包装一个对象,从而可以在运行时动态添加新的职责。每个装饰器都可以包装另一个装饰器,这样理论上来说可以对目标对象进行无限次的装饰。

    2.装饰器类图

    3.代码

    一个早餐店经营两种主食:汉堡和吐司,一段时间后需要加个配料。
    主要思路是:以主食(汉堡、吐司)为主体,然后再运行时以配料(火腿、起司)装饰为主食。其UML图为:

    (1)抽象构建类————Breakfast.java,早餐的抽象父类

    public abstract class Breakfast {
        public String description="未知";
        public String getDescription(){
            return description;
        }
        public abstract Double cost();
    }
    

    (2)抽象装饰类————CondimentDecorator.java,是早餐抽象类的子类

    public abstract class CondimentDecorator extends Breakfast{
        Breakfast myfood;
        public CondimentDecorator(Breakfast myfood){
            this.myfood=myfood;
        }
        @Override
        public String getDescription(){
            return myfood.getDescription();
        }
        @Override
        public Double cost(){
            return myfood.cost();
        }
    }
    

    (3)具体构建类————Toast.java、Burger.java
    Toast.java

    public class Toast extends Breakfast {
        public Toast(){
            description="吐司";
        }
        public Double cost(){
            return 10d;
        }
    }
    

    Burger.java

    public class Burger extends Breakfast {
        public Burger(){
            description="汉堡";
        }
        @Override
        public Double cost(){
            return 15d;
        }
    }
    

    (4)具体装饰类————Cheese.java、Ham.java
    Cheese.java

    public class Cheese extends CondimentDecorator {
        public Cheese(Breakfast myfood) {
            super(myfood);
        }
    
        @Override
        public Double cost() {
            return super.cost() + 5;
        }
    
        @Override
        public String getDescription() {
            return super.getDescription() + ",起司";
        }
    }
    

    Ham.java

    public class Ham extends CondimentDecorator {
        public Ham(Breakfast myfood) {
            super(myfood);
        }
    
        @Override
        public Double cost() {
            return super.cost() + 10;
        }
    
        @Override
        public String getDescription() {
            return super.getDescription() + ",火腿";
        }
    }
    

    (5)客户端测试类

    public class Decorator {
        public static void main(String args[]) {
            Breakfast breakfast1 = new Toast();
            System.out.println("您点的餐点为:" + breakfast1.getDescription() + "。价格为:" + breakfast1.cost());
            Breakfast breakfast2 = new Toast();
            breakfast2 = new Ham(breakfast2);
            breakfast2 = new Ham(breakfast2);
            System.out.println("您点的餐点为:" + breakfast2.getDescription() + "。价格为:" + breakfast2.cost());
            Breakfast breakfast3 = new Burger();
            breakfast3 = new Ham(breakfast3);
            breakfast3 = new Cheese(breakfast3);
            breakfast3 = new Cheese(breakfast3);
            System.out.println("您点的餐点为:" + breakfast3.getDescription() + "。价格为:" + breakfast3.cost());
        }
    }
    

    结果

    您点的餐点为:吐司。价格为:10.0
    您点的餐点为:吐司,火腿,火腿。价格为:30.0
    您点的餐点为:汉堡,火腿,起司,起司。价格为:35.0
    

    详细见:Java设计模式

  • 相关阅读:
    C8051逆向电阻屏:头儿拍脑袋说电阻屏IC好赚钱3块钱成本能卖20几块。,一个月不分昼夜逆向成功后头儿说电阻屏已经被市场淘汰请放弃治疗。
    Google大数据三篇著名论文----中文版
    推荐相关博客
    基于hadoop的电影推荐结果可视化
    爬虫(heritrix框架)
    标准SVD和改进的SVD
    基于矩阵分解的隐因子模型
    SVD奇异值分解的几何物理意义资料汇总
    (大数据工程师学习路径)第五步 MySQL参考手册中文版----MySQL数据库管理
    (大数据工程师学习路径)第五步 MySQL参考手册中文版----MySQL视图
  • 原文地址:https://www.cnblogs.com/w1570631036/p/6830887.html
Copyright © 2011-2022 走看看