//设计模式
//创建型设计模式:关注对象的创建
//结构型设计模式 :关注类鱼类之间的关系
// 组合优于继承,装饰器模式是组合+继承
//行为型设计模式 :关注对象和行为分离 //类与类之间的关系
//1.纵向关系 继承--实现
//2.横向关系: 聚合、组合、包含、依赖
//组合优于继承(横向优于纵向)
// 继承: 为了代码重用,通过继承覆写,不修改原有类,增加了新功能,代码简单
//
// 组合:通过构造函数把本来要继承实现的对象传递进去
// 组合完成了功能扩展,不修改原有类,需实例化两个类,代码更复杂
// 面向对象,不仅为一个类型服务,解耦合
1. 概念
装饰器模式 允许向一个现有的对象添加新的功能,同时又不改变其结构。装饰者可以在所委托被装饰者的行为之前或之后加上自己的行为,以达到特定的目的。
2. 组成
装饰器模式由组件和装饰者组成。抽象组件(Component):需要装饰的抽象对象。 具体组件(ConcreteComponent):是我们需要装饰的对象 抽象装饰类(Decorator):内含指向抽象组件的引用及装饰者共有的方法。 具体装饰类(ConcreteDecorator):被装饰的对象。
3. 优缺点
优点 :
可以动态的扩展功能; 装饰者和被装饰者解耦,互相不关联。
缺点:
多层装饰比较复杂。
装饰者模式的适用场景:
扩展一个类的功能; 动态增加和撤销功能。
注意:
装饰者模式可以替代繁杂的继承,但其内部实现使用的也是继承。也就是说,装饰者模式将繁杂的继承转化成了其内部的简单的继承。
4.简单实现
abstract class AbstractStudent
{
public abstract void study();
public int id { get; set; }
public string name { get; set; }
}
class StudentVIP:AbstractStudent
{
public override void study()
{
Console.WriteLine("this is vip");
}
}
class BaseDecorator:AbstractStudent
{
private AbstractStudent _Student = null;
public BaseDecorator(AbstractStudent student)
{
this._Student = student;
}
public override void study()
{
this._Student.study();
Console.WriteLine("@@@@@@@@@@@@@@");
}
}
class StudentDecoratorAnswer:BaseDecorator
{
public StudentDecoratorAnswer(AbstractStudent student):base(student)
{
}
public override void study()
{
base.study();
Console.WriteLine(" 开始答疑!!!!!");
}
}
class StudentDecoratorHomework: BaseDecorator
{
public StudentDecoratorHomework( AbstractStudent student):base(student)
{
}
public override void study()
{
base.study();
Console.WriteLine(" 写作业!!!!!!!!");
}
}
class StudentDecoratorVideo: BaseDecorator
{
public StudentDecoratorVideo(AbstractStudent student) :base(student)
{
}
public override void study()
{
base.study();
Console.WriteLine(" 看视频");
}
}
static void Main(string[] args)
{
// 装饰器模式
AbstractStudent vip = new StudentVIP()
{
id = 888,
name = "xing"
};
//组合实例化
//BaseDecorator decoraor = new BaseDecorator(vip);
//decoraor.study();
//
//AbstractStudent decoraor2 = new BaseDecorator(vip);
//decoraor2.study();
//
//vip = new BaseDecorator(vip);
//vip.study();
vip = new StudentDecoratorVideo(vip);
vip = new StudentDecoratorHomework(vip);
vip = new StudentDecoratorAnswer(vip);
vip.study();
Console.ReadKey();
}
来源:oschina
链接:https://my.oschina.net/u/267603/blog/3173862