博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式梳理——装饰模式
阅读量:4096 次
发布时间:2019-05-25

本文共 2120 字,大约阅读时间需要 7 分钟。

一、概述

       装饰模式(Decorator),动态的给一个对象添加额外的职责,就增加功能来说,装饰模式比生成子类更为灵活。 

二、UML图示

uml

三、编程实现

       该程序主要通过模拟饮料配料的功能实现。

1、饮品抽象类,其他类都继承该类。

public abstract class Drink {    public String name;    public String getDescription(){        return name;    }    public abstract double cost();}

2、饮品实现类

      2.1 咖啡

public class Coffee extends Drink {    public Coffee(){        name = "咖啡";    }    @Override    public double cost() {        return 15;    }}

2.2 茶

public class Tea extends Drink {    public Tea(){        name = "茶";    }    @Override    public double cost() {        return 20;    }}

3、配料抽象类

public abstract class ExtraAddings extends Drink{    public abstract String getDescription();}

4、配料实现类

4.1 加奶

public class Milk extends ExtraAddings {    Drink drink;    public Milk(Drink drink){        this.drink = drink;    }    @Override    public String getDescription() {        return drink.getDescription()+"+牛奶";    }    public double cost(){        return 3+drink.cost();    }}

4.2 加糖

public class Sugar extends ExtraAddings {    Drink drink;    public Sugar(Drink drink){        this.drink = drink;    }    @Override    public String getDescription() {        return drink.getDescription() + "+糖";    }    public double cost(){        return 2 + drink.cost();    }}

5、测试类

public class Test {    public static void main(String[] args) {        Drink drink1 = new Coffee();        Drink drink2 = new Tea();        Drink addMilk = new Milk(drink1);        Drink addSugar = new Sugar(drink1);        Drink addMilk2 = new Milk(drink2);        Drink addSugar2 = new Sugar(drink2);        Drink addAll1 = new Milk(addSugar);        Drink addAll2 = new Sugar(addMilk2);        System.out.println(addMilk.getDescription()+addMilk.cost());        System.out.println(addSugar.getDescription()+addSugar.cost());        System.out.println(addMilk2.getDescription()+addMilk2.cost());        System.out.println(addSugar2.getDescription()+addSugar2.cost());        System.out.println(addAll1.getDescription()+addAll1.cost());        System.out.println(addAll2.getDescription()+addAll2.cost());    }}结果:咖啡+牛奶18.0咖啡+糖17.0茶+牛奶23.0茶+糖22.0咖啡+糖+牛奶20.0茶+牛奶+糖25.0

 

你可能感兴趣的文章
ACfly也是基于FreeRTOS的
查看>>
carzepony也在想往FreeRTOS上迁移
查看>>
我发觉,不管是弄ROS OPENCV T265二次开发 SDK开发 caffe PX4 都是用的C++
查看>>
ROS的安装(包含文字和视频教程,我的ROS安装教程以这篇为准)
查看>>
原来我之前一直用的APM固件....现在很多东西明白了。
查看>>
realsense-ros里里程计相关代码
查看>>
似乎写个ROS功能包并不难,你会订阅话题发布话题,加点逻辑处理,就可以写一些基础的ROS功能包了。
查看>>
我觉得在室内弄无人机开发装个防撞机架还是很有必要的,TBUS就做得很好。
查看>>
serial也是见到很多次了,似乎它就是一种串行通信协议
查看>>
TBUS的一些信息
查看>>
专业和业余的区别就在于你在基础在基本功打磨练习花的时间
查看>>
通过mavlink实现自主航线的过程笔记
查看>>
Ardupilot飞控Mavlink代码学习
查看>>
这些网站有一些嵌入式面试题合集
查看>>
我觉得刷题是有必要的,不然小心实际被问的时候懵逼,我觉得你需要刷个50份面试题。跟考研数学疯狂刷卷子一样!
查看>>
我觉得嵌入式面试三要素:基础吃透+项目+大量刷题,缺一不可。不刷题是不行的。而且得是大量刷,刷出感觉套路,别人做题都做得是固定题型套路条件反射了,你还在那慢慢理解慢慢推是不行的,也是考研的教训。
查看>>
React Native之原理浅析
查看>>
Git操作清单
查看>>
基础算法
查看>>
前端面试
查看>>