装饰器模式Decorator

简介: 煎饼果子装饰器&汽车装饰器

在之前的一次面试中,有被问到,“IO流中用到了什么设计模式?你知道这种设计模式具体怎么实现的吗?”。知道是装饰器模式,但那会没有去了解是怎么具体实现的。

下面对这个设计模式做一下简单的总结。


一、概述

所谓装饰器模式,就是在不改变原有对象的基础之上,去动态的将功能附加到对象之上,提供了比继承更有弹性的替代方法


这种设计模式有利也有弊:

  • 使功能扩展更加方便
  • 创建很多类

二、组件

装饰器模式(Decorator)中的组件

  • 抽象组件(Component)  

定义一个抽象类或接口以规范准备接收附加责任的对象

下面煎饼果子例子中的BatterCake

  • 具体组件(Concrete Component)

实现抽象构件,通过装饰角色为其添加一些职责

下面煎饼果子例子中的基础煎饼果子BaseBatterCake

  • 装饰器(Decorator)

继承或实现抽象组件,并包含具体组件的实例,可以通过具体装饰器扩展具体组件的功能

下面煎饼果子例子中的BatterCakeDecorator

  • 具体装饰器(Cncrete Decorator)

实现装饰器的相关方法,并给出具体组件对象添加附加的责任

下面煎饼果子例子中的EggDecorator、SausageDecorator

三、煎饼果子装饰器实现

以我们生活中都吃过的煎饼果子为例

我们平常所吃的煎饼果子,组合繁多,有加鸡蛋的、有加香肠的、有加生菜的,等等

3.1 抽象组件BetterCake

/*** 煎饼果子*/publicinterfaceBetterCake {
StringgetMsg();
intgetPrice();
}

3.2 具体组件BaseBetterCake

/*** 基础的煎饼果子*/publicclassBaseBetterCakeimplementsBetterCake {
@OverridepublicStringgetMsg() {
return"煎饼";
    }
@OverridepublicintgetPrice() {
return5;
    }
}

3.3 装饰器BatterCakeDecorator

/*** 装饰器*/publicclassBatterCakeDecoratorimplementsBetterCake {
privatefinalBetterCakebetterCake;
publicBatterCakeDecorator(BetterCakebetterCake) {
this.betterCake=betterCake;
    }
@OverridepublicStringgetMsg() {
returnthis.betterCake.getMsg();
    }
@OverridepublicintgetPrice() {
returnthis.betterCake.getPrice();
    }
}

3.4 具体装饰器

具体的装饰器,这里只有加鸡蛋的煎饼果子EggDecorator、加香肠的建斌果子SausageDecorator

其他类型的煎饼果子,可以再去继承装饰器

3.4.1 EggDecorator
/*** 具体装饰器(鸡蛋煎饼果子)*/publicclassEggDecoratorextendsBatterCakeDecorator {
publicEggDecorator(BetterCakebetterCake) {
super(betterCake);
    }
@OverridepublicStringgetMsg() {
returnsuper.getMsg() +"加1个鸡蛋";
    }
@OverridepublicintgetPrice() {
returnsuper.getPrice() +1;
    }
}
3.4.2 SausageDecorator
/*** 具体装饰器(香肠煎饼果子)*/publicclassSausageDecoratorextendsBatterCakeDecorator {
publicSausageDecorator(BetterCakebetterCake) {
super(betterCake);
    }
@OverridepublicStringgetMsg() {
returnsuper.getMsg() +"加1根香肠";
    }
@OverridepublicintgetPrice() {
returnsuper.getPrice() +2;
    }
}

3.5 测试类

/*** 煎饼果子测试类*/publicclassBetterCakeTest {
publicstaticvoidmain(String[] args) {
BetterCakebetterCake;
betterCake=newBaseBetterCake();
System.out.println(betterCake.getMsg() +",售价:"+betterCake.getPrice() +"元");
// 煎饼加鸡蛋betterCake=newEggDecorator(betterCake);
System.out.println(betterCake.getMsg() +",售价:"+betterCake.getPrice() +"元");
// 煎饼再加鸡蛋betterCake=newEggDecorator(betterCake);
System.out.println(betterCake.getMsg() +",售价:"+betterCake.getPrice() +"元");
// 煎饼加香肠betterCake=newSausageDecorator(betterCake);
System.out.println(betterCake.getMsg() +",售价:"+betterCake.getPrice() +"元");
    }
}
3.5.1 执行结果
煎饼,售价:5元
煎饼加1个鸡蛋,售价:6元
煎饼加1个鸡蛋加1个鸡蛋,售价:7元
煎饼加1个鸡蛋加1个鸡蛋加1根香肠,售价:9元

3.6 类图

BaseBetterCake.jpg

四、汽车装饰器实现

4.1 汽车组件Car

publicinterfaceCar {
/*** 汽车的驾驶功能*/voidrun();
}

4.2 具体组件

