设计模式
逝流水
这个作者很懒,什么都没留下…
展开
-
设计模式-初始
为了提高自己的需要,需要学习一下设计GOF的设计模式,设计模式是一种我们常用方法的高度抽象,是一种思想的体现。我们经常听说的j2ee,便是基于这个的实现。要想读懂j2ee框架,学习这个是必要的。 “学习设计模式,知其然不知其所以然,在自己设计系统时,种种的原因让自己苦不堪言,领悟到设计模式的某种方法,最终设计出完美的系统,向别人讲解设计模式,别人向你咨询设计模式,和别人讨论设计模原创 2012-10-16 11:45:55 · 319 阅读 · 0 评论 -
设计模式之十五------State(状态)
问题:在开发中,我们经常遇到根据不同的状态做出不同的反应的问题。我们采取的常用方法就是Switch或者if...else if ..else 语句。这样就造成了大量的分支。如果新的状态添加进来,我们需要重新编译这个模块的代码;解决方案:我们把这些分支抽象出来,让它成为一个独立的接口State,让每个分支实现这个接口。在另外创建一个类Content,这个类组合接口,提供调用接口的方法;并原创 2012-10-24 12:47:43 · 507 阅读 · 0 评论 -
设计模式之十六------Observer(观察者)
问题:当一个对象状态发生改变时,我们时常要通知其他对象,说明这个对象发生了改变,让其他对象做出反应;解决方案:观察者模式正是解决这种问题的不二之选,观察者模式完美的将观察者和被观察的对象分离开。被观察的发生改变时,观察者做出更新。观察者与被观察者之间不能是直接的类的调用,否则就会将两者耦合起来,使用接口或者纯虚类是解决问题的好办法;#include #include #原创 2012-10-24 20:02:24 · 664 阅读 · 0 评论 -
设计模式之十九------Command(命令)
问题:我们经常遇到这样的问题:向服务器发送一个请求,服务器响应你的请求,处理你的请求,返回数据;对于这样的问题,我们应该选择什么样的模式,来处理这个问题?解决方案:定义一个Invoker类,这个类组合Command接口(降低系统的耦合),当需要发送请求时,直接调用Command接口提供的方法。Command实现类组合他们自己的接受者(Receive);这样工作流程就是:Invoke原创 2012-10-26 09:59:04 · 463 阅读 · 0 评论 -
设计模式之十七------Memento(备忘录)
问题:在状态转换过程中,可能由于某种原因需要恢复到之前的状态;这就需要们保存对象的状态;但是应该怎么实现呢?解决方案:需要三个类来解决这个问题:Originator:“备忘发起角色”创建一个备忘录,用以记录当前时刻它的内部状态。在需要时使用备忘录恢复内部状态。 Memento:备忘录角色存储“备忘发起角色”的内部状态。 Caretaker:负责保存好备忘录。不能对原创 2012-10-25 20:03:59 · 412 阅读 · 0 评论 -
设计模式之十八------Mediator(中介者)
问题:在类的交互中,如果有多个类,他们之间需要相互调用,那么每个类都需要持有其他的类;这样他们之间的关系十分复杂,并且占用大量的内存空间;解决方案:建立一个中介机构,这个中介机构类持有所有的这些类。所有的类持有这个中介机构。类需要交互时,只需要和这个中介机构进行交互就足矣了,中介机构负责和其他类交互;这样就把多对多转化成了一对多;复杂度大量降低了。实现代码如下: #incl原创 2012-10-25 21:40:14 · 409 阅读 · 0 评论 -
设计模式之二十------Visitor(访问者)
问题:在软件生命周期中,最经常变化的就是需求,需求的变化造成系统频繁的变动。对于一组类,由于需求的变化,它们也需要经常变化,需要经常编译。这样的结果是系统永远也不可能封闭;解决方案:Visitor:这是一个接口,每次需求的变动,都是从这个接口继承出来的;ConcreateVisitor:实现接口的类,里面封装了变化的需求;Element:需求的抽象,抽象出来的接口;Conc原创 2012-10-26 21:13:44 · 370 阅读 · 0 评论 -
设计模式之二十一------ chain of responsibility(责任链)
问题:在程序设计过程中,我们经常需要处理消息,有时一个消息可能需要经过多次处理,才能结束;学过J2EE,都知道里面有过滤器,请求进来处理之前,都需要经过过滤器的多次过滤;对于这种问题,我们应该怎么设计呢?解决方案:Handler:把这些处理过程抽象出来,抽象成一个接口,就是Handler。每个处理类都继承自这个接口;这接口应该组合它本身,为了提交到下一个对象;ConcreateHa原创 2012-10-26 22:12:52 · 447 阅读 · 0 评论 -
设计模式之二十二------ Iterator(迭代器)
问题:在我们编码过程中,我们经常需要操作集合,例如数组;当设计的类中存在这样一个集合,我们应该用什么样的方法来访问它,并且不暴露这个聚合对象的内部表示;解决方案:迭代器模式是这个问题的首选方案:Iterator:抽象出来对集合操作的接口;例如:First(),Next()。ConcreateIterator:这个类实现Iterator接口,对特定的类进行操作;Aggrega原创 2012-10-27 10:03:28 · 405 阅读 · 0 评论 -
页面对象总结
八大对象:Application session request page response config pageContent一、如果在jsp页面内:八大对象随便用,不需要获取: application,session,request,page,pageContext,response,config,out; %>在转化为servlet时,里面有内置对原创 2012-11-08 18:17:26 · 430 阅读 · 0 评论 -
设计模式之八------Decorator(装饰)
问题:当我们想给一个现存的类添加新的功能的时候?我们可能想到的方法就是通过继承方式,向新的类中添加功能。毫无疑问这可以实现这个目的,但是需要添加的功能的类很多时候我们还用这种方式,会造成大量的子类。这种方式就不太适用了,我们该怎么办呢?解决方案:考虑到,这些需要添加功能的类,都用统一的接口,我们可以新建一个类,这个类实现这个接口,并组合这个接口,并在这个类中添加我们需要的功能。这样客户端就原创 2012-10-21 11:58:44 · 365 阅读 · 0 评论 -
设计模式之十二------Proxy(代理)
问题:有一组类共同实现一个借口,我们想对它们加以控制,例如延时执行之类的。如果为每个类都加上这个方法,这样会让继承体系变得更大。让系统变得冗余;解决方案:我们可以提供一个代理类,让这个代理类实现这个接口,并添加控制操作;代理成为这个中介。这就是代理模式比较:以前学过一个Decorator,和这个比较类似。但是他们还是有区别的:代理:为其它对象提供一种代理以控制对这个原创 2012-10-23 10:19:26 · 332 阅读 · 0 评论 -
设计模式之十一------Facade(外观)
问题:在实际应用中,我们可能封装了很多类,但是这些类只是一个业务的各个步骤,如果让客户端一个一个去调用这些接口,是非常繁琐的一件事。我们应该简化客户端的操作。解决方案:我们可以设计一个类:这个类组合了所有的必须的类,然后在一个方法中调用所有的实现,并把这个类提供给客户端,这就是Facade模式(外观)源代码://This a programme about facade#i原创 2012-10-23 08:58:46 · 424 阅读 · 0 评论 -
设计模式之一 ------Factory
设计模式之一 ------Factory问题:在实际中,我们可能从基类中派生出若干的子类,让使用者记住各种各样子类,是很麻烦和繁琐的解决方案:为了让使用者方便使用,可以使用工厂管理这些实现类。如果工厂基类不知道创建哪个产品,而是子类知道,就要用到工厂基类。让工厂实现类来创建产品场景描述:朋友一起喝咖啡,朋友点不同的咖啡;这些咖啡由咖啡厅制作;朋友可以通过咖啡厅要不同的咖啡;Fa原创 2012-10-16 13:01:09 · 281 阅读 · 0 评论 -
设计模式之三 ------Singleton
设计模式之三 ------Singleton问题:假设我们电脑只有一个打印机,我们用一个类来管理打印机资源,如果像一般的类一样,使用者可以创建多个类的实例,那么势必会造成系统资源的大量浪费,为了达到节约资源的目的,我们需要寻找一个新的方法;解决方案:我们在类内创建一个静态的本类指针,初始化的时候为其赋值,以后使用者用的时候,直接放回这个指针就行了;由于使用者调用的是静态方法,不需要类的原创 2012-10-17 19:25:04 · 343 阅读 · 0 评论 -
设计模式之二 ------AbstractFactory
设计模式之一 ------AbstractFactory问题:有很多基类,这些基类派生出各自的类,并且基类派生出来的类的个数相等,我们要用多个工厂管理每个基类的中各个子类(说起来有点拗口,可以用一张图来表示)解决方案:把这些共同点抽象出来,就是把创建对象的方法抽象出来,这就是抽象工厂场景描述:我们程序猿经常玩游戏,例如魔兽RPG,进入游戏后让你选择游戏难度,简单、中等、原创 2012-10-16 14:17:04 · 380 阅读 · 0 评论 -
设计模式之四 ------Builder
问题:我们有一个类,这个类使用了很多其他类的对象来作为成员;这时候使用者来一步一步地创建一个对象时非常繁琐的。我们需要一个策略来简化使用难度解决方案:我们创建一个类,这个类封装了创建产品的创建过程。这就是Builder设计模式源代码:#include using namespace std;class Product{//这个对象很复杂,为了简单,把其简单化,里面可以有其他原创 2012-10-18 16:50:20 · 315 阅读 · 0 评论 -
设计模式之五 ------Prototype(原型)
问题:通过拷贝构造函数(或者复制运算符[C++]),我们可以产生一个与源对象一样的目的对象。可是在继承体系中,如果我们有基类指针指着子类对象,在此时我们如何来得到一个拷贝呢?解决方案:我们可以定义一个纯虚函数clone;在子类实现这个函数,来返回一个子类对象,这就是原型模式源代码:#include using namespace std;class Prototype{原创 2012-10-19 12:57:51 · 314 阅读 · 0 评论 -
设计模式之九------compositer(组合)
问题:我们想以一种统一的方式管理整体和局部关系;就像一个班级,班里的所有人抽象为People类,类中有一般的方法和管理的方法,一般的同学继承为Student,实现一般的方法,班长则需要实现一般的方法和管理的方法;管理的方法用于管理所有的其他人。我们只要用people就可以管理整个班级了;解决方案:将对象组合成树形结构以表示“部分整体”的层次结构。组合模式使得用户对单个对象和使用具有一致原创 2012-10-22 09:32:23 · 568 阅读 · 0 评论 -
设计模式之六 ------Bridge(桥接)
问题:在遇到不定的用户需求的时候,例如:设计一个文本修改器,刚开始我们设计txt和pdf格式的,可是后来我们要添加doc等格式。这样,为了以后软件的修改和扩充,我们该怎么如何设计呢?解决方案:把用户需求的抽象和实现分离,抽象部分运用组合方式把实现部分结合起来。这样,抽象部分和实现部分都可以独立的变化,而相互不影响;源代码:#include using namespace std原创 2012-10-20 16:31:54 · 832 阅读 · 0 评论 -
设计模式之十三------Template(模板)
问题:在我们生活中,我们的做的事情都有一些共性,例如,很多事情都有类似的操作过程,这些东西应用到编程中也是一样的;如果我们把每件事情都抽象成一个类,这样会有大量重复的工作;解决方案:把其中的共性抽象出来,把它们在基类中完成,对于那些变化的,则写成抽象方法,让子类去完成;这就是Template模式源代码:#include using namespace std;clas原创 2012-10-23 11:03:36 · 428 阅读 · 0 评论 -
构造函数与析构函数
构造函数:主要作用就是为对象初始化。有一点要说的是,在继承体系汇总,如果在构造函数中,如果没有指定基类的构造函数,那么编译器会在构造函数开头加入,基类的默认构造函数,这样就可以初始化基类对象部分;析构函数:对于析构函数,要说的多点,实际也不太复杂,就是加入了virtual;使其具有了多态性质;#include using namespace std;class A{public原创 2012-10-23 12:17:35 · 278 阅读 · 0 评论 -
设计模式之十四------Strategy(策略)
问题:在我们生活中,我们的做的事情都有一些共性,例如,很多事情都有类似的操作过程,这些东西应用到编程中也是一样的;如果我们把每件事情都抽象成一个类,这样会有大量重复的工作;解决方案:我们把这些算法的逻辑抽象成一个类,把具体的算法实现抽象到一个接口(C++就是纯虚类,纯虚类与虚基的差别:前者是有一个纯虚函数,后者有一个公共基类,为了避免回合的时候产生多个副本)。让这个逻辑类来组合这个接口原创 2012-10-23 13:01:27 · 672 阅读 · 0 评论 -
设计模式之十------FlyWeight(享元)
问题:我们想对所有动物进行管理,每种动物对应一个类,他们都是继承自animal。如果我们对每一个动物都生成一个实例,那么这数量是非常庞大了,我们需要想一个比较不错的方法解决方案:我们可以为每一类动物建立一个对象,让这个对象持有这类动物的固定属性,对于需要变化的因素,我们可以通过参数传进来,进行处理;这样我们就不必创建大量的对象;这就死FlyWeight模式;源代码:#inclu原创 2012-10-22 10:29:13 · 375 阅读 · 0 评论