用咖啡为模型解释一下装饰者模式

设计模式深度解析:AI如何影响装饰器模式与组合模式的选择与应用 本文深入探讨了装饰器模式与组合模式在AI技术背景下的选择与应用。通过分析这两种设计模式的核心特点,文章揭示了AI如何改变它们的应用方式和场景。装饰器模式在AI中助力模型功能的动态扩展,提升了模型性能;而组合模式则帮助构建复杂而有序的AI系统,实现了模块的灵活组合与重用。文章指出,AI技术的发展推动了设计模式的演进与创新,为开发者提供了更强大和灵活的工具。未来,随着AI技术的不断进步,设计模式将继续在软件开发中发挥重要作用。本文旨在帮助读者更好地理解和应用这两种设计模式,以应对日益复杂的AI挑战。 阅读详情

需求:对某个已经存在的方法进行功能增强
实现方案:
A、继承
B、装饰设计模式(重点)
C、动态代理(难点)
黑咖啡

加糖的黑咖啡
加奶的黑咖啡
加冰的黑咖啡
加糖加奶的黑咖啡
加糖加冰的黑咖啡
加冰加奶的黑咖啡
加糖加奶加冰的黑咖啡
功能: 煮 + 喝

方案1:笨方案,使用继承,不建议,导致类爆炸
方案2:装饰模式
A、抽取接口
B、创建基类实现接口
C、创建要素类
class 要素类 implements 接口 {
private 接口 字段;
public 要素类(接口 字段){
this.字段 = 字段;
}
public void 接口方法(){
增强的功能
字段.方法();
}
}
使用:
不同要素类可以进行排列组合实现不同需求
优点:
避免继承的类爆炸的情况,代码结构更简单合理
缺点:
不同要素类可以任意组合,容易出现符合语法但是不符合业务逻辑的实现


代码实现:

public class Test02 {
public static void main(String[] args) {
Coffee c = new BlackCoffee();
SugerBlackCoffee sc = new SugerBlackCoffee(c);
sc.boil();
sc.drink();
System.out.println("---------------");
Coffee c2 = new BlackCoffee();
IceBlackCoffee ic = new IceBlackCoffee(c2);
ic.boil();
ic.drink();
System.out.println("+++++++++++++++++");
/*Coffee c3 = new BlackCoffee();
SugerBlackCoffee sc3 = new SugerBlackCoffee(c3);
MilkBlackCoffee mc3 = new MilkBlackCoffee(sc3);
IceBlackCoffee ic3 = new IceBlackCoffee(mc3);
ic3.boil();
ic3.drink();*/
IceBlackCoffee ic4 = new IceBlackCoffee(new SugerBlackCoffee(new MilkBlackCoffee(new BlackCoffee())));
ic4.boil();
ic.drink();
System.out.println("-------------------");
DoubleSuger ds = new DoubleSuger(new BlackCoffee());
ds.boil();
ds.drink();
}
}
//抽取接口
interface Coffee {
void boil();
void drink();
}
//创建黑咖啡类实现接口
class BlackCoffee implements Coffee {

@Override
public void boil() {
System.out.println("煮");
}

@Override
public void drink() {
System.out.println("黑咖啡");
}
}
//创建加糖黑咖啡类实现接口
class SugerBlackCoffee implements Coffee {
private Coffee coffee; //创建一个接口字段

//将接口作为方法的形参
public SugerBlackCoffee(Coffee coffee) {
this.coffee = coffee;
}
@Override
public void boil() {
coffee.boil();
}

@Override
public void drink() {
System.out.println("加糖");
coffee.drink();
}
}
//装饰设计模式和继承搭配使用
class DoubleSuger extends SugerBlackCoffee {

public DoubleSuger(Coffee coffee) {
super(coffee);
}
@Override
public void drink() {
System.out.println("两包");
super.drink();
}
}
=====================================================================
//创建加奶黑咖啡类实现接口
class MilkBlackCoffee implements Coffee {
private Coffee coffee;
public MilkBlackCoffee(Coffee coffee) {
this.coffee = coffee;
}
@Override
public void boil() {
coffee.boil();
}

@Override
public void drink() {
System.out.println("加奶");
coffee.drink();
}
}
//创建加冰黑咖啡类实现接口
class IceBlackCoffee implements Coffee {
private Coffee coffee;
public IceBlackCoffee(Coffee coffee) {
this.coffee = coffee;
}
@Override
public void boil() {
coffee.boil();
}

@Override
public void drink() {
System.out.println("加冰");
coffee.drink();
}
}

















