您的位置:首页 > 编程语言 > Java开发

浅谈java设计模式的应用

2017-05-12 22:24 281 查看
以前我一直以为对学习总结是一件非常麻烦的东西, 现在感觉总结是学习中最最重要的一环, 必不可少, 那什么是总结呢? 总结就是: 将别人的东西变成自己的 ! 那才真正学会了.

设计模式个人总结:

     设计模式是前辈总结的编码经验,可以作为解决不同问题的方案,使用设计模式是为了让代码变得更简洁、更灵活,也就是所谓的"高内聚,低耦合"。  我觉的设计模式是整个编码的灵魂,它也是一门艺术。什么是艺术? 艺术就是: 真是,自然,美好的东西。

     讲设计模式之前,首先要讲的是面向对象设计原则,使用这些原则,可以让我们的代码更加规范。

     它们分别是: 

     1. 单一职责(每个类应该只有一个职责,对外只提供一种功能,而引起类变化的原因应该只有一个)

     2. 开闭原则(对扩展开发,对修改关闭,对类的改动)

     3. 依赖注入:(依赖于抽象, 而不是依赖于具体的实现, 类如果需要调用其它的类, 就应该调用该类的接口或者抽象类, 而不是直接调用该类的实现类)

     4.  里氏替换原则(在任何抽象类出现的地方都可以用它的实现类来替代, 采用里氏替换原则可以更好的使用继承)

     5. 迪米特原则(一个对象应当对其它对象尽可能少的了解, 能够降低各个对象之间的耦合)

     6. 接口隔离原则(各个模块之间互相调用时, 通常都会提供一个统一的接口来实现, 这样其它的模块就不需要了解另一个模块的内部实现细节, 当一个模块内部的实现发生改变的时候不会影响其它模块的使用)

     7. 优先使用组合而不是继承(为了实现高内聚, 低耦合) 

  

     设计模式分为三大类(1.创建型模式 2.结构型模式 3.行为型模式)

     一. 创建型模式

     1. 单例模式

      单例模式的意思就是唯一实例(静态属性, 私有构造(防止外部创建对象), 静态获取方法)

      应用: 数据库连接池 , 日志管理 -> 日志类 (单例实现) .  

      2. 工厂方法模式

      在以前的企业中: 很多商品都是自己负责制造, 但是这样会造成管理和生产效率的低下, 

     后来的解决方案是: 将这些产品的制造交给不同的工厂, 每个工厂只负责制造单独的一个产品

     应用: Spring 中依赖注入的实现(反射通过获取配置文件信息, 再找到对应的类, 对应的属性, 方法, 然后创建对象)

      3. 抽象工厂模式

       只生产一个产品的工厂, 例如汽车组装工厂会与轮胎下面的各种零件打交道, 买各种零件, 又进行轮胎组装等, 这样还是效率低下不利于管理, 抽象工厂就相当于把轮胎的制造又抽取出去, 交给单独制造轮胎的厂区制造, 而汽车组装厂就直接给轮胎制造厂打交道就行了

      工厂模式与抽象模式的区别: 工厂模式相当于一个具体的工厂类负责创建一个单独的对象, 而抽象工厂相当于负责创建一系列相互关联的对象

      4. 原型模式

       在企业中, 有时候一张财务凭证或者申请单, 但部分内容都一样,  只是需要修改一下日期或者名字, 没有必要重新创建一个新的对象, 此时就会用到原型模式, 就相当于把原来的对象复制一遍, 修改一下就给可以了, (对原来的对象克隆)

      5. 创建者模式

      定义: 将一个复杂对象的构建与它的表示分离  (也就是在将抽象工厂模式中的组装分离出来, 因为还汽车组装完成还需要销售, 售后等等)

       组装就相当于构建, 销售就相当于表示

    

     二. 结构型模式

      6.  适配器模式

      定义: 将一个系统提供的接口转换成另外一种形式, 从而使原来不能直接使用的接口变得可用

      小例子: 将一个接口返回的Map转换为另外一个接口需要的List

      应用: java中的输入输出流, 形象概念: 相当于一个大口径的水桶需要把水装入一个小瓶子里, 怎么办呢? 这时候就需要一个漏斗, 这个漏斗就是适配器

      7. 门面模式

      系统向外部暴露一个接口, 而外部调用者并不知道系统具体的内部实现

      例如: 银联系统, 暴露给商城的支付接口

      应用: java提供的jdbc很麻烦, spring 提供了jdbc的封装, 开发人员调用即可

      8. 代理模式

      形象的解释: 就相当于中介公司代办一些事情, 例如房产中介, 或者代驾

     当两个类相互关联时, 就需要在代码中直接调用另外一个类, 这样如果需要添加一个特殊的处理, 就需要直接写在某一个类的代码中, 当有很多类都需要这些特殊的处理时, 每一个类都必须编写相应的特殊处理代码, 就不能进行代码的复用, 采用代理模式就能避免这些问题

      spring aop 就运用到了代理模式(日志, 权限, 事物处理)  ,   动态代理 -> 用于解决代理类太多的问题

      9. 合成模式

      合成模式也叫树形模式: 把部分和整体的关系采用树形结构来表示

      形象理解: 团购: 不管消费者进行单独买, 或者团购, 处理方式都是一样的, 收钱, 发货 , 对于商家来说, 都是同样的操作方式

      小例子: 树形菜单: 对于不同节点都可能进行相同的操作, 新增, 修改, 删除

      应用: ctrl + c 复制文件, 不需要把文件夹下面的文件一个个复制, 直接复制整个文件夹, 都复制过去就行了

      

      10. 享元模式

       数据库连接池用单例模式, 连接池里面的连接用享元模式

      11. 装饰模式

       扩充软件的功能, 但是又不改变软件原来的功能

       应用: 在收银系统中, 收款的时候扫描商品的条形码, 获取商品的价格, 但是有时候会遇到打折, 赠送等活动 , 但是收银的功能可能还会被别的程序所使用, 所以不能再该方法上                    直接修改, 所以就用到了装饰模式

    

       12. 桥模式

        目的是为了在两个不同类之间建立某种联系, 在两个类之间建立联系的方式有很多, 可以通过继承, 也可以通过组合, 

        桥模式就是告诉软件开发人员要采用组合的方式在两个类之间建立联系

