首页 > 作文

详解Java设计模式中的装饰模式

更新时间:2023-04-04 08:47:21 阅读: 评论:0

目录
一、装饰模式的定义和特点二、装饰模式的结构三、咖啡点单案例演示四、总结

一、装饰模式的定义和特点

在软件开发过程中,有时想用一些现存的组件。这些组件可能只是完成了一些核心功能。但在不改变其结构的情况下,可以动态地扩展其功能。所有这些都可以釆用装饰器模式来实现。

就像我们做菜,需要用到调料,菜,刀,火等一系列抽象的组件来最终完成一道菜。

装饰模式的定义:

指在不改变现有对象结构的情况下,动态地给该对象增加一些职责(即增加其额外功能)的模式,它属于对象结构型模式。就增加功能来说,装饰模式比生成子类更加灵活。

特点:

– 装饰器是继承的有力补充,比继承灵活,在不改变原有对象的情况下,动态的给一个对象扩展功能,即插即用

– 通过使用不用装饰类及这些装饰类的排列组合,可以实现不同效果

– 装饰器模式完全遵守开闭原则

缺点

装饰器模式会增加许多子类,过度使用会增加程序得复杂性。

二、装饰模式的结构

装饰模式的结构一般包含以下几个角色

1. 抽象构件(component)角汉文帝汉景帝色:定义一个抽象接口以规范准备接收附加责任的对象。

2. 具体构件(concretecomponent)角色:实现抽象构件,通过装饰角色为其添加一些职责。

3. 抽象装饰(decorator)角色:继承抽象构件,并包含具体构件的实例,可以通过其子类扩展具体构件的功能。

4. 具体装饰(concretedecorator)角色:实现抽象装饰的相关方法,并给具体构件对象添加附加的责任。

图示

三、咖啡点单案例演示

有一个需求,点一杯咖啡需要咖啡,材料等等,这个案例就很适合装饰模式,类似于穿衣,点餐,买包子,等等,我们怎么把他设计成装饰模式呢?

看类图

这个结构就是我已经设计好的一个装饰模式的类图,idea自动生成的,这里的drink就是我们上面说的抽象构建角色,装饰者是decorator,他是一个抽象装饰,下面他的子类就是具体的装饰者,那么具体构建中间我们提供了一个中间构建,提供了coffee的一些共性,可以放在这里,用的时候直接继承,他的下面就是相应的具体构件,具体被装饰者角色,装饰者与被装饰者共同继承自component抽象构件,需要用到装饰的就是我们点一杯咖啡,用装饰去包裹即可,层层包裹,案例如下:

比如我要点一份加糖加奶的拿铁咖啡

代码实例:

component抽象构件角色:

package com.decoratorpattern.starbucks; /** * @author wang * @version 1.0 * @packagename com.decoratorpattern.starbucks * @classname drink * @date 2021/12/28 10:28 * @description 饮料构件类抽象component */public abstract class drink {    private string description;    private float price = 0.0f;     public string getdescription() {        return description;    }     public void tdes交通事故反思cription(string description) {        this.description = description;    }     public float getprice() {        return price;    }     public void tprice(float price) {        this.price = price;    }     /**     * @date  2021/12/28 10:30     * @param     * @return float     * @metodname cost     * @author wang     * @description 计算花费,订单价格     */    public abstract float cost();}

装饰者类:

package com.decoratorpattern.starbucks; /** * @author wang * @versi物流管理属于什么专业类别on 1.0 * @packagename com.decoratorpattern.starbucks * @classname decorator * @date 2021/12/28 10:40 * @description 装饰者定义类,配料 */public class decorator extends drink {     private drink drink;     /**     * @param drink     * @date 2021/12/28 10:42     * @param     * @return null     * @metodname decorator     * @author wang     * @description 传入一个被装饰者,由装饰者进行装饰     */    public decorator(drink drink) {        this.drink = drink;    }     /**     * @date 2021/12/28 10:43     * @param     * @return float     * @metodname cost     * @author wang     * @description 装饰者的价格加上被装饰者的价格     */    @override    public float cost() {        return super.getprice() + drink.cost();    }     /**     * @date 2021/12/28 10:44     * @param     * @return string     * @metodname getdescription     * @author wang     * @description 输出订单信息,包含装饰者,装饰者的价格,以及被装饰者的信息     */    @override    public string getdescription() {        return drink.getdescription() + "\n加入的材料:" + 个人艺术super.getdescription()                + "\t材料价格:" + super.getprice() ;    }}
package com.decoratorpattern.starbucks; /** * @author wang * @version 1.0 * @packagename com.decoratorpattern.starbucks * @classname coffee * @date 2021/12/28 10:31 * @description 咖啡类 */public class coffee extends drink{    @override    public float cost() {        return super.getprice();    }}

