设计模式之装饰器模式(五)

♀尐吖头ヾ 提交于 2020-01-25 11:06:45

装饰器模式可以在不修改原有代码的情况下给它增加一个或多个顺序可变的扩展功能,且不破环原有代码的封装性,使用了OOP的组合+继承的方式来实现,是一种AOP编程思想的设计模式。

现有如下代码:

    //学生基类
    public abstract class StudentBase
    {
        public string name { get; set; }

        public abstract void EatFood();
    }

    //学生子类1
    public class StudentClassOne: StudentBase
    {
        public override void EatFood()
        {
            System.Diagnostics.Debug.WriteLine($"{name} 开始吃东西了");
            System.Diagnostics.Debug.WriteLine("吃西瓜");
        }
    }

此时业务逻辑开始发生变化,比如:小花同学还想 吃苹果、吃梨、吃车厘子;这个时候你可以在“吃西瓜”后面加一些代码来实现,但这样每当业务发生变化的时候都要重新修改原有代码, 破坏了代码的封装性,而且不能实现”不同业务场景下吃的东西不一样,或者吃的顺序不一样“的情况。这个时候就要用到我们的装饰者模式了:

//声明一个装饰者基类
 public  class StudentDecorator: StudentBase
    {
        private StudentBase studentBase = null;
        public StudentDecorator(StudentBase _studentBase)
        {
            studentBase = _studentBase;
        }
        public override void EatFood()
        {
            studentBase.EatFood();
        }
    }

    //扩展一个吃苹果的功能
    public class StudentEatApple : StudentDecorator
    {
        public StudentEatApple(StudentBase _studentBase):base(_studentBase)
        {
        }
        public override void EatFood()
        {
            base.EatFood();
            System.Diagnostics.Debug.WriteLine("吃苹果");
        }
    }

    //扩展一个吃橘子的功能
    public class StudentEatOrange : StudentDecorator
    {
        public StudentEatOrange(StudentBase _studentBase) : base(_studentBase)
        {
        }
        public override void EatFood()
        {
            base.EatFood();
            System.Diagnostics.Debug.WriteLine("吃橘子");
        }
    }

写好装饰者模式之后就可以对此随意组装了:

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