结构型模式核心思想:

       当两个类相互关联时, 不要直接在一个类的代码中调用直接调用另外一个类的代码, 而是要在两个类之间建立一个类似于缓冲器的类, 从而将直接关联的两个类进行解耦, 以保证以后当一个类的接口发生变化时, 不会影响另一个类的使用 

        三. 行为型模式

        13. 策略模式

        -》定义一系列的算法, 并将每一个算法封装起来, 而且使它们可以相互替换

       比如在人力资源系统中, 对于薪资的计算, 针对不同的人员会有不同的薪资计算方法, 将这些算法分离出来, 就是策略模式

       形象: 田忌赛马, 根据不同的情况采用不同的策略

       应用: spring 把所有的记录信息的文件, 比如各种类型的文件, 二进制等都称为资源, 它为资源访问提供了一个Resource接口

       14. 迭代器模式

        对集合或容器里对象的访问必然涉及遍历, 这就是迭代器模式

        正因为迭代器在开发中经常用, 所以java本身就提供了对迭代器的支持(Iterator)

        形象: 对于公交售票系统来说, 不管是谁上车都是要刷卡, 每张卡的金额, 刷卡的历程都是要到系统中进行判断 -》 迭代器模式

        15. 模板方法模式

        所谓模板: 就是事先规定好的事物的处理流程和规则

        目的: 定义一系列算法的执行的顺序, 而把具体算法的实现在子类中完成

        在新闻发布系统中, 对于查看新闻的页面来说, 该新闻的抬头, 结尾都是有一定的格式, 变化的只有新闻的内容, 通常情况下, 开发人员会使用模板技术, 将新闻的抬头和结尾都固定, 只改变新闻的内容, 这样就可以提高开发效率

        应用: 操作数据库, 都有创建连接, 关闭连接, 都需要按照这样的顺序执行

        16. 中介着模式

         用一个中介对象来封装一系列的对象交互, 中介者使各对象不需要显示的相互引用, 从而实现松耦合

         应用: 网上商城系统 -> 卖家在网上发布需要售卖的商品, 消费者在网站上查找需要购买的东西, 商城在此承担了一个中介的作用, 如果遇到了纠纷, 商城还充当一个调停者的作用, 通过中介模式可以将相互不信任或不了解的双方联系在一起

 

         17. 访问者模式

          银行呼叫中心, 当客户打电话进去时, 系统会自动寻找目前还在待机的电话, 然后将客户与其连通, 这个系统自定寻找目前还在待机的功能采用的原理就与访问者模式的原理类似

         

         18. 责任链模式

          "击鼓传花" , 当花传到谁手里, 谁就承担相应的责任

          应用: OA系统中: 对于"公文审批"的功能, 通过处长 -> 部长 -> 经理 ->总经理 审批

  

         19. 状态模式

          在职责连模式中, 入股不是当前用户处理, 需要传到下一个职责人, 有一种情况在转给下一职责类进行处理前, 需要修改当前的状态, 此时就需要用到状态模式

          应用: 电梯的运行, 工作流引擎中 , 都有用到状态模式

         20. 解释器模式

         应用: 数学公式转换(计算器)

         解释器模可以很好的将数据的解析与使用分离开, 如果不采用解释器模式, 当客户端需要对一些字符进行解析时, 就会直接编写解析的方法, 造成数据之间的耦合, 当其他有地方需要用到时, 不能复用

         21. 观察者模式

         银行账户信息发生改变时, 或者商城中商品的价格发生变化 ->  给客户发送短信, 邮件 

         spring 中  -> 监听器 -> 由观察者模式实现

         22. 命令模式

         全自动洗衣机, 可以自行设定洗衣时间, 到时间, 洗衣机就可以自动洗衣, 漂洗, 烘干, 只需要选择相应的指令即可, 

         -》 开发人员可以事先将各种命令存储在一个集合里, 这样等时间到达时, 就可以从集合中按照一定的顺序, 将各种命令一次的取出, 执行

         23. 备忘录模式

         在软件的构建过程中, 某些对象的状态在转换过程中, 可能由于某种需要, 要丢程序能够回到对象之前处于某个时间点的状态

         应用: 例如 : 在写word 的时候突然断电, 当来电之后, 打开word又可以恢复到当时的状态 ,     网站数据备份也会用到备忘录模式 

         java 实现: 备忘录模式就是一个保存另外一个对象内部状态拷贝的对象, 这样以后就可以将该对象恢复到原先保存的状态

... 待优化
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: