tectijuana / pdd6a-archivado

Patrones de diseño
GNU Affero General Public License v3.0
6 stars 2 forks source link

Decorator #28

Closed IoTeacher closed 7 years ago

IoTeacher commented 8 years ago

@GuevaraH te toca participar en este PDD

GuevaraH commented 8 years ago

DECORATOR

Todos los patrones de estructuración están basados en el uso de uno o varios objetos que determinan la estructuración Decorator: se sustituye el objeto existente agregándole nuevas funcionalidades. El objetivo del patrón Decorator es agregar dinámicamente funcionalidades suplementarias a un objeto. Esta agregación de funcionalidades no modifica la interfaz del objeto y es transparente de cara a los clientes. El patrón Decorator constituye una alternativa respecto a la creación de una subclase para enriquecer el objeto. Dominios de aplicación • Un sistema agrega dinámicamente funcionalidades a un objeto, sin modificar su interfaz, es decir sin que los clientes de este objeto tengan que verse modificados. • Un sistema gestiona funcionalidades que pueden eliminarse dinámicamente. • El uso de la herencia para extender los objetos no es práctico, lo cual puede ocurrir cuando su jerarquía ya es de por sí compleja.

EJEMPLO

UML

image

PARTICIPANTES

Component (LibraryItem): Define la interfaz para objetos que pueden tener responsabilidades agregadas dinámicamente. ConcreteComponent (Book,Video): Define un objeto para el cual le pueden ser agregados responsabilidades adicionales. Decorator (Decorator): Mantiene una referencia a el objeto componente y define una interfaz que conforma a los componentes de interfaz. ConcreteDecorator (Borrowable): Agrega responsabilidades al componente.

Este código del mundo real demuestra el patrón decorador en el que se añade la funcionalidad 'borrowable' a los elementos de biblioteca existentes (libros y videos).

CÓDIGO

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;

namespace DoFactory.GangOfFour.Decorator.RealWorld { ///

  /// MainApp startup class for Real-World 
  /// Decorator Design Pattern.
  /// </summary>

class MainApp
{
    /// <summary>

        /// Entry point into console application.
        /// </summary>

    static void Main()
    {
        // Create book
        Book book = new Book("Worley", "Inside ASP.NET", 10);
        book.Display();
        // Create video
        Video video = new Video("Spielberg", "Jaws", 23, 92);
        video.Display();

        // Make video borrowable, then borrow and display
        Console.WriteLine("\nMaking video borrowable:");

        Borrowable borrowvideo = new Borrowable(video);
        borrowvideo.BorrowItem("Customer #1");
        borrowvideo.BorrowItem("Customer #2");

        borrowvideo.Display();

        // Wait for user
        Console.ReadKey();
    }
}

/// <summary>
  /// The 'Component' abstract class
  /// </summary>
abstract class LibraryItem
{
    private int _numCopies;

    // Property
    public int NumCopies
    {
        get { return _numCopies; }
        set { _numCopies = value; }
    }

    public abstract void Display();
}

/// <summary>
  /// The 'ConcreteComponent' class
  /// </summary>
class Book : LibraryItem
{
    private string _author;
    private string _title;

    // Constructor
    public Book(string author, string title, int numCopies)
    {
        this._author = author;
        this._title = title;
        this.NumCopies = numCopies;
    }

    public override void Display()
    {
        Console.WriteLine("\nBook ------ ");
        Console.WriteLine(" Author: {0}", _author);
        Console.WriteLine(" Title: {0}", _title);
        Console.WriteLine(" # Copies: {0}", NumCopies);
    }
}

/// <summary>
  /// The 'ConcreteComponent' class
  /// </summary>
class Video : LibraryItem
{
    private string _director;
    private string _title;
    private int _playTime;

    // Constructor
    public Video(string director, string title,
int numCopies, int playTime)
    {
        this._director = director;
        this._title = title;
        this.NumCopies = numCopies;
        this._playTime = playTime;
    }

    public override void Display()
    {
        Console.WriteLine("\nVideo ----- ");
        Console.WriteLine(" Director: {0}", _director);
        Console.WriteLine(" Title: {0}", _title);
        Console.WriteLine(" # Copies: {0}", NumCopies);
        Console.WriteLine(" Playtime: {0}\n", _playTime);
    }
}

/// <summary>
  /// The 'Decorator' abstract class
  /// </summary>
abstract class Decorator : LibraryItem
{
    protected LibraryItem libraryItem;

    // Constructor
    public Decorator(LibraryItem libraryItem)
    {
        this.libraryItem = libraryItem;
    }

    public override void Display()
    {
        libraryItem.Display();
    }
}

/// <summary>
  /// The 'ConcreteDecorator' class
  /// </summary>
class Borrowable : Decorator
{
    protected List<string> borrowers = new List<string>();

    // Constructor
    public Borrowable(LibraryItem libraryItem)
: base(libraryItem)
    {
    }

    public void BorrowItem(string name)
    {
        borrowers.Add(name);
        libraryItem.NumCopies--;
    }

    public void ReturnItem(string name)
    {
        borrowers.Remove(name);
        libraryItem.NumCopies++;
    }

    public override void Display()
    {
        base.Display();

        foreach (string borrower in borrowers)
        {
            Console.WriteLine(" borrower: " + borrower);
        }
    }
}

}

image

IoTeacher commented 7 years ago

con 100