1.装饰类
namespace Data
{
/* 一般情况下,当一个基类写好之后,我们也许不愿意去改动,也不能改动,原因是
* 这样的在项目中用得比较久的基类,一旦改动,也许会影响其他功能模块,但是,
* 又要在该类上面添加功能。使用继承,当在A阶段,写出继承类,用过一段时间,发
* 现又要添加新功能,于是又要从原始类或A阶段的类继承,周而复始,慢慢的,子类
* 就越来越多,层级就越来越深。然而,事实上,在C阶段需要A阶段的功能,但不需要
* B阶段的功能,在这种复杂情形下,继承就显得不灵活,于是想到了装饰模式。
* 装饰模式:
* 需要扩展一个类的功能,或给一个类增加附加责任
* 需要动态地给一个对象增加功能,这些功能可以再动态地撤销。
* 需要增加由一些基本功能的排列组合而产生的非常大量的功能,从而使继承关系变得不现实。
*
* 在使用装饰模式前,需要了解虚方法和抽象方法的区别:虚方法,是实例方法,可以在子类中
* 覆盖,也可以由该类对象直接调用。抽象方法需要写在抽象类中,抽象类不能实例化,所以要
* 使用抽象方法必须由子类实现后方可调用。
*
* 该模式中,要被扩展的类可以是包含抽象方法的抽象类,也可以是包含虚方法的实例类,也可
* 以是普通实例类。装饰模式就是在原有基类上做扩展,至于基类是什么性质并不重要.
* */
/// <summary>
/// 操作数据库的类,利用Decorate类动态给OperateDB添加功能
/// </summary>
public class OperateDB
{
public virtual string OperateData()
{
return null;
}
}
/// <summary>
/// 装饰类
/// </summary>
public class DecoratePatterns : OperateDB
{
private OperateDB operateDB;
public string result = null;
public void Decorate(OperateDB operateDBObj)
{
operateDB = operateDBObj;
}
public override string OperateData()
{
result = operateDB.OperateData();
return result;
}
}
/// <summary>
/// 添加
/// </summary>
public class InsertDecorate : DecoratePatterns
{
public override string OperateData()
{
base.OperateData();
NorthwindEntities db = new NorthwindEntities();
Employees e = new Employees();
e.LastName = "chuanshi_yoyo_yoyo";
e.FirstName = "zhushao";
db.AddToEmployees(e);
db.SaveChanges();
return result + "添加数据成功\n";
}
}
/// <summary>
/// 修改
/// </summary>
public class UpdateDecorate : DecoratePatterns
{
public override string OperateData()
{
base.OperateData();
NorthwindEntities db = new NorthwindEntities();
Employees e = db.Employees.Where(c => c.EmployeeID == 42).FirstOrDefault();
e.LastName = "yo_shao";
db.SaveChanges();
return result + "修改数据成功\n";
}
}
/// <summary>
/// 删除
/// </summary>
public class DelDecorate : DecoratePatterns
{
public override string OperateData()
{
base.OperateData();
NorthwindEntities db = new NorthwindEntities();
Employees e = db.Employees.Where(c => c.EmployeeID == 42).FirstOrDefault();
db.DeleteObject(e);
db.SaveChanges();
return result + "删除数据成功\n";
}
}
}
2.调用
static void Main(string[] args)
{
OperateDB db = new OperateDB();
InsertDecorate insert = new InsertDecorate();
UpdateDecorate update = new UpdateDecorate();
DelDecorate del = new DelDecorate();
//装饰顺序.本质上,只是类的组合而已
insert.Decorate(db);
update.Decorate(insert);
del.Decorate(update);
Console.WriteLine(del.OperateData());
Console.ReadKey();
}