设计模式之装饰者模式 背景以去咖啡馆点咖啡为例子,假设一个咖啡馆可以提供Espresso、HouseBlend、Decaf、DarkRoast这四种咖啡的类型,同时对于这每种咖啡还提供Milk、Mocha、Soy、Whip这四种调料,即每种咖啡都可以组合这失踪调味中的任意几种。假设给这个咖啡馆设计一个点餐系统,根据用户的请求,得出最后的价格和咖啡的各种配料信息。首先根据我们直观的思路就是,根据用户的请求组合出相应的订单信 阅读详情

相关推荐

设计模式之装饰模式:以售卖咖啡为例

根据售卖咖啡的过程,客户先选择一种口味的咖啡,又选择不同种类的配料,由于配料选择是不定的,符合装饰模式的应用情况。

咖啡馆与装饰模式

咖啡馆与装饰模式需求思考装饰模式的定义代码样例原材料基类然后扩展一些我们会用到的原材料最后,我们来生产咖啡吧总结 需求 楼下的咖啡馆要开业了,我们看看他们主营的产品有哪些: 热牛奶 高乐高 摩卡 卡布奇诺 … 然后,咖啡馆的需求就来了:产品不同,售价也不同。同时作为咖啡馆,经常需要推出新品。 思考 看到这个需求,第一反应是通过继承来解决这些问题。解决思路如下: 我们先定义一个饮料的基类 扩展这个基类,生成热牛奶、高乐高、摩卡等子类 通过工厂的方式返回这些子类(也就是生成饮料)。 这也算是一种中规中矩

wx的博客 584

c# ,设计模式,装饰者模式,星巴兹咖啡

c# ,设计模式,装饰者模式,星巴兹咖啡,基本上就是head first 上的例子的C#实现,根据自己的理解,作了一点点改动,可以直接运行。

C++设计模式04-——装饰设计模式

装饰模式指的是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。——— 百度百科主体(被装饰者)饰品(装饰)比如:定做的奶油蛋糕,蛋糕是主体,而蛋糕的外包装、丝带、花朵都是饰品。在某些情况下我们可能会"过度地使用继承来扩展对象的功能",由于继承为类型引入的静态特质,使得这种扩展方式缺乏灵活性;并且随着子类的增多(扩展功能的增多),各种子类的组合(扩展功能的组合)会导致更多子类的膨胀。...

qq_51340322的博客 1776

Android定位权限全解析:从基础配置到后台持续定位的完整解决方案

本文全面解析Android定位权限体系,从基础配置到后台持续定位的完整解决方案。涵盖LocationManager和FusedLocationProviderClient等主流API的对比选型,详细讲解动态权限申请、精确定位与模糊定位的智能切换,以及Android 10+的后台定位适配策略。帮助开发者构建兼顾精准度与电量友好的定位方案,适用于导航、运动轨迹记录等多种场景。

weixin_29310605的博客 609

Oracle EBS订单的流程(Order->AR)

基本流程创建订单路径:Order Management > Orders,Returns > Sales Orders填写订单头信息,客户,订单类型,销售人员填写订单体信息,输入物料,数量...然后Book Order,订单Book之后,你会发现订单头的Status的状态变成了“Booked”,订单行的状态为"Awaiting Shipping",记录下来你的订单号,后边的每一步都需要这个订单号。

