填写数据库表
利用这些派生类,可以编写一个类从数据文件读数据填到表中。该类一旦要读文件,就先构建 Stores和Foods数据库表:然后反复读取文件,查找商店关键字和食品关键字,并将它们加到Prices 类的数组表中,最后创建Prices表。
public classDataLoader
{
private csFile vfile;
private Stores store;
private Foods fods;
private Prices price;
private DBase db;
public DataLoader(DBase dtable)
{
db=dtable;
store=new Store(db);
fods=new Foods(db);
price=new Prices(db);
}
public void Load(string dataFile)
{
string sline;
int storekey,foodkey;
StringTokenizer tok;
store.delete();
fods.delete();
price.delete();
vfile=new csFile(dataFile);
vfile.OpenForRead();
vfile=vfile.readLine();
sline=vfile.readLine();
while(sline!=null)
{
tok=new StriingTokenizer(sline,",");
store.addTableValue(tok.nextToken());
fods.addTableValue(tok.nexToken());
sline=vfile.readLine();
}
vfile.close();
store.makeTable();
fods.makeTable();
vfile.OpenForRead();
sline=vifle.readLine();
while(sline!=null)
{
tok=new StriingTokenizer(sline,",");
storekey=store.getkey(tok.nextToken(),"StoreKey");
foodkey=fods.getkey(tok.nextToken(),"Foodkey");
price.addRow(storekey,foodkey,Convert.ToSingle(tok.nextToken());
sline=vfile.readLine();
}
price.makeTable();
vfile.close();
}
}
最终的应用程序
程序一开始运行,就将一个食品价格表填到一个列表框中。
private void loadFoodTable()
{
Foods fods=new Foods(db);
fods.openTalbe();
while(fods.asMoreElements())
{
lsFoods.Items.Add(fods.getValue());
}
}
单击某个食品名,显示选中食品的价格。
private void lsFoods SelectedIndexChanged(object sender,System.EventArgs e)
{
string food=lsFoods.Text;
DataTable dtable=prc.getPrices(food);
lsPrices.Items.Clear();
foreach(DataRow rw in dtable.Rows)
{
lsPrices.Items.Add(rw["StoreName"].ToString().Trim()+"\t"+rw["Price"].ToString());
}
}
Facade的效果
外观模式对客户屏蔽了复杂的子系统组件,并为一般用户提供了一个比较简单的程序设计接 口。但是,它并没有限制高级用户在需要时使用深层的、较复杂的类。
另外,Facade允许读者改变底层的子系统而不需要修改客户代码,降低了编译依赖性。

