七、装饰器模式

embedded/2024/9/24 1:20:37/

装饰器模式(Decorator Pattern)是一种结构型设计模式,允许在不改变对象自身的情况下,动态地向对象添加新功能。它通过将功能附加到对象的方式来增强其行为,提供了一种灵活的替代方案来使用子类扩展功能。

主要组成部分:

  1. 抽象构件(Component)

    • 定义一个接口或抽象类,声明了要装饰的对象的基本功能。
  2. 具体构件(ConcreteComponent)

    • 实现抽象构件的具体类,是被装饰的原始对象。
  3. 装饰器(Decorator)

    • 持有一个抽象构件的引用,并实现抽象构件的接口,用于扩展功能。
  4. 具体装饰类(ConcreteDecorator)

    • 继承自装饰器并添加额外功能。

优点:

  1. 灵活性:可以在运行时添加功能,而不影响其他对象。
  2. 单一职责原则:每个装饰类都有自己的职责,可以独立地进行扩展。
  3. 可替换性:可以在装饰器之间自由组合。

使用场景:

  • 需要在运行时添加额外功能或职责。
  • 希望通过组合来实现不同的行为,避免使用大量的子类。

JAVA: 

例如:制作咖啡(Coffee): 普通咖啡和价格, 那么加牛奶, 加糖都是对普通咖啡的增强

// 1、定义一个咖啡接口 - 抽象构件
public interface Coffee {// 咖啡描述public String getDescription();// 价格public double cost();
}
// 2、具体构件:基本咖啡
public class SimpleCoffee implements Coffee{@Overridepublic String getDescription() {return "普通咖啡:Simple Coffee";}@Overridepublic double cost() {return 1;}
}
// 3、装饰器
public abstract class CoffeeDecorator implements Coffee{public Coffee coffee;public CoffeeDecorator(Coffee coffee) {this.coffee = coffee;}@Overridepublic String getDescription() {return coffee.getDescription();}@Overridepublic double cost() {return coffee.cost();}
}
// 4、具体装饰类-牛奶装饰
public class MilkDecorator extends CoffeeDecorator{public MilkDecorator(Coffee coffee) {super(coffee);}@Overridepublic String getDescription() {return coffee.getDescription() + ", 加牛奶";}@Overridepublic double cost() {return coffee.cost() + 1;}
}
//5、具体装饰类:糖装饰
public class SugarDecorator extends  CoffeeDecorator{public SugarDecorator(Coffee coffee) {super(coffee);}@Overridepublic String getDescription() {return coffee.getDescription() + ", 加糖";}@Overridepublic double cost() {return super.cost();}
}
@Test(description = "装饰器")public void decoratorTest(){Coffee coffee = new SimpleCoffee();System.out.println(coffee.getDescription() + " $" + coffee.cost());// 添加牛奶coffee = new MilkDecorator(coffee);System.out.println(coffee.getDescription() + " $" + coffee.cost());// 添加糖coffee = new SugarDecorator(coffee);System.out.println(coffee.getDescription() + " $" + coffee.cost());}

GO:

画画的例子,默认的 Square  只有基础的画画功能, ColorSquare  为他加上了颜色

package decorator// IDraw 画画
type IDraw interface {Draw() string
}// Square 正方形type Square struct{}func (s Square) Draw() string {return "这是一个正方形"
}// ColorSquare 有颜色的正方形
type ColorSquare struct {square IDrawcolor  string
}func NewColorSquare(square IDraw, color string) ColorSquare {return ColorSquare{square: square,color:  color,}
}func (c ColorSquare) Draw() string {return c.square.Draw() + ", 颜色是 " + c.color
}
package decoratorimport ("fmt""testing"
)func TestDecorator(t *testing.T) {sq := Square{}csq := NewColorSquare(sq, "红色")draw := csq.Draw()fmt.Println(draw)
}


http://www.ppmy.cn/embedded/110255.html

相关文章

TikTok海外直播专线:顺畅的TikTok全球直播体验

TikTok直播功能的爆发式增长,迅速引领了社交媒体的新潮流。为了满足用户对海外直播的高质量需求,出现了专为TikTok直播打造的海外直播专线,帮助用户在全球范围内实现稳定、流畅的直播体验。 TikTok海外直播专线的核心技术与设计 TikTok海外直…

5个免费版文章生成器,自动写作文章没困扰

随着AI技术的发展,许多人工做的事情都变得简单化了,如:写作文章,以往都是人工写作,而现在可以由文章生成器进行自动写作了。用过文章生成器的人都知道它的强大之处,那么在市面上一些文章生成器中有免费可用…

为什么eBay的防IP关联很重要?

对于电商卖家来说,eBay是一个非常重要的平台。作为拥有庞大用户群和​​丰富商品种类的国际电商平台,eBay为卖家提供了广泛的市场覆盖和无限的商会。 然而,eBay严格的IP关联政策可能是一个巨大的障碍。如果多个账户使用同一个IP地址&#xff…

SpringBoot集成MyBatis-Plus

MyBatis-Plus简介 MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。 1.愿景 我们的愿景是成为 MyBatis 最好的搭档,就像 魂斗罗 中的 1P、2P&#…

开源 AI 智能名片小程序在内容营销中的应用与价值

摘要:本文深入探讨在消费升级的时代背景下,开源 AI 智能名片小程序如何在内容营销中发挥重要作用。阐述了内容营销通过图片、文字、视频等媒介传播相关内容信息给目标用户以促进销售及实现营销目的的过程。分析了开源 AI 智能名片小程序作为一种新型营销…

基于 TDMQ for Apache Pulsar 的跨地域复制实践

导语 自2024年9月6日起,TDMQ Pulsar 版专业集群支持消息、元数据两级跨地域复制功能,消息级复制解决用户全球地域的数据统一归档问题,元数据级复制提供解决用户核心业务跨地域容灾的场景。 用户在跨地域场景遇到的疑问和挑战 在跨地域相关…

Linux 基础命令-文件与目录操作

在 Linux 操作系统中,文件和目录是组织和管理数据的核心单元。作为一个命令行驱动的操作系统,Linux 提供了一系列强大且灵活的命令来操作文件和目录。掌握这些命令不仅是管理 Linux 系统的基础,也是高效使用 Linux 环境的关键。 一、文件与目…

快速搭建本地 Whisper 语音识别大模型

在语音识别领域,OpenAI 的 Whisper 模型以其高效且准确的特性迅速受到瞩目。许多人可能觉得在本地环境中运行这样一个大模型过于复杂,但其实,经过正确的指导,你完全可以在自己的计算机上搭建一个高性能的语音识别系统。 前置准备…