zoukankan      html  css  js  c++  java
  • 一天不打上房揭瓦,设计模式讲给你听(水文)

         不知不觉,设计模式已经学到了第23章了,坚持每天学习一个设计模式,但是近段时间都没有做好总结,每天只是学,相当于花费了很少的时间在设计模式上,结果越学越慌,今天就来回顾一下我所学的设计模式。

       首先,说说最近让我最恐惧的模式,桥接模式,为什么恐惧,因为你第一映像是,这个模式我好陌生呀,肯定很难,我也如此,完全不敢看书本正文,还是在网上的相关帖子中查找到对应的原理,才发现这么简单,这不是我们最自然,最直观的行为或者最直接的思考方式么。

       桥接模式,最直观的应用就是 虚拟机与java程序的关系。首先我们写的java程序都是有一定的规范的,可以抽象成一个java类,或者java程序类,这产生了第一个抽象。然后虚拟机是要支持java程序的运行的,但是每一个虚拟机的实现,都应该是面向java类,或者java程序类来进行编程支持。因为虚拟机有相应的规范,都需要提供相同的功能,所以可以把 windows的虚拟机和 liunx下的虚拟机,都抽象成一个虚拟机接口。这样编写你就会发现,java类的增加不会影响到虚拟机,因为虚拟机的实现是面向java类去编程的,java类的变化虚拟机是看不到的。而虚拟机的增加也不会存在什么负担,因为虚拟机是面向接口编程的,于是两个维度的东西都可以自然的增长,而不会相互影响。即使懂得了大致的思考方式,但是为什么叫做桥接模式,这么这么难以理解的名字呢?因为这是两个接口之间的链接关系,如果你画一个类图,你就会发现这个这两个类,加上中间的连线就像一座桥。

      写个桥接模式都这么长,真是让人头大。桥接模式的好处来源于,依赖倒转原则(面向接口编程),开放封闭原则(其实是因为满足了前者,所以也带来了这一个好处)。

       适配器模式: 适配器模式其实很简单了,我们生活中最常用的就是充电头,你可以看到其实充电头的全名叫做电源适配器,因为各个国家的电压标准不一样,但是手机电脑的工作电压要求是稳定的,所以我们只需要一个适配器,将不合适的地方转化成标准的就可以了。最常用的实现方式,是提供一个适配器接口,然后各个实现使用自己的实现方式去满足这个适配器接口的需求。同样满足了依赖倒转(面向接口编程的原则)

      头疼的组合模式:组合模式强大也令人头疼,因为你很难从字面意思联系到任何有实际意义的东西,其实这个模式我也没理解透彻,但是目前我所能想到的一个好的例子是,你需要将字体的调成宋体的功能,可能给到你的是一个文字,也可能是一个段落(毕竟谁想一个个文字的使用),你的实现当然可以根据传递给你的参数,如果是一个文字你就渲染,如果是一个段落,你就遍历每一个文字进行渲染。也很简单,但是就是if else 太多,你为什么不定义一个接口,可更改字体的接口,你就对外说,我会对这样接口进行内容渲染,如果是文字完全没问题,如果是段落,其实可以理解为一个个文字的组合,对段落的渲染,其实就意味者对每一个文字的渲染,但是对于使用者来说,看到的都是一个可以更改字体的接口,具体实现可以不关心,而且你也把,原来是一个一个的,然后因为需要批量处理(组合起来的)具体渲染的实现分开,这样也不会相互影响,不会因为改动单个的渲染,而导致整个渲染不可用,说白了,就是把 原来写在一个类里面的判断,转到到多个类中,满足了单一职责原则,这种模式更多就是应用在有组合的情况下,其实也带了点策略模式的味道,对于客户端也算是面向接口编程,单一职责,最少知道原则。

      迭代器模式: 这是最常用的设计模式了,主要都集成在了编程语言里面,向集合的遍历,所以也是接触最多的方式,迭代器模式主要时遍历的时候使用,有了统一的迭代接口,可以在不了这个集合的内部实现的情况下,使用接口去遍历集合,其实可以提高性能,因为迭代器是了解了数据的实际存储方式的么,它当然知道数据以什么的方式去存储,性能损耗最少啦,一般实现是基于内部类来实现迭代接口,利用了内部类,可以访问外部类资源的这一个特点。

      单例模式: 最简单的方式,起因因为我们有一些资源,不希望打开多个,就比如说windows的资源管理器,我开了一个之后,我不希望打开第二个,最初的做法是判断调出资源管理器的时候,判断资源管理器是否已经实例化了,如果实例化则跳过,但是当想在菜单中同样可以呼出资源管理器的时候,还需需要做重复的判断(是否因为实例化了资源管理器,如果实例化的话,则跳过),可能我们想抽成一个方法,但是这个方法的不是那里都可以访问的,或者说可能有人不知道,而实例出了两个资源管理器,这在维护上,就需要考虑这么多实例化之后就不创建,但是如果这个资源真的非常损耗资源,或者说,无论在那里我可能都只需要这一个实例化就够了的时候,其实创建一个还是创建多个这个类本身是最清除的,所以可以把实例化的方法放到类中,将类的构造函数设置成private,让他对外不能被创建,然后提供一个生成实例的方法,并且使用一个静态对象缓存第一个实例,当需要使用时,先判断缓存对象是否已经创建,如果创建的话则直接使用缓存对象,这里面涉及多线程内容我就不说了,我也有个并没有搞懂java new 分几步的问题,不过到是讨论了我们为什么要使用单例的原因。

      好累,我在学一个新的设计模式,明天再接着写。

      

  • 相关阅读:
    第三章 kubernetes核心原理
    Jmeter
    Docker 入门学习
    第二章 Kuberbetes实践指南
    第一章 Kubernetes入门
    java中的引用与ThreadLocal
    Disruptor极速队列
    Redis设计与实现——单机数据库的实现
    Redis设计与实现——数据结构与对象
    python装饰器
  • 原文地址:https://www.cnblogs.com/wangchaodong/p/12052159.html
Copyright © 2011-2022 走看看