23种设计模式-09-装饰者模式

/// <summary>
    /// 人类
    /// </summary>
    public abstract class Person
    {
        public abstract void Develop();
    }
    
    /// <summary>
    /// 这个是我本人,我也是人类,所以要继承人类
    /// </summary>
    public class Lingbug : Person
    {
        public override void Develop()
        {
            //原来我只会.Net开发
            Console.WriteLine("我会开发.Net程序!");
        }
    }

装饰类:

/// <summary>
    /// 装饰类:也就是装饰者
    /// </summary>
    public class Decorator : Person
    {
        private Person _Person;

        //需要传入参数:我需要装饰谁
        public Decorator(Person person)
        {
            this._Person = person;
        }

        public override void Develop()
        {
            _Person.Develop();
        }
    }
    
    /// <summary>
    /// 具体的装饰者:将.Net core装饰到我的身上
    /// </summary>
    public class NetCoreDecorator : Decorator
    {
        public NetCoreDecorator(Person person) : base(person)
        {

        }

        public override void Develop()
        {
            base.Develop();
            Console.WriteLine("我会开发.Net core程序!");//装饰
        }
    }
    
    /// <summary>
    /// 具体的装饰者:将Java装饰到我的身上
    /// </summary>
    public class JavaDecorator : Decorator
    {
        public JavaDecorator(Person person) : base(person)
        {

        }

        public override void Develop()
        {
            base.Develop();
            Console.WriteLine("我会开发Java程序!");//装饰
        }
    }

测试:

class Program
    {
        /// <summary>
        /// 装饰者模式:
        /// 1.如果想要为一类对象添加新的功能,有两种方法:
        /// ①开发新的类去继承原来的来,来扩展新的方法,缺点:会导致子类繁多
        /// ②使用装饰者模式去装饰员原来的对象
        /// 此文中的例子:
        /// 我原来只会.Net开发,现在我学会了.Net core的开发,也学会了java开发,就需要将新学会的两个技能添加到我的身上
        /// </summary>
        /// <param name="args"></param>
        static void Main(string[] args)
        {
            //实例化我
            Person lingbug = new Lingbug();
            lingbug.Develop();//以前的我开发只会.Net开发

            Console.WriteLine("--------------------------------------------");

            //我学会了.Net core,装饰我:将.Net core加到我身上
            Person netCoreDecorator = new NetCoreDecorator(lingbug);
            netCoreDecorator.Develop();

            Console.WriteLine("--------------------------------------------");

            //我学会了java,装饰我:将java加到我身上
            Person javaDecorator = new JavaDecorator(lingbug);
            javaDecorator.Develop();

            Console.WriteLine("--------------------------------------------");

            //我学会了java和.Net core,装饰我:将java和.Net core都加到我身上
            var allDecorator = new JavaDecorator(netCoreDecorator);
            allDecorator.Develop();

            Console.WriteLine("--------------------------------------------");

            //其实可以不用实例化新的对象,一直修改最初始的那个人也是可以的(因为都是Person类),也是最符合业务逻辑的
            Person lingbugNew = new Lingbug();
            lingbugNew.Develop();

            Console.WriteLine("--------------------------------------------");

            lingbugNew = new NetCoreDecorator(lingbugNew);
            lingbugNew.Develop();

            Console.WriteLine("--------------------------------------------");

            lingbugNew = new JavaDecorator(lingbugNew);
            lingbugNew.Develop();

            Console.WriteLine("--------------------------------------------");

            Console.WriteLine("End");
            Console.ReadKey();
        }
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值