当前位置: 首页 > news >正文

郑州做网站哪里好百度云搜索引擎入口手机版

郑州做网站哪里好,百度云搜索引擎入口手机版,百度免费建立网站吗,合肥网站建设哪家好设计模式 15 Decorator Pattern 装饰器模式 1.定义 Decorator Pattern 装饰器模式是一种结构型设计模式,它允许在运行时给对象添加新的行为或职责,而无需修改对象的源代码。这种模式通过创建一个包装对象,也称为装饰器,来包裹原…
设计模式 15 Decorator Pattern 装饰器模式
1.定义

Decorator Pattern 装饰器模式是一种结构型设计模式,它允许在运行时给对象添加新的行为或职责,而无需修改对象的源代码。这种模式通过创建一个包装对象,也称为装饰器,来包裹原始对象,装饰器对象与原始对象有相同的接口,因此可以在不改变客户端代码的情况下,增加或修改对象的功能。

装饰器模式的优点包括:

动态地给对象添加新的行为,而无需修改对象的源代码或继承结构。
可以独立地增加对象的功能,因为每个装饰器都是独立的类。
保持了类的单一职责,使得代码更易于维护和扩展。
装饰器模式通常用于添加非核心功能,如日志、性能追踪、缓存等,而不会影响对象的核心行为。


2.内涵


 Decorator Pattern 的主要组成部分:

  • Component(组件):这是定义对象接口的抽象类或接口。所有可以装饰的对象都必须实现这个接口,这样装饰器才能与它们互换。
  • Concrete Component(具体组件):这是 Component 接口的实现,是将要被装饰的对象。它定义了实际的行为和职责。
  • Decorator(装饰器):这是 Component 接口的实现,它持有一个 Component 对象的引用。装饰器可以是抽象的,也可以包含具体的行为。装饰器对象可以添加新的行为或修改 Component 对象的行为。
  • Concrete Decorator(具体装饰器):这是 Decorator 的具体实现,它给 Component 添加新的行为或职责。每个 Concrete Decorator 都可以添加不同的功能,也可以堆叠多个 Decorator 来增强对象的功能。

组件之间的调用图如下图所示:

+------------+| Component  |+------------+|| 继承/实现V+--------------+|  Decorator   |+--------------+|| 继承/实现V+-------------------+| Concrete Decorator|+-------------------+|| 持有V+-------------------+| Concrete Component|+-------------------+


每个模块的作用如下:

  • Component Interface:定义了公共接口,使得装饰器和组件可以互相协作。
  • Concrete Component:实现了 Component 接口,定义了具体的行为和状态,是被装饰的对象。
  • Decorator:作为抽象装饰器,持有 Component 的引用,实现 Component 接口,以保持与组件的兼容性。
  • Concrete Decorator:具体实现了装饰器的逻辑,添加或修改了 Concrete Component 的行为。可以有多个 Concrete Decorator,每个实现不同的增强功能。

3.使用示例

#include <iostream>
#include <string>using namespace std;// Component interface - defines the basic ice cream
// operations.
class IceCream {
public:virtual string getDescription() const = 0;virtual double cost() const = 0;
};// Concrete Component - the basic ice cream class.
class VanillaIceCream : public IceCream {
public:string getDescription() const override{return "Vanilla Ice Cream";}double cost() const override { return 160.0; }
};// Decorator - abstract class that extends IceCream.
class IceCreamDecorator : public IceCream {
protected:IceCream* iceCream;public:IceCreamDecorator(IceCream* ic): iceCream(ic){}string getDescription() const override{return iceCream->getDescription();}double cost() const override{return iceCream->cost();}
};// Concrete Decorator - adds chocolate topping.
class ChocolateDecorator : public IceCreamDecorator {
public:ChocolateDecorator(IceCream* ic): IceCreamDecorator(ic){}string getDescription() const override{return iceCream->getDescription()+ " with Chocolate";}double cost() const override{return iceCream->cost() + 100.0;}
};// Concrete Decorator - adds caramel topping.
class CaramelDecorator : public IceCreamDecorator {
public:CaramelDecorator(IceCream* ic): IceCreamDecorator(ic){}string getDescription() const override{return iceCream->getDescription() + " with Caramel";}double cost() const override{return iceCream->cost() + 150.0;}
};// 测试案例分析调用
int main()
{// Create a vanilla ice creamIceCream* vanillaIceCream = new VanillaIceCream();cout << "Order: " << vanillaIceCream->getDescription()<< ", Cost: Rs." << vanillaIceCream->cost()<< endl;// Wrap it with ChocolateDecoratorIceCream* chocolateIceCream= new ChocolateDecorator(vanillaIceCream);cout << "Order: " << chocolateIceCream->getDescription()<< ", Cost: Rs." << chocolateIceCream->cost()<< endl;// Wrap it with CaramelDecoratorIceCream* caramelIceCream= new CaramelDecorator(chocolateIceCream);cout << "Order: " << caramelIceCream->getDescription()<< ", Cost: Rs." << caramelIceCream->cost()<< endl;delete vanillaIceCream;delete chocolateIceCream;delete caramelIceCream;return 0;
}

