目录
一、模板方法
二、钩子方法
三、代码实例一
四、代码实例二
UML图
定义一个操作中的算法骨架,将一些步骤延迟到子类。模板方法使得子类不改变算法结构即可以重新定义某些具体步骤。
在实际中的应用,比如说有一个接口,这个接口里有7个方法,而你只想用其中一个方法,那么这时,你可以写一个抽象类实现这个接口,在这个抽象类里将你要用的那个方法设置为abstract,其它方法进行空实现,然后你再继承这个抽象类,就不需要实现其它不用的方法,这就是钩子方法
可能是数据库版本或者其他玄学问题,别人的可以连接我的不行,修改了一个中午,终于找出问题改出来了。
先贴代码,后续把数据库连接过程、以及一些问题再总结一下。
第一个类:
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.OleDb;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 模板方法模式二
{
class CustomerDbObject:DatabaseObject
{
private string ConnenctString = "Provider=Microsoft.Jet.OLEDB.4.0 ;Data Source=D:\\Database4.mdb";
private string CommandString;
private DataSet dataSet=null;
public override void Connect()
{
Console.WriteLine("ddddd");
}
public override void DisConnect()
{
Console.WriteLine("ddddd");//
}
public override void Process()
{
DataTable dataTable = dataSet.Tables["Customer"];
Console.WriteLine("processss");
//dataTable.Rows;
foreach (DataRow dataRow in dataTable.Rows)
Console.WriteLine(dataRow["CompanyName"]);
//Console.WriteLine(x.StackTrace);
}
public override void Select()
{
OleDbConnection connetion = new OleDbConnection(ConnenctString);
connetion.Open();
CommandString = "select CompanyName from Customer";
Console.WriteLine("processss");
OleDbDataAdapter dataAdapter = new OleDbDataAdapter(CommandString, connetion);
dataSet = new DataSet();
dataAdapter.Fill(dataSet, "Customer");
}
}
}
第二个类:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 模板方法模式二
{
abstract class DatabaseObject
{
abstract public void Connect();
abstract public void Select();
abstract public void Process();
abstract public void DisConnect();
//模板方法
public void run()
{
Connect();
Select();
Process();
DisConnect();
}
}
}
测试类:
using System;
using System.Collections.Generic;
using System.Data.OleDb;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace 模板方法模式二
{
static class Program
{
///
/// 应用程序的主入口点。
///
[STAThread]
static void Main()
{
CustomerDbObject ma = new CustomerDbObject();
ma.run();
Console.WriteLine("gfff");//
// OleDbDataAdapter a;
//Application.EnableVisualStyles();
// Application.SetCompatibleTextRenderingDefault(false);
//Application.Run(new Form1());
}
}
}
最终结果:读出的数据用箭头所示。
多加一个窗口类,等有时间再改一下代码,简略实现一下。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace 模板_登录
{
public partial class Form1 : Form
{
string count;
string pwd;
public Form1()
{
InitializeComponent();
}
private void textBox2_TextChanged(object sender, EventArgs e)
{
pwd = textBox2.Text.ToString();
}
private void label1_Click(object sender, EventArgs e)
{
}
private void textBox1_TextChanged(object sender, EventArgs e)
{
count = textBox1.Text.ToString();
}
private void label2_Click(object sender, EventArgs e)
{
}
private void button1_Click(object sender, EventArgs e)
{
Database_Edit ma = new Database_Edit();
ma.run();
Form2 f = new Form2();
if (ma.GetPwd() == pwd)
f.Show();
}
private void Form1_Load(object sender, EventArgs e)
{
}
}
}
咖啡冲泡法: 把水煮沸 用沸水冲泡咖啡 把咖啡倒进杯子 加糖和牛奶
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 模板咖啡牛奶
{
abstract class Drink
{
public abstract void Boil0();
public abstract void Boil1(string str);
public abstract void Boil2(string str);
public abstract void Boil3(string str);
public abstract void run();
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 模板咖啡牛奶
{
class Coffee : Drink
{
public override void Boil0()
{
Console.WriteLine("烧开水");
}
public override void Boil1(string str)
{
Console.WriteLine("用沸水冲泡"+str);
}
public override void Boil2(string str)
{
Console.WriteLine("把" + str+"倒入杯子中");
}
public override void Boil3(string str)
{
Console.WriteLine("加" + str );
}
public override void run()
{
Boil0();
Boil1("coffee");
Boil2("coffee");
Boil3("coffee");
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 模板咖啡牛奶
{
class Milk:Drink
{
public override void Boil0()
{
Console.WriteLine("烧开水");
}
public override void Boil1(string str)
{
Console.WriteLine("用沸水冲泡" + str);
}
public override void Boil2(string str)
{
Console.WriteLine("把" + str + "倒入杯子中");
}
public override void Boil3(string str)
{
Console.WriteLine("加" + str);
}
public override void run()
{
Boil0();
Boil1("coffee");
Boil2("coffee");
Boil3("coffee");
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace 模板咖啡牛奶
{
static class Program
{
///
/// 应用程序的主入口点。
///
[STAThread]
static void Main()
{
Drink tmp = new Coffee();
tmp.run();
tmp = new Milk();
tmp.run();
}
}
}