装饰器模式优缺点及使用场景
优点:灵活,扩展性好,能够在不影响业务类的前提下,动态的为其添加本身不存在的功能
缺点:增加了程序的复杂程度
使用场景:为具体的业务对象附加功能职责,例如上述的游戏装备,以及培训班的各层vip,商场的多重优惠等等
以下是调用
以下是运行结果
优点:灵活,扩展性好,能够在不影响业务类的前提下,动态的为其添加本身不存在的功能
缺点:增加了程序的复杂程度
使用场景:为具体的业务对象附加功能职责,例如上述的游戏装备,以及培训班的各层vip,商场的多重优惠等等
/// <summary> /// 实体类 /// </summary> public class Student : AbstractStudent { public override void Study() { Console.WriteLine("白天学习!!!"); } }
/// <summary> /// 抽象类 /// </summary> public abstract class AbstractStudent { public int id; public string Name; public abstract void Study(); }
/// <summary> /// 装饰器基类 /// </summary> public class DecoratorBase : AbstractStudent { private AbstractStudent _student; public DecoratorBase(AbstractStudent student) { this._student = student; } public override void Study() { _student.Study(); } }
/// <summary> /// 装饰器 /// </summary> public class DecoratorStudentAnser : DecoratorBase { public DecoratorStudentAnser(AbstractStudent student) : base(student) { } public override void Study() { base.Study(); Console.WriteLine("作业巩答疑"); } } /// <summary> /// 装饰器 /// </summary> public class DecoratorStudentHomeworke : DecoratorBase { public DecoratorStudentHomeworke(AbstractStudent student) : base(student) { } public override void Study() { base.Study(); Console.WriteLine("作业巩固练习"); } } /// <summary> /// 装饰器 /// </summary> public class DecoratorStudentPreview : DecoratorBase { public DecoratorStudentPreview(AbstractStudent student) : base(student) { } public override void Study() { Console.WriteLine("课前预习"); base.Study(); } } /// <summary> /// 装饰器 /// </summary> public class DecoratorStudentVideo : DecoratorBase { public DecoratorStudentVideo(AbstractStudent student) : base(student) { } public override void Study() { base.Study(); Console.WriteLine("课后获取回看视频"); } }
以下是调用
static void Main(string[] args) { AbstractStudent student = new Student(); student.id = 888; student.Name = "罗分明"; //DecoratorStudentVideo studentVideo = new DecoratorStudentVideo(student);//1、组合实例化 //DecoratorBase studentVideo=new DecoratorStudentVideo(student);//2、左边换成父类 //AbstractStudent studentVideo = new DecoratorStudentVideo(student);//3、左边换成父类 student = new DecoratorStudentVideo(student);//4、把新变量引用指向改变,合并变量 student = new DecoratorStudentHomeworke(student); student = new DecoratorStudentAnser(student); student = new DecoratorStudentPreview(student); student.Study(); //转载请保留http://www.luofenming.com/show.aspx?id=ART2019052600001 }
以下是运行结果