具体构件类:拿铁

package com.decoratorpattern.starbucks; /** * @author wang * @version 1.0 * @packagename com.decoratorpattern.starbucks * @classname latte * @date 2021/12/28 10:32 * @description 拿铁咖啡实类,被装饰者 */public class latte extends coffee{    public latte() {        tdescription("拿铁咖啡");        tprice(15.0f);    }}

具体构件类:摩卡

package com.decoratorpattern.starbucks; /** * @author wang * @version 1.0 * @packagename com.decoratorpattern.starbucks * @classname mocha * @date 2021/12/28 10:36 * @description 摩卡咖啡实类,被装饰者 */public class mocha extends coffee {    public mocha() {        tdescription("摩卡咖啡");        tprice(12.2f);    }}

其他同上,不过多展示

具体装饰类:牛奶

package com.decoratorpattern.starbucks; /** * @author wang * @version 1.0 * @packagename com.decoratorpattern.starbucks * @classname milk * @date 2021/12/28 10:47 * @description 牛奶调味品,具体装饰者 */public class milk extends decorator{     /**     * @param drink     * @date 2021/12/28 10:42     * @param     * @return null     * @metodname decorator     * @author wang     * @description 传入一个被装饰者,由装饰者进行装饰     */    public milk(drink drink) {        super(drink);        tdescription("牛奶");        tprice(1.0f);    }}

具体装饰:糖

package com.decoratorpattern.starbucks; /** * @author wang * @version 1.0 * @packagename com.decoratorpattern.starbucks * @classname sugar * @date 2021/12/28 10:50 * @description 糖,装饰者 */public class sugar extends decorator{    /**     * @param drink     * @date 2021/12/28 10:42     * @param     * @return null     * @metodname decorator     * @author wang     * @description 传入一个被装饰者,由装饰者进行装饰     */    public sugar(drink drink) {        super(drink);        tdescription("糖");        tprice(0.5f);    }}

订单测试代码:

package com.decoratorpattern.starbucks; /** * @author wang * @version 1.0 * @packagename com.decoratorpattern.starbucks * @classname ordertest * @date 2021/12/28 10:51 * @description 前台订单类 */public class ordertest {    public static void main(string[] args) {        //点一份加糖加奶的拿铁咖啡         system.out.println("+++++++没加任何东西+++++++");        drink latte = new latte();        system.out.println("当前总价:" + latte.cost());        system.out.println("coffee:" +latte.getdescription());        //加糖        system.out.println("+++++++加糖后+++++++");        latte = new sugar(latte);        system.out.println("当前总价:" + latte.cost());        system.out.println("coffee:" + latte.getdescription());         system.out.println("+++++++加奶后+++++++");        latte = new milk(latte);        system.out.println("当前总价:" + latte.cost());        system.out.println("coffee:" +latte.getdescrip我要改变自己tion());    }}/** * +++++++没加任何东西+++++++ * 当前总价:15.0 * coffee:拿铁咖啡 * +++++++加糖后+++++++ * 当前总价:15.5 * coffee:拿铁咖啡 * 加入的材料:糖材料价格:0.5 * +++++++加奶后+++++++ * 当前总价:16.5 * coffee:拿铁咖啡 * 加入的材料:糖材料价格:0.5 * 加入的材料:牛奶材料价格:1.0 * * process finished with exit code 0 */

综上, 如果我们需要新的咖啡种类或者是新的调料,只需要新增类去继承coffee或者decorator类即可。

四、总结

装饰模式是为已有的功能动态的添加更多功能的一种方式,当系统需要新功能的时候,向旧的类中添加新的代码,这些新加的代码通常装饰了原有类的核心职责或主要行为。

优点:

把类中装饰功能从类中移除,这样可以简化原来的类,

有效的把类的核心职责和装饰功能分开了,而且可以去除相关类中的重复装饰逻辑

可代替继承。

到此这篇关于详解java设计模式中的装饰模式的文章就介绍到这了,更多相关java装饰模式内容请搜索www.887551.com以前的文章或继续浏览下面的相关文章希望大家以后多多支持www.887551.com!

本文发布于:2023-04-04 08:47:19,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/zuowen/175c26ac29b3c3eb8582fbf085a5c288.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

本文word下载地址:详解Java设计模式中的装饰模式.doc

本文 PDF 下载地址:详解Java设计模式中的装饰模式.pdf

标签:模式   构件   咖啡   抽象
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图