Modo de decoración: agregue ropa y edredón

  Fondo de ejemplo de código: en el programa de vestimenta de personajes, la ropa existente incluye blusas, pantalones y zapatos. Si quieres agregar un sombrero al personaje, solo necesitas agregar una clase de sombrero en la parte inferior de la clase Galas en el decorador. modo, y luego La categoría sombrero agrega varios estilos de sombreros, y no es necesario hacer que cada tipo de sombrero sea una categoría separada.
  Modo Decorador: se utiliza principalmente para ampliar la clase, abrir la extensión y cerrar la modificación. Aunque la herencia de clases también puede implementar comportamientos extendidos, su granularidad no es tan fina como el patrón del decorador, y cuando hay varias clases que deben decorarse con un comportamiento, es posible que deba escribir varios objetos de herencia. El patrón decorador debe tener una interfaz pública o una clase abstracta, que se utiliza como objeto para pasar. Debe implementar la clase decorada básica (Persona) y la interfaz pública de la clase decorada (Decorador) de acuerdo con la interfaz. Todas las clases decoradas futuras heredan de la interfaz de clase decorada pública y se implementan internamente.

  La definición del modo Decorador: se refiere al modo que agrega dinámicamente algunas responsabilidades (es decir, agregando sus funciones extra) al objeto sin cambiar la estructura del objeto existente, pertenece al modo estructura de objeto.

  Las principales ventajas del modo Decorador son:

  • Usar el modo de decoración para extender la función del objeto es más flexible que usar el método de herencia.

  • Es posible diseñar varios tipos de decoración específicos diferentes y crear una serie de combinaciones de diferentes comportamientos.

  La principal desventaja es: el modo de decoración agrega muchas subcategorías, y si se usa en exceso, el programa se vuelve muy complicado.

  La estructura e implementación del patrón de decoración:
  En circunstancias normales, la función de extender una clase se implementará por herencia. Pero la herencia tiene características estáticas, alto acoplamiento y con el aumento de funciones extendidas, las subclases se expandirán. Si utiliza la relación de composición para crear un objeto de empaquetado (es decir, un objeto de decoración) para envolver el objeto real y le proporciona funciones adicionales mientras mantiene la estructura de clases del objeto real sin cambios, este es el objetivo del patrón de decoración. Analicemos su estructura básica y método de implementación a continuación.

  1. La estructura del patrón El patrón de
    decoración incluye principalmente los siguientes roles.
  • Rol de componente abstracto (Componente): define una interfaz abstracta para estandarizar el objeto listo para recibir responsabilidades adicionales.

  • Papel del componente de hormigón (componente de hormigón): realice el componente abstracto, agregue algunas responsabilidades a través del papel decorativo.

  • Función de decoración abstracta (decorador): hereda componentes abstractos y contiene instancias de componentes concretos, que pueden ampliar las funciones de los componentes concretos a través de sus subclases.

  • Función de decoración de hormigón (ConcreteDecorator): para implementar los métodos relevantes de decoración abstracta y agregar responsabilidades adicionales al objeto del componente de hormigón.

Inserte la descripción de la imagen aquí
Clase de componente

//抽象父类——控件
    abstract  class Component
    {
    
    
        public abstract void Operation();
    }

    //子类——具体组件
    class ConcreteComponent : Component
    {
    
    
        public override void Operation()    //父类方法重载
        {
    
    
            Console.WriteLine("具体对象的操作");
        }
    }

Clase de decorador

 //抽象子类——装饰者
    abstract class Decorator : Component
    {
    
    
        protected Component component;
        public void SetComponent(Component component)
        {
    
    
            this.component = component;
        }

        public override void Operation()    //父类方法重载
        {
    
    
            if (component != null)
            {
    
    
                component.Operation();
            }
        }
    }

  

Clase de gala

 class Finery : Person
    {
    
    
        protected Person component;

        //打扮
        public void Decorate(Person component)
        {
    
    
            this.component = component;
        }
        public override void Show()
        {
    
    
            if (component != null)
            {
    
    
                component.Show();
            }
        }
    }

    //子类——大T恤
    class TShirts : Finery
    {
    
    
        public override void Show()
        {
    
    
            Console.Write("大T恤");
            base.Show();
        }
    }
    //子类——垮裤
    class BigTrouser : Finery
    {
    
    
        public override void Show()
        {
    
    
            Console.Write("垮裤");
            base.Show();
        }
    }
    //子类——板鞋
    class Shoes : Finery
    {
    
    
        public override void Show()
        {
    
    
            Console.Write("板鞋");
            base.Show();
        }
    }

Clase de persona

class Person
    {
    
    
        public Person()
        {
    
     }

        private string _name;
        public Person (string name)
        {
    
    
            this._name = name;
        }
        public virtual void Show()
        {
    
    
            Console.WriteLine("装扮的{0}",_name);
        }
    }

Codigo del cliente

class Program
    {
    
    
        static void Main(string[] args)
        {
    
    
            Person xc = new Person("小菜");

            Console.WriteLine("\n第一种装扮");

            Shoes  pqx = new Shoes();
            BigTrouser kk = new BigTrouser();
            TShirts dtx = new TShirts();

            pqx.Decorate(xc);
            kk.Decorate(pqx);
            dtx.Decorate(kk);
            dtx.Show();
            Console.ReadLine();
        }
    }

Supongo que te gusta

Origin blog.csdn.net/CharmaineXia/article/details/109994617
Recomendado
Clasificación