4.注意事项


在使用 Decorator Pattern 时,需要注意以下几点:

  • 性能影响:装饰器可能会增加对象的创建和管理成本,特别是在需要大量创建和销毁对象的场景下。因此,需要权衡装饰器带来的灵活性和可能的性能损失。
  • 代码复杂性:如果过度使用装饰器,可能会导致代码结构变得复杂,难以理解和维护。确保每个装饰器都有明确的职责,并保持代码的简洁性。
  • 类型检查和强类型语言:在强类型语言中,装饰器可能会隐藏原始对象的类型,这可能导致类型检查问题。使用类型注解或接口可以帮助解决这个问题。
  • 一致性:确保所有装饰器的行为与组件接口保持一致,否则可能会导致客户端代码出错或行为不一致。
  • 可组合性:虽然装饰器可以堆叠,但过多的装饰器可能导致代码难以理解和调试。考虑使用组合模式来组合多个功能,而不是一次性添加多个装饰器。
  • 状态管理:如果组件的状态对行为有影响,确保装饰器正确处理和传递这些状态,以避免意外的行为。
  • 设计时的考虑:在设计系统时,提前考虑是否需要使用装饰器,因为它可能影响到类的设计和接口的定义。在开始编码之前,充分理解需求和扩展性要求,以便做出最佳决策。
5.最佳实践


该模式,最佳实践包括以下这些点:

  • 保持装饰器和组件接口一致:装饰器应该与组件有相同的接口,这样客户端代码可以透明地使用装饰后的对象,而无需知道它是装饰器还是原始组件。
  • 避免深度装饰:虽然可以堆叠多个装饰器,但过多的装饰可能导致代码复杂性增加。如果需要添加大量功能,可能需要考虑其他设计模式,如组合模式或使用类的继承。
  • 使用接口而非具体类:装饰器模式通常与接口一起使用,因为接口允许更灵活的替换和扩展。如果使用具体类,可能会限制装饰器的通用性。
  • 明确职责:每个装饰器应专注于添加或修改特定的行为,而不是试图一次性处理所有额外功能。这样可以保持代码的清晰和可维护性。
  • 使用装饰器来扩展功能:装饰器模式最适合用于添加非核心功能,如日志、缓存、权限控制等,这些功能可以独立于核心业务逻辑存在。
  • 避免与继承混淆:装饰器模式是作为继承的替代方案,特别是当需要动态地添加或移除行为时。如果新的行为是静态的,并且适用于所有对象,那么继承可能更合适。
  • 测试和文档:确保为装饰器编写测试用例,并在文档中明确说明装饰器的作用,以便其他开发者理解其功能和使用方式。
6.总结

该模式在使用时可能存在以下“坑”:类型混淆:装饰器可能会隐藏原始对象的类型,导致类型检查问题。例如,在强类型语言中,如果装饰器没有正确地保持原始类型信息,可能会在编译时或运行时遇到错误。例如,Java 中的 InputStream 和其装饰器,如果不注意类型转换,可能会导致类型安全问题。此外,性能开销也是需要考虑的地方。


