模板模式
看到有博主说,如果你只想掌握一种设计模式,那一定是模板模式,可见这个模式,很好用啊。模板模式定义了整体的操作流程,而不需要指定具体的代码逻辑,讲这些代码逻辑放到子类中去实现,自己作为抽象方法来代替,保证了主体。
比如对数据库进行操作的时候,无论如何操作,大致步骤都为1.连接 2.执行数据库语句 3.将执行(如果为查询的话)后的数据展示出来 4.断开连接
再比如玩游戏的时候,大致步骤总是:1.初始化游戏 2.开始游戏 3.游戏中 4.结束游戏
对于上方提到的例子,都有一个共同点,内部无论是SQL语句的书写,还是游戏的内容与过程都无法固定,但是操作的流程正如上方所示,如果每执行一次就从头写一遍整个过程,显然代码重复太多,后期维护也自己观察也闹心,模板模式就给了一种良好的解决方案。
//最好使用protected,让继承的类内部可访问,而实例出来的无法调用(因为我们需要他调用模板即可,不要随意,形成规范) public abstract class DataAccessObject { protected string connectionString; protected DataSet ds ; protected string _selectSQl; //有默认实现给virtual,都需要子类实现给abstract protected virtual void Connect() { Console.WriteLine("设置连接"); connectionString = "Server=.;User Id=sa;Password=;Database=Northwind"; } protected abstract void Select(string selectSQl);//查询 protected abstract void Display();//展示 protected virtual void Disconnect() { Console.WriteLine("断开连接"); connectionString=""; } public void Run() { Connect(); Select(_selectSQl); Display(); Disconnect(); } }
#region 具体实用类 class Categories : DataAccessObject { protected override void Select(string selectSQl) { Console.WriteLine("执行Select"); //_selectSQl = selectSQl; //SqlDataAdapter sqldataadapter = new SqlDataAdapter(_selectSQl,connectionString); //ds = new DataSet(); //sqldataadapter.Fill(ds); } protected override void Display() { Console.WriteLine("执行Display"); //DataTable dataTable = ds.Tables["table1"]; //foreach (DataRow row in dataTable.Rows) //{ // Console.WriteLine(row["CategoryName"].ToString()); //} } } #endregion
static void Main(string[] args) { DataAccessObject dao1 = new Categories(); dao1.Run(); Console.ReadKey(); }
就是定义主体步骤,但是各个步骤逻辑由子类实现!这就是模板模式!