田攀的日志 4万+

设计模式——装饰者模式

本文主要通过一个星巴卡点咖啡的案例来引出装饰者模式,分析装饰者模式的原理,使用场景等等。

weixin_73659282的博客 1083

Brim与ZUI协同安装指南:从下载到流量分析实战

本文提供Brim与ZUI协同安装与实战指南,详细讲解从下载、环境变量配置到流量分析的全流程。通过将PCAP文件转换为ZNG格式,结合直观的Zed查询语言,这套组合能极大提升大型网络数据包的分析效率,是网络安全与运维人员进行高效流量分析的利器。

metal的博客 459

从咖啡谈装饰模式

问题描述     星巴克要订做一个管理系统.他们的咖啡有不同的品牌,有latte(拿铁),卡布奇诺(cappuccino)等等当然以后肯定会改变,同时各种咖啡都可以加上milk(牛奶),soy(豆浆),sugar(糖)等配料,当然配料也会改变(一杯咖啡可以加两分牛奶).还有咖啡有大杯小杯. 终极版本    我们建立一个抽象类beverage. package base; public a

程序员小董的专栏 2786

Android客户端如何设计架构

当我们在新开发一款APP时,我们在初期要如何设计架构呢?在这里我根据我的经验,总结了一些基本的架构思路。 客户端架构设计的时候,首先需要充分考虑到所开发的app的类型,这里我分为功能型和服务型两大类,功能型的app侧重业务和功能,服务型的app侧重服务和运算。下面我就具体来讲讲针对这两种类型的通用架构。 功能型app 功能型app的activity比较多,整个app都以一个个activity承载业务和功能,在设计这类app时,我们需要考虑哪些要素呢? 由于activity比较多,我们需要考虑页面的跳转路由,

子者不语的专栏 1544

用 deepseek 写小说(通用版提示词模板)

#Initialization:作为[Role],在[Goals]下,回顾你的[Skill],严格遵守[Constraints],5.第五步:人物大纲,给小说里的每个人物撰写背景故事,深挖人物过去的经历,原生家庭,住所:一栋位于市郊的房子,有三个卧室,房龄 10 年,厨房很大,当中有一个鸟式大理石。示例 2.戈德里洛克先去了熊老爹的工作坊,尝试用大纲法写作,却发现这种方法无聊透顶,1.第一步:一句话概括,一句话概述小说内容,主要包含小说癸型,主角,以及故事中需要。大灰狼的暴行彻底激怒了戈德里洛克,

陈奕昆的博客 2969

【Java设计模式】简单学装饰模式——来杯咖啡,先糖后奶

目录 说明 目标 实现方式 应用场景 其他链接 说明 结构型模式之一,其他还有适配器模式、桥接模式、组合模式、外观模式、享元模式、代理模式 装饰者模式(Decorator Pattern)的精髓在于动态的给对象增减功能 目标 动态添加装饰,可重复装饰,直至满足要求 实现方式 说又是这家咖啡店。为了迎合顾客的口味,店里的咖啡有很多种料可以添加。不仅如此,刁钻的顾客还要先加奶后加糖,或者先加糖后加奶等要求。那没办法,生意还是得做呀。除了多种料的不同组合,还需要能按顺序添加。这就需要用装饰模

winrh的博客 816

Transformer 时间序列预测实战

Transformer 时间序列预测实战

机器学习深度学习业余选手 743

基于odoo17的设计模式详解---装饰模式

Odoo开发中的装饰模式实践:通过_inherit机制扩展模型功能 摘要:本文介绍了Odoo开发中如何运用装饰模式在不修改核心代码的情况下扩展模型功能。通过_inherit机制,开发者可以像装饰器一样为现有模型添加新字段和方法,同时保持对原始功能的继承。文中以给res.partner模型添加"忠诚度积分"为例,展示了Python类和XML视图的装饰实现,特别强调了Odoo 17简化后的视图属性语法。文章还分析了装饰模式的优势(开闭原则、灵活性)和注意事项(装饰者地狱、super调用链),

