[学习笔记:设计模式] 7_装饰器模式

定义:动态地给一个对象增加一些额外的职责(Responsibility),就增加对象功能来说,装饰模式比生成子类实现更为灵活。


装饰模式包含如下角色:


- Component(抽象构件):具体构件和抽象装饰类的共同父类,声明了在具体构件中实现的业务方法
- ConcreteComponent(具体构件):抽象构件类的子类,用于定义具体的构件对象,实现了在抽象构件中声明的方法,装饰器可以给它增加额外的职责(方法)
- Decorator(抽象装饰类):抽象构件类的子类,用于给具体构件增加职责
- ConcreteDecorator(具体装饰类):抽象装饰类的子类,负责向构件添加新的职责


举例
在原有方法上添加新行为和新方法

- 抽象构建

//原有方法
public abstract class Conponent
    {
        public abstract void baseFunction();
    }

- 具体构建

public class ConcreteConpoment : Conponent
    {
        public override void baseFunction()
        {
            Console.WriteLine("基本职责");
        }
    }

- 抽象装饰类

public abstract class Decorator:Conponent
    {
        //维护一个父类(抽象构建)对象
        private Conponent conponent;

        //聚合(传入的是具体构建对象)
        public Decorator(Conponent conponent)
        {
            this.conponent = conponent;
        }

        //让子类获取(被具体构建对象覆盖后的)抽象构建对象
        public Conponent GetConponent()
        {
            return conponent;
        }

        //声明新的方法
        public abstract void addFuntion();
    }

- 具体装饰类

public class ConcreteDecoretor : Decorator
    {
        public ConcreteDecoretor(Conponent conponent):base(conponent)
        {
            
        }

        public override void baseFunction()
        {
            //调用原有方法
            GetConponent().baseFunction();

            //在原有方法的基础上新增行为
            Console.WriteLine("新增职责1");
        }

        //实现新的方法
        public override void addFuntion()
        {
            Console.WriteLine("新增职责2");
        }
    }

- 客户类

class Program
    {
        static void Main(string[] args)
        {
            //原有职责
            Conponent conponent = new ConcreteConpoment();
            conponent.baseFunction();

            //在原有职责的基础上增加了新的职责
            Decorator decorator = new ConcreteDecoretor(conponent);
            //给原有方法增加了新的行为
            decorator.baseFunction();
            //调用新的方法
            decorator.addFuntion();
            
        }
    }

总结:抽象构建和具体构建,负责声明和实现原有方法;抽象装饰类中,声明一个抽象构建对象,并在构造函数中注入被具体构建对象覆盖后的对象,新增一个get该对象的方法,同时可以声明其他新的方法交由子类具体修饰类实现;具体修饰类中,重写原有方法,调用父类中抽象构建对象的原有方法,并可添加新的行为;客户只需要声明抽象修饰类并用具体修饰类覆盖即可。

ps:
- 抽象装饰类中,之所以声明抽象构建对象而不是具体构建对象,是因为其继承的是抽象构建类或接口,无法声明其子类对象;
- 抽象构建可以设计为接口,但是抽象装饰类不行,因为其要继承或实现抽象构建。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值