zoukankan      html  css  js  c++  java
  • 设计模式(1)装饰模式小菜扮靓


    前言:


    装饰模式:动态给对象添加一些额外的职责。


    结构图


    角色


     Componet(抽象构件角色)


    定义一个抽象接口,为对象添加职责


    abstract class Component
    {
         public abstract void Operation();
    }

    ConcreteComponent(具体构件角色)


    抽象构件角色:定义一个抽象接口,来规范准备附加功能的类


    class ConcreteComponent : Component
    {
         public override void Operation ()
          {
                    console.writeline("具体对象操作");
          }
    }


            Decorator( 抽象装饰者角色)


    定义与抽象构件角色相同的接口。实际上执行的还是抽象构件角色的方法。


    abstract class Decorator:Component 
    {
        protected Component component;
        public void Setcomponent (Component component )             //构造函数对属性赋值
        {
               this.component=component;
         }
          public override void Operation()
          {
                if (component ! =null)
                {
                      component.Operation();
                 }
           }
    }


    ConcreteDecoratorA (具体装饰者角色)


    实现装饰者角色,添加额外功能

    class ConcreteDeratorA:Decorator 
    {
          private string addedState;
          public override void Operation()
          {
                base.Operation();
                addstate="new state";
                console.writeline("具体装饰对象A的操作");
           }
    }


    Demo (来自《大话设计模式.程杰》)



    “小菜扮靓”

    ConcreteComponent



     //person类。concrete component 
        class Person
        {
            public Person()              //空的构造函数为后面声明一个变量铺垫
            { }
            private string name;
            public Person(string name)   //带有参数的构造函数为类的属性进行赋值
            {
                this.name = name;
            }
            public virtual void show()   //显示“装扮”方法
            {
                Console.WriteLine("装扮的{0}",name );      //{0}参数化的占位符,显示变量name的内容
            }
        }


    Decorator


     class Finery : Person
        {
            protected Person component;
            //通过属性赋值的方式给给定的类进行装扮
            public void Decorate(Person component)             //后面不断调用对象的Decorator方法对对象进行有顺序的赋值
            {
                this.component = component;
            }
            public override void show()                        //基类的方法显示装饰内容
            {
                if (component != null)
                {
                    component.show();
                }
            }
        }


    ConcreteDecorator


       //具体的服饰类
        class Tshirts : Finery
            {
                public override void show()         //实际上是person类的方法执行
                {
                    Console.WriteLine ("大T衬衣");
                    base.show();                //实际上是person类的show方法
                }
            }
        class BigTrouser : Finery
            {
                public override void show()
                {
                    Console.WriteLine ("大垮裤");
                    base.show();
                }
            }
    }



    客户端 


    static void Main(string[] args)
            {
                Person chen = new Person("小菜");
                Console.WriteLine("第一种装扮");
    
                Tshirts aa = new Tshirts();                //Tshirts类是继承Finery。而Finery拥有Decorate方法
                BigTrouser bb = new BigTrouser();
    
                aa.Decorate(chen);              //对象调用Decorate方法对对象进行有顺序装饰
                bb.Decorate(aa );
                bb.show();
    
                
            }


    结果






  • 相关阅读:
    Leetcode Binary Tree Level Order Traversal
    Leetcode Symmetric Tree
    Leetcode Same Tree
    Leetcode Unique Paths
    Leetcode Populating Next Right Pointers in Each Node
    Leetcode Maximum Depth of Binary Tree
    Leetcode Minimum Path Sum
    Leetcode Merge Two Sorted Lists
    Leetcode Climbing Stairs
    Leetcode Triangle
  • 原文地址:https://www.cnblogs.com/guziming/p/4232756.html
Copyright © 2011-2022 走看看