weixin_44247470的博客 1376

Python爬虫实战:京东/淘宝商品价格与评论监控系统——从User-Agent伪装到编码陷阱的全面攻克

在电商数据驱动决策的今天,无论是个人消费者想抓住历史低价,还是市场分析师需要追踪竞品动态,抑或是算法交易员依赖实时价格信号,自动化的商品价格与评论监控系统都已成为不可或缺的工具。然而,电商平台的反爬虫策略日益严苛,字符编码的“暗坑”更是让初学者屡屡碰壁。本文将以京东(JD.com和淘宝(Taobao.com两大主流平台为目标,手把手带你构建一个稳定、高效的商品监控爬虫。User-Agent伪装——如何模拟真实浏览器行为,突破初级反爬。GBK/UTF-8编码混战。

2201_76125261的博客 75

在MATLAB和Simulink中设计并仿真一个电动汽车BMS热管理系统

电动汽车电池管理系统(Battery Management System, BMS)中的热管理是确保电池安全运行、延长寿命和提高性能的关键环节。通过Simulink进行BMS热管理仿真是验证控制策略的有效性、优化散热设计并降低开发成本的重要手段。以下是如何在MATLAB和Simulink中设计并仿真一个电动汽车BMS热管理系统的详细步骤。通过上述步骤,我们成功设计并实现了基于Simulink的电动汽车BMS热管理系统仿真。

xiaoheshang_123的博客 702

【结构型模式】装饰器模式

装饰器模式(装饰者模式)定义装饰器模式动态地将责任附加到对象上。若要拓展功能,装饰者提供了比继承更有弹性地替代方案。(对象结构型模型)通俗点来说:动态的给一个对象增加一些额外的职责。就扩展功能而言,装饰模式提供了一种比使用子类更加灵活的替代方案。利用继承来达到“类型匹配”1.装饰者与被装饰对象有相同地超类型;2.可以用一个或多个装饰者包装一个对象;3.既然装饰者与被装饰对象有相同地超类型,所以在任何需要原始对象(被包装地)的场合,可以用装饰过的兑现代替它;

Emily的博客 1317

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

【设计模式十六之装饰模式】装饰者模式

Decorator Pattern装饰模式细说装饰模式细说装饰模式定义UML模型场景场景一场景二代码代码一代码二基于UML的代码装饰模式应用和注意事项 细说装饰模式 提示: 博主:章飞 _906285288的博客 博客地址:http://blog.youkuaiyun.com/qq_29924041 细说装饰模式 装饰模式在java或者在android中的应用非常广泛,如果细细的去品味下源码的话,里面真...

章飞 _906285288的博客 577

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

[装饰者模式]经典的星巴克咖啡问题解决方案

<br />在星巴克咖啡中,随意的点取咖啡种类以及配料的场景,如果使用传统的逻辑控制,产出的将会是一片非常不优雅的代码,而几乎每个例子中都会使用这样的一个场景,来引出装饰者模式的介绍。<br />装饰者模式通常有着如下的特点:<br />1、装饰对象和被装饰对象通常有着相同的接口,实现相同的操作;<br />2、装饰者对象中要含有被装饰对象的实例;<br />3、装饰者只是增加了附加功能,而不会去更改被装饰对象的实现逻辑;<br />从上述的描述中,我们可以抽象一下几个领域模型:<br />1、共同的接口,

quzishen的专栏 4065

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

装饰者模式【结构型模式】

文章优先发表在个人博客:https://www.xdx97.com/article/706183532841533440 一、引入装饰者模式 我们现在有一个卖咖啡的需求。我们有咖啡,我们也有配料(巧克力、牛奶…)。现在我们要设计一个程序计算用户这杯咖啡的价格。(咖啡 + 配料) 1-1:思路一:排列组合 我们把每种组合都列举出来。比如:咖啡+巧克力、咖啡+双份巧克力、咖啡+牛奶 … 这样的...

小道仙的后宫 327

装饰器模式

1. 什么是装饰器模式? 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。 这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。 装饰者和被装饰对象有相同的超类型。 装饰者可以在所委托被装饰者的行为之前与 / 或之后,加上自己的行为,以达到特定的目的。 ** ** **意图:**动态地给一个对象添加一些额外的职责。就增加功能来说,装饰器模式相比生

BitHachi 721

java装饰者模式 星巴克_图解Java设计模式之装饰者模式

图解Java设计模式之装饰者模式星巴克咖啡订单项目(咖啡馆)1)咖啡种类/单品咖啡 :Espresso(意大利浓咖啡)、ShortBlack、LongBlack(美式咖啡)、Decaf(无因咖啡)2)调料 :Milk、Soy(豆浆)、Chocolate3)要求在扩展新的咖啡种类时,具有良好的扩展性、改动方便、维护方便4)使用OO的来计算不同种类咖啡的费用 :客户可以点单品咖啡,也可以单品咖啡 + ...

