2003-11-9 19:01
无双
过几天再研究数据库 <br />1<br />什么是设计模式<br />设计就是解决方案<br />设计模式就是把一些常用的设计文档化<br /><br />2<br />开始入门<br />最开始的当然是那经典的MVC了<br />在每一本设计的书中都会看到<br />原因是MVC很实用<br />MVC M模型(对象) V它的视图 也就是界面部分 C控制 也就是操作方法<br />MVC最先在SMALLTALK中提出 由于把界面与控制分离 所以修改一部分 不会影响其它部分<br />如修改界面的实现 不需要你修改业务逻辑 <br />修改业务实现 不需要同时修改界因 所以被广泛使用<br />代码的维护也方便 因为V 与C是独立的 增加功能时都需要修改 分离后减少了耦合性 所以后面修改代码更方便<br />VC的D/V(文档视图结构)也是MVC的一种体现
2003-11-9 19:42
无双
2 接口与继承<br />接口就是定义了一个统一的功能 功能的具体实现由对应的实现者实现<br />如你调用一个方法 就知道这个方法会返回什么结果 无论是哪个类的对象都一样 你不必知道调用的是什么类的方法<br />如你想调用一个画菜单接口 那么就知道调用它一定会在屏幕上画出菜单 而不论现在是在UNIX或是在WINDOWS上 也不必知道现在是使用什么库来实现<br />如果用过JAVA那就会知道JAVA中有INTERFACE方法 它定义了一个操作的接口 其它类想实现那个功能时可以使用impletes实现它的功能 在JAVA中事件的响应等都是这样实现的<br />在C++中 接口是使用抽象类来实现 <br /><br />继承是共享数据与代码的一个方法 用于在两个有ISA关系的类间<br />ISA就是 是一个 如笔记本电脑ISA(是一个) 电脑 那它就有电脑的属性与方法<br />但是它是笔记本 那会有自己的特征 这些特征就放在子类中实现 电脑的特征就在电脑类中实现 这样就不会要笔记本电脑中还实现电脑的功能 有重复的代码了<br />另外子类中有些方便会改变 这时子类需要定义自己的接口代替父类中同名接口<br />在C++中 想让子类接口代替父类接口应该把对应的接口定义为virtual <br />如下<br /><!--c1--><div class='codetop'>CODE</div><div class='codemain'><!--ec1--><br />#include <iostream><br />using namespace std;<br /><br />struct A{<br /> void t(){<br /> cout<<" A"<<endl;<br /> }<br /> virtual~A(){<br /> cout<<" ~A"<<endl;<br /> }<br />};<br />struct B:public A<br />{<br /> virtual void t(){<br /> cout<<" B"<<endl;<br /> }<br /> ~B(){<br /> cout<<" ~B"<<endl;<br /> }<br />};<br />struct C:public B<br />{<br /> void t(){<br /> cout<<" C"<<endl;}<br /> ~C(){<br /> cout<<" ~C"<<endl;<br /> }<br />};<br /><br />main(){<br /> A a;<br /> B b;<br /> C c;<br /> cout<<"first use A* to call t()"<<endl;<br /> A*p=&a;<br /> p->t();<br /> p=&b;<br /> p->t();<br /> p=&c;<br /> p->t();<br /><br /> cout<<"now use B* to call t()"<<endl;<br /> B* v=&b;<br /> v->t();<br /> v=&c;<br /> v->t();<br /> cout<<"finally call destructor"<<endl;<br /> return 0;<br />}<br /><!--c2--></div><!--ec2--><br />输出如下<br /><!--c1--><div class='codetop'>CODE</div><div class='codemain'><!--ec1--><br />first use A* to call t()<br /> A<br /> A<br /> A<br />now use B* to call t()<br /> B<br /> C<br />finally call destructor<br /> ~C<br /> ~B<br /> ~A<br /> ~B<br /> ~A<br /> ~A<br /><!--c2--></div><!--ec2--><br />可以看到virtual从它定义的级别开始起作用<br />后面的析构是子类析构过程中调用父类析构<br /><br />在继承中把析构函数定义成virtual的原因是<br />在使用父类指针指向子类时 处理完后可以正确的调用对应的析构函数<br />如下<br /><!--c1--><div class='codetop'>CODE</div><div class='codemain'><!--ec1--><br />#include <iostream><br />using namespace std;<br /><br />struct A{<br /> void t(){<br /> cout<<" A"<<endl;<br /> }<br /> ~A(){<br /> cout<<" ~A"<<endl;<br /> }<br />};<br />struct B:public A<br />{<br /> void t(){<br /> cout<<" B"<<endl;<br /> }<br /> ~B(){<br /> cout<<" ~B"<<endl;<br /> }<br />};<br /><br />main(){<br /> A*p= new B();<br /> delete p;<br /> return 0;<br />}<!--c2--></div><!--ec2--><br />显示为<br /><!--c1--><div class='codetop'>CODE</div><div class='codemain'><!--ec1--><br /> ~A<br /><br /><!--c2--></div><!--ec2--><br /><br />第二次修改A中<br /> ~A(){<br />改成<br />virtual ~A(){<br />后<br /><!--c1--><div class='codetop'>CODE</div><div class='codemain'><!--ec1--><br /> ~B<br /> ~A<br /><br /><!--c2--></div><!--ec2--><br /><br />可以看到资源被正确释放<br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br />接口与继承的比较<br />接口中并没有实现代码 它只是说明这个接口会有什么功能 如何提供这个功能是实现这个接口的类的任务<br />继承中是子类继承代码 也就是子类共用父类的代码实现父类的功能 <br /><br /><span style='color:red'>针对接口编程 而不是针对实现编程</span><br />好处是<br />1 客户不必知道他们使用对象的特定类型 而只要对象有客户期望的接口<br />2 客户不必知道他们使用的对象是使用什么类来实现的 只须知道定义接口的抽象类<br />这样就减少了子系统实现间的依赖关系
2003-11-9 22:02
threehair
<!--QuoteBegin--><div class='quotetop'>QUOTE</div><div class='quotemain'><!--QuoteEBegin-->针对接口编程 而不是针对实现编程<!--QuoteEnd--></div><!--QuoteEEnd--><br />思想好。但是实现过程有些困难。<br />1 程序员的素质和经验。针对接口编程的要求更高<br />2 需要时间<br />假如一项工程时间很紧,为了赶进度,自然无法做到这点。所以这些工作需要平时积累。<br />毕竟公司有忙有闲,闲时就可以把一些常用的功能用针对接口编程实现<br /><br />所以不能指望临时抱佛脚 <!--emo&:grin:--><img src='style_emoticons/default/grin.gif' border='0' style='vertical-align:middle' alt='grin.gif' /><!--endemo-->
2003-11-9 23:29
无双
差不多 如果时间紧的话 那么几千是想到什么就写什么 很难写设计
2003-11-9 23:59
Bell
是啊,针对借口编程是很重要的。<br />接口里只有那些抽象的方法和没有实现的。<br />然后再去做一个实现接口的类。<br /><br />初一看标题,我以为是做“接口”(就是我原来用汇编做的东西)呢。 <!--emo&:)--><img src='style_emoticons/default/smile.gif' border='0' style='vertical-align:middle' alt='smile.gif' /><!--endemo--><br /><br />这个论题好,拿到其他网站上去推广、交流一下啊。<br /><br /><另>现在我总算会用管理工具了 <!--emo&:grin:--><img src='style_emoticons/default/grin.gif' border='0' style='vertical-align:middle' alt='grin.gif' /><!--endemo-->
2003-11-10 08:39
threehair
[QUOTE]现在我总算会用管理工具[CODE]<br />恭喜,我也是好不容易才会用的 <!--emo&:awkard:--><img src='style_emoticons/default/awkard.gif' border='0' style='vertical-align:middle' alt='awkard.gif' /><!--endemo--><br /><br /><br />哈哈 一样一样 <br />我昨天琢磨了一下午才会的 <!--emo&:huh:--><img src='style_emoticons/default/huh.gif' border='0' style='vertical-align:middle' alt='huh.gif' /><!--endemo-->
2003-11-10 15:29
weihello
<!--QuoteBegin-无双+2003-11-09 19:01:37--><div class='quotetop'>QUOTE(无双 @ 2003-11-09 19:01:37)</div><div class='quotemain'><!--QuoteEBegin--> 过几天再研究数据库 <br />1<br />什么是设计模式<br />设计就是解决方案<br />设计模式就是把一些常用的设计文档化<br /> <!--QuoteEnd--></div><!--QuoteEEnd--><br />设计并非解决方案。解决方案不过是设计模式的一个组成部分<br /><br /> 设计模式更不是设计,同时也非设计的文档化。<br /><br /> 设计模式是一种以模式语言描述的设计的核心。是高于设计的一种抽象,他不仅仅包括解决方案,个人认为最重要部分是意图。<br /> <br /> 设计不过是设计模式的一个具体应用而已。<br /> <br /> 模式中的解决方案不过是一个模版,并不描述具体的设计和实现。<br /><br /> 亚历山大: 设计模式是描述的一个在我们周围不断重复发生的问题,以及该问题的解决方案的核心。<br /><br /> 模式是一种语言。
2003-11-10 15:47
qinxj
我本来也想这样声明的,非常赞同weihello的说法:<br />设计模式是一些大师们总结出来的框框,大家熟悉了这些设计模式之后就可以利用它们为你的系统服务,减少一些重复的设计方法的考虑!<br /><br />希望以后大家对一些好的设计模式进行分析,用最最易懂的例子来说明这个模式的功能。希望大家都能对每一个设计模式了然于胸,这样子大家的设计水平就上升到了一定的高度。<br /><br />多用些时间在设计上,少用些时间在维护上!
2003-11-10 15:53
无双
嗯<br /><br />那大家一起来学习吧<br /><br />我想好的模式可以减少自己的开发与维护工作量
2003-11-10 17:45
Bell
?!<br />不对啊!!!<br />怎么回事?<br />我明明是引用 三毛姐姐的话,怎么成编辑她的帖子了?<br /><br /><br />三毛姐姐,我不是故意的啊!!! <!--emo&:cry:--><img src='style_emoticons/default/cry_smile.gif' border='0' style='vertical-align:middle' alt='cry_smile.gif' /><!--endemo--> <!--emo&:cry:--><img src='style_emoticons/default/cry_smile.gif' border='0' style='vertical-align:middle' alt='cry_smile.gif' /><!--endemo--> <!--emo&:cry:--><img src='style_emoticons/default/cry_smile.gif' border='0' style='vertical-align:middle' alt='cry_smile.gif' /><!--endemo--> <br />别生气!!<br />看来我还是不会用 ...
2003-11-10 18:01
threehair
<!--QuoteBegin-cheyenne+2003-11-10 17:45:23--><div class='quotetop'>QUOTE(cheyenne @ 2003-11-10 17:45:23)</div><div class='quotemain'><!--QuoteEBegin--> ?!<br />不对啊!!!<br />怎么回事?<br />我明明是引用 三毛姐姐的话,怎么成编辑她的帖子了?<br /><br /><br />三毛姐姐,我不是故意的啊!!! <!--emo&:cry:--><img src='style_emoticons/default/cry_smile.gif' border='0' style='vertical-align:middle' alt='cry_smile.gif' /><!--endemo--> <!--emo&:cry:--><img src='style_emoticons/default/cry_smile.gif' border='0' style='vertical-align:middle' alt='cry_smile.gif' /><!--endemo--> <!--emo&:cry:--><img src='style_emoticons/default/cry_smile.gif' border='0' style='vertical-align:middle' alt='cry_smile.gif' /><!--endemo--> <br />别生气!!<br />看来我还是不会用 ... <!--QuoteEnd--></div><!--QuoteEEnd--><br />没关系,哦不介意的。哦刚开始也不习惯,老把引用点成编辑 <!--emo&:grin:--><img src='style_emoticons/default/grin.gif' border='0' style='vertical-align:middle' alt='grin.gif' /><!--endemo-->
2003-11-10 18:10
Bell
还是咱们三毛姐姐好啊 !!!<br /><br /> <!--emo&:wub:--><img src='style_emoticons/default/wub.gif' border='0' style='vertical-align:middle' alt='wub.gif' /><!--endemo-->
2003-11-10 18:11
threehair
<!--QuoteBegin-cheyenne+2003-11-10 18:10:20--><div class='quotetop'>QUOTE(cheyenne @ 2003-11-10 18:10:20)</div><div class='quotemain'><!--QuoteEBegin--> 还是咱们三毛姐姐好啊 !!!<br /><br /> <!--emo&:wub:--><img src='style_emoticons/default/wub.gif' border='0' style='vertical-align:middle' alt='wub.gif' /><!--endemo--> <!--QuoteEnd--></div><!--QuoteEEnd--><br />8客气拉 <!--emo&:redface:--><img src='style_emoticons/default/icon_redface.gif' border='0' style='vertical-align:middle' alt='icon_redface.gif' /><!--endemo--> <br />你不会又是一个晚上没睡吧? <!--emo&:unsure:--><img src='style_emoticons/default/unsure.gif' border='0' style='vertical-align:middle' alt='unsure.gif' /><!--endemo-->
2003-11-10 22:46
Bell
哈哈,我一般上午睡觉,晚上工作。谢谢姐姐关心啊!<br /><br /> <!--emo&:rose:--><img src='style_emoticons/default/rose.gif' border='0' style='vertical-align:middle' alt='rose.gif' /><!--endemo-->
2003-11-11 00:21
无双
上面写到接口与继承<br />下面讲讲继承与组合还有参数化类<br /><br />继承与组合是两种策略<br /><br />都是为了代码的复用<br /><br />但是两个方法复用的方式不一样,继承是通过产生子类进行复用<br />这时子类必然知道父类的实现,因此叫“白箱复用”<br />由于知道父类实现,因此破坏了父类的封装性。<br /><br />组合是通过定义成员函数进行复用,类只能通过组合的类定义的接口进行访问<br />而不可以访问它的protected部分,也不必(不能)知道它的实现。所以叫“黑箱复用"<br /><br />组合就是使用已有的类来实现一个功能。<br />继承就是对某个类进行细化,它可以选择对某个行为进行细化<br /><br />原则是下面:(抄书上的)<br /> 优先使用组合而非继承<br />在继承中,改变父类的实现,就会影响对应的子类接口的实现,所以在修改时不是很方便<br />,但是组合因为只对接口进行调用,修改时不会影响什么子类,只会影响调用这个接口的地方,改动比较方便<br /><br /><br />委拖是组合的一个特例,就是一个对象把接收到的请求交给另一个对象进行处理。<br /><br /><br /><br />参数化类,参数化类使用的技术是模板(在C++中,STL的容器就是一个典型例子)就是把某些结果只与类型相关,而与过程无关的东西放在一起。如<br />a=a+b , 如果定义了两个类,Intger Float,<br />struct Int{<br /> int i;<br />};<br />struct Float{<br />int i;<br />};<br /><br />这时要定义这两个类的Add,如果使用普通方法的话需要写两份代码,一份是<br />Int Add(const Int&a, const Int& B){<br />Int c;<br />c.i = a.i+b.i;<br />return c;<br />}<br /><br />同样还要定义一个参数是Float类型的同样代码的函数,是不是觉得有点累,而且以后还要维护两套同样的代码(如果BOSS是靠代码行类计算的话<br />那可以放心这样写)<br />使用模板就不必这么麻烦了。你可以定义如下<br />template <class T><br />T Add(const T&a,const T&b)<br />{<br /> T c;<br /> c.i=a.i|b.i;<br /> return c;<br />}<br />OK <br /><br /><br />三种方法比较<br />从代码编写上来说,继承是最快的,如果你不想实现某个类的所有接口,那只要从它继承就可以了。但是破坏了封状性,修改父类就会影响子类,维护性不是很好。并且是编译时就指定,无法运行时改变功能。(如if<br />a then b这样)<br />组合是使用一组对象来实现一个功能。性能方面比不上继承,但是修改一个类不会影响其它类,另外可以运行时指定(你可以在运行时指定由哪个对象来处理)。另外由于需要运行时才指定对象,所以有低效性问题(如果想完全高效那当然是使用C或是ASM了<br />所以这方面不用担心)<br />参数化类型(也就是模板)是定义一组除了类型外其它没有什么不同的操作的好方法,无论是维护还是开发上都不错。
2003-11-12 01:26
无双
<span style='color:red'>23个模式说明</span><br /><br />在这里将会大概的说明一下23个模式<br />后面会对每一个模式进行详细的介绍<br /><br />在这里可能会有写错的 欢迎大家指正<br /><br />Abstract Factory抽象工厂<br />向客户提供一个接口 让客户在不必指定产品的具体类型的情况下, 创建多个产品族中的产品对象。<br />因为这些产品族是一起工作的,所以使用抽象工厂更方便,在书中举的例子是有门、房间、墙的党宫组件<br /><br />Adapter适配器 把一个类的接口转换成用户希望的另一个接口,最简单的联想是和重命名类似的东东。<br />Bridge 桥接 ,把抽象部分与实现部分分离,使他们可以独立的变化。实现部分提供接口供抽象部分调用。bridge是使用组合而不是继承的体现。这里转了一篇文章,可以对照着理解。<br /><br />builder 生成器
2003-11-12 10:41
大菠萝
这个是抽象工厂的UML图,是rose帮助里的,呵呵
2003-11-12 10:45
无双
写得很详细<br />大菠萝兄你在哪里找到的<br /><br />我什么没看到呢
2003-11-12 10:53
大菠萝
在我的C:\Program Files\Rational\Rose\designpattern中
2003-11-12 11:01
无双
找到了<!--emo&:)--><img src='style_emoticons/default/smile.gif' border='0' style='vertical-align:middle' alt='smile.gif' /><!--endemo-->
2003-11-12 11:07
大菠萝
强烈建议无双按照图来讲,随便还可以讲讲UML的图示含义,一举两得
2003-11-12 11:13
无双
我是先想写个大概介绍<br />后面再写每个模式的具体内容与实现<br /><br />写到模式具体内容时会开每个模式开一个新贴的
2003-11-12 13:42
qinxj
严重同意,无双兄来开头,我们就来和一和!
2003-11-12 13:57
无双
好啊<br />现在开始看<br /><br />我想总会有很多不足的地方<br />后面再继续进行补充与讨论<br /><br />一起学习
页:
[1]
2
Powered by Discuz! Archiver 5.5.0
© 2001-2006 Comsenz Inc.