简单易解的装饰模式

一、目的:

      刚开始看装饰模式的时候有点小晕,看了好几遍,又自己敲上了几遍才有了一些头绪,说白了装饰模式就是用来给某一个对象动态的添加功能或者职责的。

      实现的过程中还会用到了里氏替换原则(前提是有多个被装饰者,则有一个抽象的Component类,因为在Decorator中会定义一个Component类型的对象,而在主程序中给他赋值时有可能是具体的某个ConcreteComponent的对象,ConcreteComponent对象是Component的子类,让子类代替父类出场并完成功能即为里氏替换原则)
   
二、原理:
      Component:一个抽象类或接口,可以给这些对象动态的添加职责。
      ConcreteComponent:定义了一个具体的对象(被装饰者),可以给这个对象添加功能和职责(比如要装饰墙,则墙就是这个对象)
      Decorator:装饰的抽象类,继承了Component类
      ConcreteDecorator:具体的装饰类(某一个具体的功能或指责),继承Decorator类,用来给装饰者ConcreteComponent对象添加装饰。

三、下面直接上代码:
拿人穿衣服的实例来分析代码的实现部分
1.这是一个ConcreteComponent类,被装饰者类
    public class Person
    {
        private string Name;
        public Person(string name)
        {
            this.Name = name;
        }
        public virtual void Show()
        {
            Console.WriteLine("装扮者是{0}",Name);
        }
    }
2. 装饰的抽象类Decorator,继承person类,用来给person的具体对象添加装饰用(当然不会直接用的这个类,而是用这个抽象类的子类)
    public abstract class Decorator:Person
    {
        protected Person person = null;
        public void SetPerson(Person per)
        {
            this.person = per;
        }
        public override void Show()
        {
            if (person!=null)
            {
                person.Show();
            }
        }
    }

3.具体装饰的类ConcreteDecorator,继承Decorator类,用来给被装饰着person的对象添加装饰
    public class DecoratorA:Decorator
    {
        public override void Show()
        {
            Console.WriteLine("高跟鞋");
            base.Show();
        }
    }

    public class DecoratorB:Decorator
    {
        public override void Show()
        {
            Console.WriteLine("长裙子");
            base.Show();
        }
    }

 4.主程序中的代码:
       static void Main(string[] args)
        {
            Person personA = new Person("小红");
            DecoratorA a = new DecoratorA();
            DecoratorB b = new DecoratorB();

            a.SetPerson(personA);
            b.SetPerson(a);
            b.Show();
            
            Console.ReadKey();
        }

对于装饰者模式可以灵活来用,如上面的代码例子中被装饰者只有一个,则可以省略Component类,直接声明一个ConcreteComponent类(上例中是Person类)即可,而Decorator类直接继承ConcreteComponent类。
同样如果要装饰的功能只有一项,则也不用创建Decorator类,直接创建一个ConcreteDecorator类即可。

    
    
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值