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

mac2025-05-03  12

/// <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(); } }

 

最新回复(0)