请教大牛这个面向对象设计是否合理 本帖最后由 caozhy 于 2012-01-03 19:54:56 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 早上又修改了下 public abstract class BaseClass { public virtual string GetTemplate(string page) { return string.Empty; } protected string ReadTemplate(int levelID, string page) { string result = string.Empty; string path = HttpContext.Current.Server.MapPath("/Template/" + levelID + "/" + page + ".html"); if (!File.Exists(path)) return result; StreamReader sr = null; try { sr = new StreamReader(path, Encoding.GetEncoding("gb2312")); result = sr.ReadToEnd(); } catch { } finally { if (sr != null) { sr.Close(); sr.Dispose(); } } return result; } } public class Diamond : BaseClass { private int levelID; public Diamond(int levelID) { this.levelID = levelID; } public override string GetTemplate(string page) {//由于钻石会员相对比较重要,会在此处加入缓存读取模板 return base.ReadTemplate(levelID, page); } } public class Gold : BaseClass { private int levelID; public Gold(int levelID) { this.levelID = levelID; } public override string GetTemplate(string page) { return base.ReadTemplate(levelID, page); } }//....其他两个会员类结构和上面差不多//模板工厂 public class TemplateFactory { public static BaseClass GetTemplate(int levelID) { BaseClass baseClass = null; switch (levelID) { case 1: baseClass = new Diamond(levelID); break; case 2: baseClass = new Gold(levelID); break; case 3: baseClass = new Silver(levelID); break; case 4: baseClass = new General(levelID); break; default: baseClass = new General(10000); break; } return baseClass; } }//页面工厂 public class PageFactory { private string page; private BaseClass baseClass; public PageFactory(string page, BaseClass baseClass) { this.page = page; this.baseClass = baseClass; } public string GetPage() { string template = string.Empty; switch (this.page) { case "Index": template = this.baseClass.GetTemplate(this.page); return template;//这里通过替换相对内容返回。 default: return template; } } }//页面调用 protected void Page_Load(object sender, EventArgs e) { if (!string.IsNullOrEmpty(Request.QueryString["ID"]) && Common.RegexCommon.IsNumber(Request.QueryString["ID"])) { int CID = Convert.ToInt32(Request.QueryString["ID"]); string page = string.IsNullOrEmpty(Request.QueryString["Page"]) ? "Index" : Request.QueryString["Page"]; Model.CompanyTbl model = new Class.ComponentsDB().GetCompanyModel(CID); if (model != null) { BaseClass baseClass; if (model.CompPassed > 0) baseClass = TemplateFactory.GetTemplate(model.LevelID); else baseClass = TemplateFactory.GetTemplate(4); PageFactory resultPage = new PageFactory(page, baseClass); Response.Write(resultPage.GetPage()); } } }这样的设计是否合理? 谢谢大侠的评论。这里我理解的对象是会员,每个会员都有对应等级,不同level的会员模板不一样。恩 不要为了模式而模式,就像不要为了三层而三层,这点我理解我只想做点更面向对象一点。请问该怎么做呢? 没有真正看你的代码,简单地扫了一下。起码地,面向对象的设计不会在对象有不同的扩展类型时搞一个大 switch。这是最基本的。 面向对象的设计,是封装好了关于继承和多态的机制,在新的子类出现的时候,不是一次次重写父类里边的switch代码。实际上,父类往往是以前的运行很好的框架系统,甚至是买来的产品,你不过是作出各种扩展的子类而已,你的老板可能也根本不允许你去修改之前的人编译好的代码。你又怎么去修改人家的switch代码? 重新用面向对象的思路去理解应用领域业务模型。这可以在一张纸上画出你遇到过的各种对象的UML类图之类的来在作为入门练习。实际上对对象(类)进行静态建模只占面向对象设计技术得不到百分之十五(更多时间要进行动态建模和功能建模),但是这百分之十五的知识,许多人也是花了3、5年才理解明白。 谢谢p哥的回复,关于其中有一点说到switch的。这点我有想到,可是不知道该怎么改比如会员有钻石会员,金牌会员,银牌会员,普通会员这四个,如果不通过switch来判断等级,然后实例化对应会员的类,我不知道该怎么改。还有一个页面的。会员模版有首页,评论页,新闻列表页等等,通过判断Request.QueryString来读取相应模版。这边也是通过swtich来列举判断的,也同样不知道该有什么好的方法来做。请sp大哥有空帮忙下! 非要探究合理本身就不合理“破釜沉舟”在项羽手上那是“破釜沉舟”,换个人用,换个环境用那是“自绝后路”“自毁长城”“退避三舍”在重耳手里那是王霸之道,换个人用,换个环境也许就是取死之道为啥我们这些人一般都不讨论这问题那是因为“兵无长势,水无长形”,这个东西是运用之妙,存乎一心的东西,根本没办法讲。假设东西出来了,然后在说啥,那是马后炮无意义。而像设计模式那本书,为了说明那个问题,而强行构造一个东西,其实也无意义(这也是设计模式相关书籍的通病,为了如此而如此,为了形式而形式,结果就是通常的结果就是lz这样了一定要求最合理滴,而非GOF滴就一定不是最好滴) 把握这个核心,其余手段皆可不计ps:其实面对对象并非万能,在这个领域只要你自己把握上面的核心规则,其他的手段都可以用,非Gof可以用,依赖配置可以用,解析式,函数式,声明式,其实都可以用。 VS2008制作安装包时不可避免的问题?请赐教! c# winfrom 使用远程数据库 *** 2个问题:1.C#发布后,.cfg配置文件能看到数据库信息(包括密码),怎么解决?2... 各高手请进,关于数据传输程序 c#中怎样在html页面获取对应的cs文件中定义的属性值 [百分相送]C#可以使用COM组件的吧,那怎么用C#编写DirectShow的程序呢? 理解一下程序 软件场景分析之停车场 关于控件中捕捉鼠标操作的相关问题请大家帮忙解答 如何快速得到局域网上的机器ip列表? c#怎样换行定义字符串 取周别范围
{
public virtual string GetTemplate(string page)
{
return string.Empty;
}
protected string ReadTemplate(int levelID, string page)
{
string result = string.Empty;
string path = HttpContext.Current.Server.MapPath("/Template/" + levelID + "/" + page + ".html");
if (!File.Exists(path))
return result;
StreamReader sr = null;
try
{
sr = new StreamReader(path, Encoding.GetEncoding("gb2312"));
result = sr.ReadToEnd();
}
catch
{
}
finally
{
if (sr != null)
{
sr.Close();
sr.Dispose();
}
}
return result;
}
}
public class Diamond : BaseClass
{
private int levelID;
public Diamond(int levelID)
{
this.levelID = levelID;
}
public override string GetTemplate(string page)
{
//由于钻石会员相对比较重要,会在此处加入缓存读取模板
return base.ReadTemplate(levelID, page);
}
}
public class Gold : BaseClass
{
private int levelID;
public Gold(int levelID)
{
this.levelID = levelID;
}
public override string GetTemplate(string page)
{
return base.ReadTemplate(levelID, page);
}
}
//....其他两个会员类结构和上面差不多
//模板工厂
public class TemplateFactory
{
public static BaseClass GetTemplate(int levelID)
{
BaseClass baseClass = null;
switch (levelID)
{
case 1:
baseClass = new Diamond(levelID);
break;
case 2:
baseClass = new Gold(levelID);
break;
case 3:
baseClass = new Silver(levelID);
break;
case 4:
baseClass = new General(levelID);
break;
default:
baseClass = new General(10000);
break;
}
return baseClass;
}
}
//页面工厂
public class PageFactory
{
private string page;
private BaseClass baseClass;
public PageFactory(string page, BaseClass baseClass)
{
this.page = page;
this.baseClass = baseClass;
}
public string GetPage()
{
string template = string.Empty;
switch (this.page)
{
case "Index":
template = this.baseClass.GetTemplate(this.page);
return template;//这里通过替换相对内容返回。
default:
return template;
}
}
}
//页面调用
protected void Page_Load(object sender, EventArgs e)
{
if (!string.IsNullOrEmpty(Request.QueryString["ID"]) && Common.RegexCommon.IsNumber(Request.QueryString["ID"]))
{
int CID = Convert.ToInt32(Request.QueryString["ID"]);
string page = string.IsNullOrEmpty(Request.QueryString["Page"]) ? "Index" : Request.QueryString["Page"];
Model.CompanyTbl model = new Class.ComponentsDB().GetCompanyModel(CID);
if (model != null)
{
BaseClass baseClass;
if (model.CompPassed > 0)
baseClass = TemplateFactory.GetTemplate(model.LevelID);
else
baseClass = TemplateFactory.GetTemplate(4);
PageFactory resultPage = new PageFactory(page, baseClass);
Response.Write(resultPage.GetPage());
}
}
}这样的设计是否合理?
恩 不要为了模式而模式,就像不要为了三层而三层,这点我理解
我只想做点更面向对象一点。
请问该怎么做呢?
重新用面向对象的思路去理解应用领域业务模型。这可以在一张纸上画出你遇到过的各种对象的UML类图之类的来在作为入门练习。实际上对对象(类)进行静态建模只占面向对象设计技术得不到百分之十五(更多时间要进行动态建模和功能建模),但是这百分之十五的知识,许多人也是花了3、5年才理解明白。
这点我有想到,可是不知道该怎么改
比如会员有钻石会员,金牌会员,银牌会员,普通会员这四个,如果不通过switch来判断等级,然后实例化对应会员的类,我不知道该怎么改。
还有一个页面的。
会员模版有首页,评论页,新闻列表页等等,通过判断Request.QueryString来读取相应模版。
这边也是通过swtich来列举判断的,也同样不知道该有什么好的方法来做。
请sp大哥有空帮忙下!
把握这个核心,其余手段皆可不计ps:其实面对对象并非万能,在这个领域只要你自己把握上面的核心规则,其他的手段都可以用,非Gof可以用,依赖配置可以用,解析式,函数式,声明式,其实都可以用。