weixin_34025386的博客 259

Go语言实现装饰者模式

装饰者模式简介类图代码实现总结 简介 装饰着模式是这样的一种模式,即在原有类的基础上进行装饰,然后添加新的功能模式,比如一家咖啡连锁店卖咖啡,可能需要按照顾客的要求进行个性化配置,需要添加多种原料并计算价格。 类图 我们构造的类图如下所示: 这里是个简单的装饰器模型,利用组合和实现的联系,以要添加的原料作为主对象完成对深色烘培咖啡的加料和价格的计算,其中摩卡和牛奶对象被称为装饰者。 代码实现 package main import "fmt" type component interface {

csdn闻声即知人的博客 387

java装饰者模式源代码_Java设计模式之装饰者模式

[java]代码库使用装饰者模式可以很好的解决上面的两个问题、这里不再绕弯子、直接实现。具体的思想内涵可以自己慢慢揣摩。有时间补上类结构图(也可以看Head First Design Pattern这本书的Decorating Object这一章)。1、装饰者模式要求装饰器和组件是同一类型、那么我们先给所有咖啡一个抽象类——Beverage(当然也可以使用接口、原则就是尽量减少对源代码的改动、如果...

weixin_39781945的博客 95

设计模式——(3)装饰者模式

第三章 装饰者模式 1.1 引言 在开发过程中,当遇到如下场景: 需要对Object对象附加新的行为,从而达到新的目的。 举例: 购买咖啡时,使用 cost() 方法,而咖啡还可以加不同的配料,例如:摩卡和奶泡等,加入不同的配料,需要在原有的咖啡价格上,计入配料的价格。在这个过程中,Object 是咖啡,cost() 方法类似 speak() 方法,方法返回咖啡的价格,配料是对 Object 的装饰,配料的价格是附加新的行为,新的目的是计算加入配料后咖啡的总价格。 1.2 通过装饰者模式实现咖啡价格计算的

qq_36188127的博客 252

java装饰者模式 星巴克_[装饰者模式]经典的星巴克咖啡问题解决方案 | 学步园...

在星巴克咖啡中,随意的点取咖啡种类以及配料的场景,如果使用传统的逻辑控制,产出的将会是一片非常不优雅的代码,而几乎每个例子中都会使用这样的一个场景,来引出装饰者模式的介绍。装饰者模式通常有着如下的特点:1、装饰对象和被装饰对象通常有着相同的接口,实现相同的操作;2、装饰者对象中要含有被装饰对象的实例;3、装饰者只是增加了附加功能,而不会去更改被装饰对象的实现逻辑;从上述的描述中,我们可以抽象一下几...

weixin_30774211的博客 320
上一篇: 冒泡排序的javaSE版本及其优化
下一篇: 分享一下自己关于linux入门的一些笔记
wangc_xml
博客等级 码龄9年 3粉丝 5原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值