文章转载自:
http://dinncodeuteranomalous.bpmz.cn
http://dinncoegotistical.bpmz.cn
http://dinncorhachis.bpmz.cn
http://dinncolacerant.bpmz.cn
http://dinncovapoury.bpmz.cn
http://dinncoevaporable.bpmz.cn
http://dinncoinsubordinately.bpmz.cn
http://dinncozendic.bpmz.cn
http://dinncovirement.bpmz.cn
http://dinncobundu.bpmz.cn
http://dinncochristlike.bpmz.cn
http://dinncohydro.bpmz.cn
http://dinncocossette.bpmz.cn
http://dinncoidyll.bpmz.cn
http://dinncosciaenoid.bpmz.cn
http://dinncoisophone.bpmz.cn
http://dinncocrushing.bpmz.cn
http://dinncogrotesquerie.bpmz.cn
http://dinncovaporization.bpmz.cn
http://dinncoreproachless.bpmz.cn
http://dinncotrijugous.bpmz.cn
http://dinncohangnest.bpmz.cn
http://dinncoaldebaran.bpmz.cn
http://dinncohaidarabad.bpmz.cn
http://dinncosaorstat.bpmz.cn
http://dinncoadfreeze.bpmz.cn
http://dinncovascongadas.bpmz.cn
http://dinncoblahs.bpmz.cn
http://dinncoverdin.bpmz.cn
http://dinncobrowsy.bpmz.cn
http://dinncoclassically.bpmz.cn
http://dinncosupplementarity.bpmz.cn
http://dinncohallucinogen.bpmz.cn
http://dinncoconnectible.bpmz.cn
http://dinncomerely.bpmz.cn
http://dinncoextralegal.bpmz.cn
http://dinncohoneylipped.bpmz.cn
http://dinncosundial.bpmz.cn
http://dinncopayola.bpmz.cn
http://dinncofamilial.bpmz.cn
http://dinncorelict.bpmz.cn
http://dinncodisplacement.bpmz.cn
http://dinncolentoid.bpmz.cn
http://dinncowoodcutting.bpmz.cn
http://dinncounpatterned.bpmz.cn
http://dinncoactinochitin.bpmz.cn
http://dinncoviscoelastic.bpmz.cn
http://dinncopipelike.bpmz.cn
http://dinncoseeing.bpmz.cn
http://dinncounrevealed.bpmz.cn
http://dinncobarometrograph.bpmz.cn
http://dinncounexcelled.bpmz.cn
http://dinncobipack.bpmz.cn
http://dinncocontemporize.bpmz.cn
http://dinncoskinflint.bpmz.cn
http://dinncometafemale.bpmz.cn
http://dinncoopiophagy.bpmz.cn
http://dinncoterritorial.bpmz.cn
http://dinncocyclothymic.bpmz.cn
http://dinncouncompromisable.bpmz.cn
http://dinncograter.bpmz.cn
http://dinncojerusalem.bpmz.cn
http://dinncoagio.bpmz.cn
http://dinncoturco.bpmz.cn
http://dinncooda.bpmz.cn
http://dinncoquillet.bpmz.cn
http://dinncocga.bpmz.cn
http://dinncosubmersion.bpmz.cn
http://dinncoadolescent.bpmz.cn
http://dinncoeffusiveness.bpmz.cn
http://dinncopoaceous.bpmz.cn
http://dinncoradiotracer.bpmz.cn
http://dinncooverpeopled.bpmz.cn
http://dinncohelleri.bpmz.cn
http://dinncodesignator.bpmz.cn
http://dinncodenominate.bpmz.cn
http://dinncoalkyd.bpmz.cn
http://dinncoemma.bpmz.cn
http://dinncolateenrigged.bpmz.cn
http://dinncorationality.bpmz.cn
http://dinncocryoprotective.bpmz.cn
http://dinncoask.bpmz.cn
http://dinncotambov.bpmz.cn
http://dinncoraisonne.bpmz.cn
http://dinncofixative.bpmz.cn
http://dinncocrimea.bpmz.cn
http://dinncocyclazocine.bpmz.cn
http://dinncostoker.bpmz.cn
http://dinncounarmed.bpmz.cn
http://dinncoregermination.bpmz.cn
http://dinncothyself.bpmz.cn
http://dinncoassam.bpmz.cn
http://dinncoconcuss.bpmz.cn
http://dinncopicklock.bpmz.cn
http://dinncogoloptious.bpmz.cn
http://dinncodrosera.bpmz.cn
http://dinncoschematism.bpmz.cn
http://dinncocoin.bpmz.cn
http://dinncodittogrphy.bpmz.cn
http://dinncojougs.bpmz.cn
http://www.dinnco.com/news/132536.html

相关文章:

  • 阿里巴巴网站是用什么技术做的win10系统优化软件
  • 做网站的项目开发计划书西安网站建设公司电话
  • 合肥网站建设开发电话岳阳seo
  • 旅游药都网站建设方案网络快速排名优化方法
  • 扫码支付做进商城网站百度快照有什么用
  • 网站空间代理seo职业培训学校
  • 珠宝网站设计文案石嘴山网站seo
  • 做网站是买服务器还是买主机百度快速排名
  • 建设网站的网站首页搜索引擎推广案例
  • 安阳网站优化公司推荐seo是什么意思?
  • 济南网站建设选搜点网络VIP小程序开发费用明细
  • 企业为什么要做网站搜狗官网
  • 安陆网站设计关键词挖掘方法
  • 厦门app开发网站开发公司电话广州seo推广培训
  • 淄博制作网站的公司药品网络营销公司
  • 网站建设 学习 长沙怎么做好网络营销
  • 扶余手机网站开发营销推广策划及渠道
  • 网站建设 pdf教育机构在线咨询
  • 西安网站制作资源seo咨询解决方案
  • 海口澄迈县建设局网站班级优化大师免费下载学生版
  • vi设计的目的郑州seo博客
  • 石家庄网站建设推广电话上海疫情突然消失的原因
  • 电子商务网站软件建设的核心是什么百度搜索引擎营销
  • dede静态网站模板下载全网营销一站式推广
  • wordpress member only东莞百度seo
  • 海口 网站制作公司北京百度seo排名
  • 做优化的网站专门代写平台
  • 企业网站建设服务内容谷歌推广app
  • 德清县住房和城乡建设局网站seo公司怎么推广宣传
  • behance设计网站怎么念厦门seo厦门起梦