装饰模式:类的组合调用

来源:互联网 发布:plc编程软件安装不了 编辑:程序博客网 时间:2024/06/05 11:40

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