`
hong0104
  • 浏览: 17195 次
  • 性别: Icon_minigender_1
  • 来自: 湖南
社区版块
存档分类
最新评论

个人所接触到的设计模式

阅读更多

本人学习的经验,有不妥之处请提出:


设计模式:
 一:简单工厂:减少对象之间的耦合,对象之间的调用隐藏起来了。如父类下面定义了多种子类,
        在工厂里面可以通过父类生成它的所有子类。
     简单工厂模式能够根据外界给定的信息,决定究竟应该创建哪个具体类的对象。
     外界与具体类隔离开来,偶合性低。
     区分了各自的职责和权力,有利于整个软件体系结构的优化。
           
     项目中:service层调用dao层的实例,
     
 二:single单例模式:
         1.构造方法要用private修饰。
         2.方法要用同步(synchronized)
         3.方法与属性都要用静态(static)
         4.在方法里面对对象进行判断,如果不存在就创建一个,如果有了直接返回。

     项目中例用:连接Connection对象的时候,我们可以把它设为一个单例类,这样就会节省
        不必要的资源浪费了。
       
 三:stragegy策略模式:定义一系列的算法,把这些算法封装成单独的类, 并且使它们可相互替换。
    解决问题:某个具体的解决方法有很多种可选择的实现。
    例子:我们日常生活中常接触到的一个例子,如去超市购物,当我们买东西结账的时候我们
    可以支付现金,也可以选择用银行卡支付、也可以有其它的方法去支付。总之我们的钱减少了。
    这几种支付方式是可以自己选择的。
   
  策略模式(Strategy)的应用场景是:
    1. 多个类的分别只是在于行为不同
    2. 你需要对行为的算法做很多变动
    3. 客户不知道算法要使用的数据
 
 优点有:
    1.提供了管理相关的算法族的办法。可以把公共的代码移到父类里面,从而避免重复的代码。
    2.提供了可以替换继承关系的办法。继承可以处理多种算法或行为。使得动态改变算法或行为
    不可变。
    3. 使用策略模式可以避免使用多重条件转移语句。
  缺点有:
    1. 客户端必须知道所有的策略类,并自行决定使用哪一个策略类。只适用于客户端知道所有
    的算法或行为的情况。
    2. 策略模式造成很多的策略类。
 四:template模板模式:操作中算法的骨架,将一些步骤延迟到子类中去做。
    (也就是父类定义子类实现。)
     如我生成一个Person类,用abstract来修饰的,里面有一个抽象的方法。
     生成该类的一个子类,覆盖抽象方法,在该方法里面写一些业务逻辑。
     在调用的时候用父类声明,得到子类的对象,然后再调用父类里面的方法,它会自动得执行
     子类里面的方法。
   
     项目中的使用:父类定义一个排序的抽象方法,里面有一组数据。我们要对这组数据进行排序,
        调用这个方法就可以了。
    它下面有几个子类:A类,是用冒泡排序的。B类里面用的是插入排序。C类里面用的是希尔排序。
   我们要完成这组数据的排序,只要调用其中的一个就可以了,这样都可以达到我们想要的目的了。
   
  模板模式Template Method的应用场景是:
    1. 你想将相同的算法放在一个类中,将算法变化的部分放在子类中实现
    2. 子类公共的算法应该放在一个公共的类中,避免代码重复
 
     项目中:我们的项目中的SuperDao里面有增、删、查、改四个方法,其子类只要继承他,
     然后覆写里面的方法进行一些业务性的逻辑运算就可以了。

     五:observer观察者模式:对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,
     所有依赖于它的对象都得到通知并被自动更新。
     解决问题:解决多个对象间相互依赖关系的相互通知。
     常用地方:一些数据有多个视图的表示,譬如Java中自带的图形事件应用。
 
     举例:我家里有电话号码,而我和我哥要知道家里的电话号码以便于打电话回家,
        在这样的组合中,我家里的电话就是一个被观察者(Subject),我和我哥就是需要
        知道信息的观察者,当家里的电话号码发生改变时,我和我哥得到通知,
        并更新相应的电话记录。

     如火车站的时程表,如有时程表改变每个乘客都得要得到这个消息。
   
     项目:我以前写过的一个图书的管理系统,里面有很多的分类。例如:讲算机类、体育类、
        生活类等等。
    如果现再计算机类的书普通客户是打9折的,而会员则打7析。但是老板发现生意不太好,
        于是就进行了调整将原来的9折改为7折,会员价改为6折。这时我们不需要对其源代码
        进行改变,只要将在调用的时候在加另一个对象就可以了,如果以后要改回来的时候,
        也只要把现再的给注释掉,然后换成以前的就可以了。
   
   
 六:component组合模式:将对象以树形结构组织起来,以达成“部分-整体”的层次结构,
    使得客户端对单个对象和组合对象的使用具有一致性.

    解决问题:树形数据结构的方案

    适用性:
        你想表示对象的部分-整体层次结构。
        你希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象。

    例:我们公司有不同的部门,而我们开发的有几个团队。如在一次做项目的时候我们这个团队提前完成了
    任务,这个月我们团队可以加工资了,也就说我们团队的每个人都要加工资。这时账务科的只要把我们这个
    团队记上加工资就可以了,不需要一个一个的去加了。
   
 七:command命令模式:将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化
 
    解决问题:只关心行为,不关心具体执行类或者实现.
    什么情况下用:多级undo操作、原子事务行为、导航
   
    项目中的使用:例如我以前做过的ATM自动取款机的项目,我们的一系列操作都是一条命令去控制的,
     在取款的过程中我们并不需要它是怎么实现的,如那钱是怎么出来的,你不需要关心,你要关心的是你
     点击了取款,你要取多少它就会给你多少。
     
   八:facade外观模式、门面模式:为子系统中的一组接口提供一个一致的interface接口界面。
   解决问题:子接口繁多,调用复杂,内部交互地方比较多
   例如:在一个泡茶的过程中,需要作如下的工作:烧开水,准备茶叶,把茶叶放在杯子里,把烧开的水放到
        茶杯中,只有经过这些过程之后才能泡出好的茶叶来。可以把这些动作串联起来,形成一个整体的步骤,
        就是MakeACuppa(),这样在调用步方法时也比较方便。把里面的细节被屏蔽掉了。
       
        比如,现在有一辆汽车,我们(客户程序)要启动它,那我们就要发动引擎(子系统1),使四个车轮
        (子系统2)转动。但是实际中我们并不需要用手推动车轮使其转动,我们踩下油门,此时汽车再根据
        一些其他的操作使车轮转动。油门就好比系统给我们留下的接口,不论汽车是以何种方式转动车轮,
        车轮变化成什么牌子的,我们要开走汽车所要做的还是踩下油门。
   
    九:decorator装饰器模式定义:动态地给一个对象添加一些额外的职责。就增加功能来说,Decorator模式相比生成子类更为灵活。
        解决问题:一个对象需要经常动态增加属性或职责
例子:我以前写过的一个网上购物系统,如果现再有一款新的产品进来了,我只需要动态的把它加到
产品当中去就可以了,而不是把里面的代码再重新改一遍,当某类产品不想再出售的时候我们只
             需要在调用的那里把这类产品删除掉就可以了。
              
    十:state状态模式:当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。
      觖决问题:适合"状态的切换".因为我们经常会使用If elseif else 进行状态切换,
      如果针对状态的这样判断切换反复出现,我们就要联想到是否可以采取State模式了.
     项目:我以前做过的一人业务发放系统,在这里面我们就用到了状态模式,在卖给客户的时候
     有一定的时间的。并不是永久性的,他在到期的前几天你使用的时候会发出一个警报,只是轻微的告警而
     已,告诉你这个快要过期了,可能有部分的功能不能用了,当到期后你再使用,他会给出很严重的告警,
     这时你已经不能使用了。这里该系统的这些状态就是通过状态模式来完成的。
    十一:chain职责链模式:使为了避免请求的发送者和接收者之间的耦合关系,使多个接受对象都有机会
    处理请求
    解决问题
    1 有多个的对象可以处理一个请求,哪个对象处理该请求运行时刻自动确定。
    2 你想在不明确指定接受者的情况下,向多个对象中的一个提交一个请求。
    3 可处理一个请求的对象集合应该被动态指定。
    例子:比如工厂里面的生产流水线,每条流水线上面都有一些工作人员,这些工作人员就好比一个对象。
         如果这其中的一个工作人员走了,也不影响这条流水线的工作,如果这条流水线又来的一个员工,
     也不影响这条流水线的工作。

     十二:Abstract Factory,抽象工厂:提供一个创建一系列相关或相互依赖对象的接口,
        而无须指定它们的具体类。
        解决:一个系统要独立于它的产品的创建、组合和表示时。
              一个系统要由多个产品系列中的一个来配置时。
     例子:例如诺基亚手机生产商,他肯定不只是造那一款手机吧,例如:5800、E71、N97等。
         他肯定不是一个人把整部手机都完成的,每个人只负责其中的一块。
         如一部分是造按键的、一部分是造屏幕的、一部分是造外壳的。
         
     十三:Adapter适配器模式,将一个类装换成客户期望的另外一个接口。Adapter模式使的
        原本由于接口不兼容而不能工作的那些类可以一起工作。
     解决了:组件的接口与目前系统接口不兼容,可以使用适配器模式解决接口不兼容问题。   
     分为类适配器与对象适配器:    
     1.类适配器模式需要创建自身来创建一个Adaptee,
        对象适配器模式可以直接使用一个已有的Adaptee的实例来转换接口。
     2. 类适配器继承了Adaptee,所以可以通过覆写来扩展SpecificRequest()
        对象适配器和Adaptee是包含关系不能扩展;(其实也可以扩展的见下面)
     3.类适配器模式因为是继承所以相对静态,而对象适配器模式是包含是组合相对灵活
     (可以通过写adaptee子类扩展功能)
     组合优于继承
     例子:手机充电器
     
     十四:Builder,建造模式:将一个复杂对象的构建与他的表示相分离,使得同样的构建
        过程可以创建不同的表示。
     适用:当构造过程必须允许被构造的对象有不同的表示时。
     解决:将构建复杂对象的过程和它的部件解耦。
     例子:如造手机
     
     十五:代理模式:为其他对象提供一种代理以控制对这个对象的访问。
     特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息、过滤消息、把消息
        转发给委托类,以及事后处理消息等。
     静态代理类:由程序员创建或由特定工具自动生成源代码,再对其编译。在程序运行前,
        代理类的.class文件就已经存在了。
   动态代理类:在程序运行时,运用反射机制动态创建而成。
     例子:如一个网上购物系统,你如果在这里买了东西付了钱,他就会给你东西。会是老板自己
     来送给你吗,不是,他会通过一个代理然后再把东西交到你的手上。
     
     十六:中介模式:用一个中介对象来封装一系列的对象交互。
     MVC中的控制层就好比一个中介的作用。
好处:使用中介者模式最大的好处就是将同事角色解耦。这带来了一系列的系统结构改善:提高了原有系统的可读性、简化原有系统的通信协议——将原有的多对多变为一对多、提高了代码的可复用性


分享到:
评论

相关推荐

    c++语言实现的23种设计模式.pdf

    文档中包含有23种设计模式,基本上包含了所有的常用的设计模式;...我个人最开始接触设计模式也是从改书开始的,以前不知道设计模式是什么,看过之后才觉得太有用了,代码设计,类设计,不会再一如既往的杂乱无章。

    二十三种设计模式【PDF版】

    1.设计模式更抽象,J2EE 是具体的产品代码,我们可以接触到,而设计模式在对每个应用时才会产生具体代码。 2.设计模式是比 J2EE 等框架软件更小的体系结构,J2EE 中许多具体程序都是应用设计模式来完成的,当你深入...

    设计模式精解-pdf.zip

    总的来说,《设计模式精解》这本书是学习和掌握设计模式的绝佳资源,无论你是刚接触设计模式的新手,还是希望巩固和深化已有知识的开发者,都能从中受益匪浅。通过深入学习这本书,你将能够更自如地应对各种编程挑战...

    23种设计模式幽默见解

    Memento模式是一种行为型设计模式,用于在不破坏封装性的前提下捕获一个对象的内部状态,并在该对象之外保存这个状态,这样以后就可将该对象恢复到原先保存的状态。在幽默的例子中,记录与女朋友的对话历史可能需要...

    C#23种设计模式_示例源代码及PDF

    工厂方法模式: 而是将具体创建的工作交给子类去做, 工厂方法模式 核心工厂类不再负责所有产品的创建, 成为一个抽象工厂角色, 仅负责给出具体工厂类必须实现的接口, 而不接触哪一个产品类应 当被实例化这种细节...

    OO中对于23种设计模式的整理

    OO 中的 23 种设计模式是指 GoF(Gang of Four)在《设计模式:可复用面向对象软件的基础》(Design Patterns: Elements of Reusable Object-Oriented Software)一书中所提出的 23 种经典设计模式。 1. 抽象工厂...

    设计模式入门及详解pdf版

    设计模式是软件工程中的一种最佳实践,它是在特定情境下为了解决常见问题而...因此,无论你是刚接触设计模式的新手,还是寻求提升的资深开发者,这两份PDF都将是极好的学习资源,帮助你在软件设计的道路上不断前进。

    Java的23种设计模式

    ### Java的23种设计模式解析 #### 一、引言 在软件开发过程中,设计模式作为一套被广泛接受的解决方案,为解决特定问题提供了一种标准的方法。本文将通过一个有趣的视角——追MM的故事来解释Java中的23种设计模式,...

    php设计模式

    随着计算机科学的发展,设计模式的概念被引入到了软件工程中。在软件开发过程中,开发者经常会遇到相同或相似的问题,设计模式提供了一套经过验证的解决方案。每个设计模式通常包括三个主要部分: 1. **标识**:即...

    追MM与23种设计模式

    享元模式是一种结构型设计模式,它用于减少创建大量相似对象所需的资源消耗。在“追MM”的过程中,享元模式可以帮助你有效地利用有限的时间和资源,通过共享某些通用的追求方式,避免重复工作。 #### 12. 代理模式...

    设计模式新解23招,招招新鲜

    从最初接触设计模式时的困惑到逐渐理解和掌握,再到能够在实际项目中灵活运用,每一步都充满了挑战和收获。 #### 1. 创建型模式 - **Factory模式** - **概念介绍**:Factory模式是一种创建型设计模式,它提供了一...

    尚硅谷Java设计模式(图解+框架源码剖析).zip

    学习Java设计模式不仅可以提升个人的编程技能,还有助于团队协作,因为设计模式提供了一种通用的语言,让开发者能够更好地理解和交流彼此的代码。在实际开发过程中,适当地应用设计模式可以降低系统的复杂性,提高...

    设计模式精解-GoF 23种设计模式解析附C++实现源码

    从最初接触设计模式时的困惑,到逐渐掌握并在实际项目中灵活应用,是一个不断成长和积累经验的过程。在开发实践中,不仅要熟悉各种设计模式的概念和应用场景,还需要不断地尝试和实践,才能真正领悟其中的精髓。例如...

    设计模式——约会版

    在《设计模式——约会版》这一独特视角下探讨的设计模式,并非我们传统意义上的面向对象设计模式(如工厂模式、单例模式等),而是通过模拟约会场景,将抽象的设计原则与实际生活中的互动策略相结合,以此来形象地...

    工作设计模式与岗位测定.doc

    在当今企业管理的诸多方面中,工作设计模式与岗位测定的重要性日益凸显。它们不仅关乎企业生产效率和质量的提升,更是确保员工身心健康、提高员工满意度的关键。本文档深入探讨了劳动环境测定、岗位测定与工作设计的...

    个人博客的课程设计项目

    在IT行业中,个人博客的...通过这个项目,学习者不仅可以掌握Web开发的基本技能,还能了解到软件工程的实践,如需求分析、设计模式、测试和维护等。这是一个全面且实用的学习过程,对于个人技能的提升有着显著的帮助。

    个人前端知识集合汇总react、vue、typescript、js、css、html、前端面试题、设计模式、有趣的前端demo

    标题中的“个人前端知识集合汇总”是一个综合性的前端学习资源包,涵盖了多个关键领域,包括React、Vue、TypeScript、JavaScript、CSS、HTML以及前端面试题、设计模式和有趣的前端示例项目。这个压缩包旨在为学习者...

    初步接触java 所思所感

    Java开源项目众多,例如Spring框架、Apache Commons库等,通过分析这些项目的源码,可以学习到良好的编程习惯和设计模式。常见的设计模式如单例模式、工厂模式、观察者模式等,都是Java开发中常用的思维工具。 ...

Global site tag (gtag.js) - Google Analytics