4.2.1 宝马
publicclassBmwCarimplementsCar {
@Overridepublicvoidrun() {
System.out.println("宝马开车了。。。");
    }
}
4.2.2 奔驰
publicclassBenzCarimplementsCar {
@Overridepublicvoidrun() {
System.out.println("奔驰开车了。。。");
    }
}
4.2.3 特斯拉
publicclassTeslaCarimplementsCar {
@Overridepublicvoidrun() {
System.out.println("特斯拉开车了。。。");
    }
}

4.3 装饰器CarDecorator

publicclassCarDecoratorimplementsCar {
protectedCardecorated;
publicCarDecorator(Cardecorated) {
this.decorated=decorated;
    }
@Overridepublicvoidrun() {
decorated.run();
    }
}

4.4 具体装饰器

4.4.1 自动驾驶汽车
publicclassAutoCarDecoratorextendsCarDecorator {
publicAutoCarDecorator(Cardecorated) {
super(decorated);
    }
@Overridepublicvoidrun() {
super.run();
autoRun();
    }
privatevoidautoRun() {
System.out.println("开启自动驾驶");
    }
}
4.4.2 会飞的汽车
publicclassFlyCarDecoratorextendsCarDecorator {
publicFlyCarDecorator(Cardecorated) {
super(decorated);
    }
@Overridepublicvoidrun() {
super.run();
fly();
    }
privatevoidfly() {
System.out.println("开启飞行汽车模式");
    }
}

4.5 测试类

publicclassCarTest {
publicstaticvoidmain(String[] args) {
CarbenzCar=newBenzCar();
CarbmwCar=newBmwCar();
CarteslaCar=newTeslaCar();
// 创建自动驾驶的奔驰汽车CarDecoratorautoBenzCar=newAutoCarDecorator(benzCar);
// 创建飞行的、自动驾驶的宝马汽车CarDecoratorflyAutoBmwCar=newFlyCarDecorator(newAutoCarDecorator(bmwCar));
benzCar.run();
bmwCar.run();
teslaCar.run();
System.out.println();
autoBenzCar.run();
System.out.println();
flyAutoBmwCar.run();
    }
}
4.5.1 执行结果
奔驰开车了。。。
宝马开车了。。。
特斯拉开车了。。。
奔驰开车了。。。
开启自动驾驶
宝马开车了。。。
开启自动驾驶
开启飞行汽车模式

4.6 类图

AutoCarDecorator.jpg

目录
相关文章
|
5天前
|
云安全 人工智能 安全
AI被攻击怎么办?
阿里云提供 AI 全栈安全能力,其中对网络攻击的主动识别、智能阻断与快速响应构成其核心防线,依托原生安全防护为客户筑牢免疫屏障。
|
15天前
|
域名解析 人工智能
【实操攻略】手把手教学,免费领取.CN域名
即日起至2025年12月31日,购买万小智AI建站或云·企业官网,每单可免费领1个.CN域名首年!跟我了解领取攻略吧~
|
9天前
|
安全 Java Android开发
深度解析 Android 崩溃捕获原理及从崩溃到归因的闭环实践
崩溃堆栈全是 a.b.c?Native 错误查不到行号?本文详解 Android 崩溃采集全链路原理,教你如何把“天书”变“说明书”。RUM SDK 已支持一键接入。
586 212
|
4天前
|
编解码 Linux 数据安全/隐私保护
教程分享免费视频压缩软件,免费视频压缩,视频压缩免费,附压缩方法及学习教程
教程分享免费视频压缩软件,免费视频压缩,视频压缩免费,附压缩方法及学习教程
233 138
|
存储 人工智能 监控
从代码生成到自主决策:打造一个Coding驱动的“自我编程”Agent
本文介绍了一种基于LLM的“自我编程”Agent系统,通过代码驱动实现复杂逻辑。该Agent以Python为执行引擎,结合Py4j实现Java与Python交互,支持多工具调用、记忆分层与上下文工程,具备感知、认知、表达、自我评估等能力模块,目标是打造可进化的“1.5线”智能助手。
824 60
|
7天前
|
人工智能 移动开发 自然语言处理
2025最新HTML静态网页制作工具推荐:10款免费在线生成器小白也能5分钟上手
晓猛团队精选2025年10款真正免费、无需编程的在线HTML建站工具,涵盖AI生成、拖拽编辑、设计稿转代码等多种类型,均支持浏览器直接使用、快速出图与文件导出,特别适合零基础用户快速搭建个人网站、落地页或企业官网。
1167 157
|
6天前
|
存储 安全 固态存储
四款WIN PE工具,都可以实现U盘安装教程
Windows PE是基于NT内核的轻量系统,用于系统安装、分区管理及故障修复。本文推荐多款PE制作工具,支持U盘启动,兼容UEFI/Legacy模式,具备备份还原、驱动识别等功能,操作简便,适合新旧电脑维护使用。
492 109