• 设计模式(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();
    
                
            }


    结果






  • 相关阅读:
    JDBC_增删改
    JSP内置对象作用域
    497. Random Point in Non-overlapping Rectangles
    921. Minimum Add to Make Parentheses Valid
    946. Validate Stack Sequences
    824. Goat Latin
    Acwing 165 小猫爬山 (dfs)
    Codeforces #656 Problem D
    Codeforces #656 Problem C
    对象属性拷贝工具类大全
  • 原文地址:https://www.cnblogs.com/guziming/p/4232756.html
Copyright © 2020-2023  润新知