{"id":1922,"date":"2023-11-22T14:25:08","date_gmt":"2023-11-22T17:25:08","guid":{"rendered":"https:\/\/stackcodelab.com\/blog\/?p=1922"},"modified":"2023-12-03T10:52:02","modified_gmt":"2023-12-03T13:52:02","slug":"decoradores-en-c","status":"publish","type":"post","link":"https:\/\/stackcodelab.com\/blog\/decoradores-en-c\/","title":{"rendered":"Decoradores en C#"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Los decoradores son un patr\u00f3n de dise\u00f1o estructural que se utiliza para agregar funcionalidad adicional a objetos existentes sin modificar su estructura. Este patr\u00f3n es especialmente \u00fatil cuando se desea extender las capacidades de un objeto de manera din\u00e1mica y flexible. En C#, los decoradores se implementan a menudo utilizando interfaces y herencia.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A continuaci\u00f3n, se presentan los conceptos clave relacionados con los decoradores en C#:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Componente Base (Component):<\/strong> Es la interfaz com\u00fan que define las operaciones b\u00e1sicas que los objetos concretos y los decoradores deben implementar. Representa la estructura base de los objetos.<\/li>\n\n\n\n<li><strong>Componente Concreto (Concrete Component):<\/strong> Es la clase que implementa la interfaz del componente base. Representa el objeto original al que se le agregar\u00e1n funcionalidades adicionales mediante decoradores.<\/li>\n\n\n\n<li><strong>Decorador (Decorator):<\/strong> Es una clase abstracta que tambi\u00e9n implementa la interfaz del componente base. Contiene una referencia a un objeto del componente base y act\u00faa como una envoltura alrededor de ese objeto. El decorador agrega funcionalidad adicional antes o despu\u00e9s de llamar a las operaciones del componente base.<\/li>\n\n\n\n<li><strong>Decorador Concreto (Concrete Decorator):<\/strong> Son las clases concretas que extienden la funcionalidad de los decoradores abstractos. Cada decorador concreto implementa su propia l\u00f3gica de decoraci\u00f3n y llama a las operaciones del componente base, adem\u00e1s de agregar su propia funcionalidad.<\/li>\n\n\n\n<li><strong>Uso de Decoradores:<\/strong> Los objetos decoradores se pueden apilar en capas, lo que permite una composici\u00f3n flexible de funcionalidades. Puedes agregar uno o m\u00e1s decoradores a un objeto concreto para extender su funcionalidad.<\/li>\n\n\n\n<li><strong>Beneficios de los Decoradores:<\/strong> Los decoradores permiten extender objetos sin cambiar su c\u00f3digo existente. Esto promueve el principio de apertura\/\u200bcierre (OCP) del dise\u00f1o orientado a objetos, que establece que las clases deben estar abiertas para la extensi\u00f3n pero cerradas para la modificaci\u00f3n.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Ejemplo de Decoradores en C#:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\n\/\/ Componente Base (Interfaz)\r\npublic interface ICar\r\n{\r\n    string GetDescription();\r\n    double GetCost();\r\n}\r\n\r\n\/\/ Componente Concreto\r\npublic class BasicCar : ICar\r\n{\r\n    public string GetDescription()\r\n    {\r\n        return \"Basic Car\";\r\n    }\r\n\r\n    public double GetCost()\r\n    {\r\n        return 20000;\r\n    }\r\n}\r\n\r\n\/\/ Decorador Abstracto\r\npublic abstract class CarDecorator : ICar\r\n{\r\n    protected ICar _car;\r\n    public CarDecorator(ICar car)\r\n    {\r\n        _car = car;\r\n    }\r\n\r\n    public virtual string GetDescription()\r\n    {\r\n        return _car.GetDescription();\r\n    }\r\n\r\n    public virtual double GetCost()\r\n    {\r\n        return _car.GetCost();\r\n    }\r\n}\r\n\r\n\/\/ Decorador Concreto\r\npublic class SportsCar : CarDecorator\r\n{\r\n    public SportsCar(ICar car) : base(car)\r\n    {\r\n    }\r\n\r\n    public override string GetDescription()\r\n    {\r\n        return base.GetDescription() + \", Sports Package\";\r\n    }\r\n\r\n    public override double GetCost()\r\n    {\r\n        return base.GetCost() + 5000;\r\n    }\r\n}\r<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">En este ejemplo, tenemos un componente base (<code>ICar<\/code>) y un componente concreto (<code>BasicCar<\/code>). Luego, creamos un decorador abstracto (<code>CarDecorator<\/code>) y un decorador concreto (<code>SportsCar<\/code>) que agrega una funcionalidad de paquete deportivo a un autom\u00f3vil b\u00e1sico.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Los decoradores permiten extender las capacidades del objeto <code>ICar<\/code> original de manera flexible y sin modificar su c\u00f3digo. Esto facilita la creaci\u00f3n de objetos con funcionalidades personalizadas seg\u00fan las necesidades de la aplicaci\u00f3n.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Los decoradores son un patr\u00f3n de dise\u00f1o estructural que se utiliza para agregar funcionalidad adicional a objetos existentes sin modificar su estructura. Este patr\u00f3n es especialmente \u00fatil cuando se desea extender las capacidades de un objeto de manera din\u00e1mica y flexible. En C#, los decoradores se implementan a menudo utilizando interfaces y herencia. A continuaci\u00f3n, [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":2087,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_uag_custom_page_level_css":"","site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"set","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"categories":[34],"tags":[],"class_list":["post-1922","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-c-y-otras-hierbas"],"uagb_featured_image_src":{"full":["https:\/\/stackcodelab.com\/blog\/wp-content\/uploads\/2023\/11\/Decoradores-en-C.jpg",1000,666,false],"thumbnail":["https:\/\/stackcodelab.com\/blog\/wp-content\/uploads\/2023\/11\/Decoradores-en-C-150x150.jpg",150,150,true],"medium":["https:\/\/stackcodelab.com\/blog\/wp-content\/uploads\/2023\/11\/Decoradores-en-C-300x200.jpg",300,200,true],"medium_large":["https:\/\/stackcodelab.com\/blog\/wp-content\/uploads\/2023\/11\/Decoradores-en-C-768x511.jpg",768,511,true],"large":["https:\/\/stackcodelab.com\/blog\/wp-content\/uploads\/2023\/11\/Decoradores-en-C.jpg",1000,666,false],"1536x1536":["https:\/\/stackcodelab.com\/blog\/wp-content\/uploads\/2023\/11\/Decoradores-en-C.jpg",1000,666,false],"2048x2048":["https:\/\/stackcodelab.com\/blog\/wp-content\/uploads\/2023\/11\/Decoradores-en-C.jpg",1000,666,false]},"uagb_author_info":{"display_name":"arquitecto","author_link":"https:\/\/stackcodelab.com\/blog\/author\/arquitecto\/"},"uagb_comment_info":0,"uagb_excerpt":"Los decoradores son un patr\u00f3n de dise\u00f1o estructural que se utiliza para agregar funcionalidad adicional a objetos existentes sin modificar su estructura. Este patr\u00f3n es especialmente \u00fatil cuando se desea extender las capacidades de un objeto de manera din\u00e1mica y flexible. En C#, los decoradores se implementan a menudo utilizando interfaces y herencia. A continuaci\u00f3n,&hellip;","_links":{"self":[{"href":"https:\/\/stackcodelab.com\/blog\/wp-json\/wp\/v2\/posts\/1922","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/stackcodelab.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/stackcodelab.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/stackcodelab.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/stackcodelab.com\/blog\/wp-json\/wp\/v2\/comments?post=1922"}],"version-history":[{"count":1,"href":"https:\/\/stackcodelab.com\/blog\/wp-json\/wp\/v2\/posts\/1922\/revisions"}],"predecessor-version":[{"id":1924,"href":"https:\/\/stackcodelab.com\/blog\/wp-json\/wp\/v2\/posts\/1922\/revisions\/1924"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/stackcodelab.com\/blog\/wp-json\/wp\/v2\/media\/2087"}],"wp:attachment":[{"href":"https:\/\/stackcodelab.com\/blog\/wp-json\/wp\/v2\/media?parent=1922"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/stackcodelab.com\/blog\/wp-json\/wp\/v2\/categories?post=1922"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/stackcodelab.com\/blog\/wp-json\/wp\/v2\/tags?post=1922"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}