设计模式——装饰器模式(Decorator Pattern)

Posted yuchenghao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式——装饰器模式(Decorator Pattern)相关的知识,希望对你有一定的参考价值。

发现太过于刻意按照计划来写博客,有点不实际,刚好最近在一个网课上复习AOP的知识,讲到了装饰器模式和代理模式,顺便复习总结一下。

首先了解一下装饰器模式,从名字里面可以看出来,装饰器模式就类似于房子装潢吧,比如刚买的毛坯房,只有一个没有门,直接就可以进去。

首先设计一个房子类Room,实现一个进入方法Access

    /// <summary>
    /// 抽象接口 用来进行约束
    /// </summary>
    public interface IAccess
    {
        void Access();
    }
    /// <summary>
    /// 用户类
    /// </summary>
    public class Room: IAccess
    {
        /// <summary>
        /// 进入房子操作
        /// </summary>
        public void Access() {
            Console.WriteLine("进房子了");
        }
    }

那么现在这个类就拥有了进入房子的功能了,那么后期我们需求变更,这个房子加了一个门,那这样我就需要多一个开门的功能了,但是我又不想改变room这个类,那么需要怎么做呢,这个时候就可以用到装饰器模式了

这里定义一个门Door类,添加开门关门方法

    /// <summary>
    /// 门类
    /// </summary>
    public class Door : IAccess
    {
        Room room;

        public Door(Room room)
        {
            this.room = room;
           
        }
        public void Access() {
            OpenDoor();
            room.Access();
            CloseDoor();
        }
        public void OpenDoor() {
            Console.WriteLine("进门前开门");
        }
        public void CloseDoor()
        {
            Console.WriteLine("进门后关门");
        }
    }

这样,在进入房子的操作外面就加了开门关门两个操作了,然后还没有改变原有的代码结构,这种自由组合的模式,就叫做装饰器模式。

有句话叫组合是优于继承的,我的理解是,继承首先的问题是,类之间的关联是强关联的,属于入侵式,需要改变原有的功能代码结构,但是:添加新功能,不应该影响原有功能。

装饰器模式的好处:灵活、拓展性好、能够在不影响原有业务的情况下添加新的功能。

缺点:增加了系统的复杂度。

应用场景:AOP的实现

 

以上是关于设计模式——装饰器模式(Decorator Pattern)的主要内容,如果未能解决你的问题,请参考以下文章

设计模式入门之装饰器模式Decorator

装饰器模式--Decorator

装饰器模式-Decorator(Java实现)

设计模式——装饰器模式(Decorator Pattern)

装饰器(Decorator)模式Recap

Decorator(装饰器模式)