装饰器模式

烂漫一生 提交于 2020-02-26 03:41:04

//设计模式

        //创建型设计模式:关注对象的创建
        //结构型设计模式 :关注类鱼类之间的关系
        //     组合优于继承,装饰器模式是组合+继承
        //行为型设计模式 :关注对象和行为分离    //类与类之间的关系
    //1.纵向关系  继承--实现
    //2.横向关系: 聚合、组合、包含、依赖
    //组合优于继承(横向优于纵向)
    //  继承: 为了代码重用,通过继承覆写,不修改原有类,增加了新功能,代码简单
    //
    //  组合:通过构造函数把本来要继承实现的对象传递进去
    //        组合完成了功能扩展,不修改原有类,需实例化两个类,代码更复杂
    //        面向对象,不仅为一个类型服务,解耦合
   

1. 概念

装饰器模式 允许向一个现有的对象添加新的功能,同时又不改变其结构。装饰者可以在所委托被装饰者的行为之前或之后加上自己的行为,以达到特定的目的。

2. 组成

         装饰器模式由组件和装饰者组成。抽象组件(Component):需要装饰的抽象对象。 具体组件(ConcreteComponent):是我们需要装饰的对象 抽象装饰类(Decorator):内含指向抽象组件的引用及装饰者共有的方法。 具体装饰类(ConcreteDecorator):被装饰的对象。

            

3. 优缺点

 

优点 :

        可以动态的扩展功能;  装饰者和被装饰者解耦,互相不关联。

缺点:

        多层装饰比较复杂。

装饰者模式的适用场景:

         扩展一个类的功能; 动态增加和撤销功能。

注意:

        装饰者模式可以替代繁杂的继承,但其内部实现使用的也是继承。也就是说,装饰者模式将繁杂的继承转化成了其内部的简单的继承。

4.简单实现

abstract class  AbstractStudent
    {
        public abstract void study();


        public int id { get; set; }
        public string name { get; set; }

    }
 class StudentVIP:AbstractStudent
    {
        public override  void study()
        {
            Console.WriteLine("this is vip");
        }

    }
 class BaseDecorator:AbstractStudent
    {

        private AbstractStudent _Student = null;
        public BaseDecorator(AbstractStudent student)
        {
            this._Student = student;
        }

        public override void study()
        {
            this._Student.study();
            Console.WriteLine("@@@@@@@@@@@@@@");
        }
    }
class StudentDecoratorAnswer:BaseDecorator
    {
        public StudentDecoratorAnswer(AbstractStudent student):base(student)
        {

        }

        public override void study()
        {
            base.study();
            Console.WriteLine(" 开始答疑!!!!!");
        }
    }
 class StudentDecoratorHomework: BaseDecorator
    {

        public StudentDecoratorHomework( AbstractStudent student):base(student)
        {

        }

        public override void study()
        {
            base.study();
            Console.WriteLine(" 写作业!!!!!!!!");
        }
    }
 class StudentDecoratorVideo: BaseDecorator
    {
        public StudentDecoratorVideo(AbstractStudent student) :base(student)
        {

        }

        public override void study()
        {
            base.study();
            Console.WriteLine(" 看视频");
        }
    }
 static void Main(string[] args)
        {

            // 装饰器模式


            AbstractStudent vip = new StudentVIP()
            {
                id = 888,
                name = "xing"
            };

            //组合实例化
            //BaseDecorator decoraor = new BaseDecorator(vip);
            //decoraor.study();

            //
            //AbstractStudent decoraor2 = new BaseDecorator(vip);
            //decoraor2.study();

            //
            //vip = new BaseDecorator(vip);
            //vip.study();

            vip = new StudentDecoratorVideo(vip);
            vip = new StudentDecoratorHomework(vip);
            vip = new StudentDecoratorAnswer(vip);
            vip.study();

            Console.ReadKey();
        }

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!