摘要: 原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6508967.html

  之前认真学习了Java设计模式中的四大接口型模式,分别为:适配器模式(Adapter)、外观模式(Facade)、合成模式(Composite)、桥接模式(Bridge)。

1、在此处再温习一下四种设计模式:

(1)适配器模式:

  我们能够访问的类中不存在我们要访问的内容时,就可以使用这个适配器模式,当然就类而言,其实不存在什么不能被访问,这里的不能访问都是人为的制约,规则的限制。

  最为常见的就是在常规项目中使用的MVC分层模式,尤其在SpringMVC中体现的淋漓尽致:我们的请求来到SpringMVC的核心Servlet(DispatcherServlet)之后,由其进行请求分发,找寻合适的控制器(Controller),一般控制器是不会进行任何的业务处理的,它的作用就是用来接收请求与返回响应,而具体的请求与响应的处理则是在业务层(Service层)实现。

  这样请求的目的很明确,就是要进行业务处理,而接收请求的控制器被人为(规则)限制不允许内部出现任何业务代码,怎么办?将其当做一个适配器来处理,使用组合的方式来控制器所在类中引用业务类(接口指向实现类),然后在控制器方法中调用能够完成请求目的的一个或者若干业务层类中的方法来进行业务处理,这正是适配器模式的一种典型应用。

  请参考《Java设计模式之《适配器模式》及应用场景》一文

(2)外观模式:

  外观也就是脸面、门脸,并不是说我们一定要使用外观,而是使用外观可以有诸多好处,它能够屏蔽系统复杂性,而且如果对系统功能的实现进行优化或更改,只需要对外观类进行简单的更新即可,而不会影响到使用这个系统的其他系统,这是外观类最重要的功能。

  在这里我突然想到,上面举的例子中,控制器调用业务层实现类来完成具体的业务处理,从某种角度来看,同样也是外观模式的一种应用:控制器类针对整个网站业务系统而言何尝不是一个外观类的存在,外部请求来到系统后台,直面的正是这些控制器类,而不是复杂的业务处理类,在控制器中通过调用业务类方法的方式来为外部请求提供服务,这样整个复杂的后台业务系统被接口屏蔽,请求者不必关心自己要调用哪个业务类来实现自己的请求,而是有特定的控制器来完成这个内部调用。当我们对业务实现方法进行修正或更新时,只需要在控制器中稍作修改即可,整个请求毫无影响,对它而言未发生任何改变。

  只是突然想到一点:我记得在外观模式中有这样的描述,外观类对系统并不是真正的屏蔽,其他系统任然可以通过直接调用系统内部的方法来完成功能,只是较为复杂罢了,这在SpringMVC中好像无法达成,因为SpringMVC被设计成为接口匹配方式来寻找控制器,也就是说请求来临只能找控制器,是无法直接调用业务实现类的,也许通过一些复杂的方式可能达到。

  请参考《Java设计模式之《外观模式》及应用场景》一文

(3)合成模式:

  有别于之前和之后要谈及到的模式,我认为合成模式较为狭隘,是指应用范围较为狭隘,好像主要针对的就是树形结构而言,如文件目录、多级目录结构等。

  使用合成模式的目的并不是组合(即将下一级包含在上一级中),而在于一视同仁这一点。

  何为一视同仁?简单的说就是将树形结构的两种形式一概而论,将目录结构的文件与目录一概而论,而不是分而论之。

  如果将两者一视同仁,那么就能将二者抽象为一个概念(通常应该是用抽象类来表述),然后我们再针对二者分开进行抽象的继承实现,具体的区分二者,这样做,好似比原本就分而论之的结构要复杂,其实不然,我们使用抽象后,二者被概括为一个概念,这样我们在使用的时候,就可以使用同一个接口来进行实现(Java中的多态:抽象类指向实现类),具体的实现不必在代码中指定,而是自动根据情况来完成。这样不必再针对二者分开进行显式调用,简化了代码。

  请参考《Java设计模式之《桥接模式》及应用场景》一文

(4)桥接模式:

  以前诸多文章都未能在博客园首页留住,但这篇文章《Java设计模式之《桥接模式》及应用场景》尽然入了编辑的眼,进而被大内科技发布到了《今日头条》上,说明这篇文章还是不错的。

  说道桥接模式,又称桥梁模式,望文生义,就是一座桥。这是一座接口桥。

  查阅诸多文献,说道桥接模式就是将抽象与实现解耦,说实在话,不懂!因为这句话本身就抽象至极,谈何理解!

  其实此处的抽象指的是调用方的抽象类实现,实现指的是被调用方的接口实现,这里谈及到两个实现,正是我们常见的实现:就是通过继承的方式来实现抽象类,通过实现的方式来实现接口,无外乎如此。

  再谈谈解耦,这里的解耦也很好理解,就是解除直接耦合,什么样式直接耦合呢,很简单,通过继承类的方式实现的功能就是直接耦合,这样的耦合导致修改和扩展将会极为麻烦,这也正是解耦的目的所在。

  再谈谈如何解耦,这里涉及到的双方就是调用者与被调用者,如果通过继承的方式来进行虽然符合Java继承规则,但耦合性太大,不易双方扩展,这样在二者之间架设一道桥梁,将二者的那种耦合隔开,通过中间桥来进行连接,这样一来,双方的扩展不再对对方产生任何影响,可以任意发展。

  那么如何来架设这道桥梁呢?

  很简单,使用接口与抽象类这两个神器,我们为被调用者创建一个接口,而这个接口就是那座桥,其实我们将桥与被调用者绑定在一起了,而针对调用者,我们创建一个抽象类(为何此处是抽象类,而不是接口呢?因为我们要在这个抽象类内部引用桥接口,而接口中一般是没有属性的<只有静态常量>),故使用抽象类),在其中引用桥接口,并创建合适的方法,用于被继承类实现来进行扩展。

  如此一来,目的达成,不明白的,请看《Java设计模式之《桥接模式》及应用场景》一文。

2、接口类型

  上述的四种设计模式均涉及到了接口,此处的接口并不是Interface这个意思,而是一种“对外”或“被调用”的意思,还有一层屏蔽的意思。

  接口类型多是使用接口来屏蔽具体的实现,为调用者提供一个友好的界面(接触口)。

(理解尚浅,待补充)

  

Java设计模式之《组合模式》及应用场景

Java设计模式之接口型模式总结的更多相关文章

  1. Java 设计模式泛谈&装饰者模式和单例模式

    设计模式(Design Pattern) 1.是一套被反复使用.多人知晓的,经过分类编目 的 代码设计经验总结.使用设计模式是为了可重用代码,让代码更容易维护以及扩展. 2.简单的讲:所谓模式就是得到 ...

  2. java设计模式之Proxy(代理模式)

    java设计模式之Proxy(代理模式) 2008-03-25 20:30 227人阅读 评论(0) 收藏 举报 设计模式javaauthorizationpermissionsstringclass ...

  3. Java设计模式之《桥接模式》及应用场景

    摘要: 原创作品,可以转载,但是请标注出处地址http://www.cnblogs.com/V1haoge/p/6497919.html 这里摘抄一份他处的概念,你可以不必理会,先看下面得讲解与实例, ...

  4. Java设计模式之《外观模式》及应用场景

    原创作品,可以转载,但是请标注出处地址http://www.cnblogs.com/V1haoge/p/6484128.html 1.外观模式简介 外观模式,一般用在子系统与访问之间,用于对访问屏蔽复 ...

  5. Java设计模式之《代理模式》及应用场景

    原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6525527.html 代理模式算是我接触较早的模式,代理就是中介,中间人.法律上也有代理, ...

  6. Java设计模式系列-抽象工厂模式

    原创文章,转载请标注出处:https://www.cnblogs.com/V1haoge/p/10755412.html 一.概述 抽象工厂模式是对工厂方法模式的再升级,但是二者面对的场景稍显差别. ...

  7. Java设计模式系列-工厂方法模式

    原创文章,转载请标注出处:<Java设计模式系列-工厂方法模式> 一.概述 工厂,就是生产产品的地方. 在Java设计模式中使用工厂的概念,那就是生成对象的地方了. 本来直接就能创建的对象 ...

  8. Java设计模式系列-装饰器模式

    原创文章,转载请标注出处:<Java设计模式系列-装饰器模式> 一.概述 装饰器模式作用是针对目标方法进行增强,提供新的功能或者额外的功能. 不同于适配器模式和桥接模式,装饰器模式涉及的是 ...

  9. 折腾Java设计模式之中介者模式

    博文原址:折腾Java设计模式之中介者模式 中介者模式 中介者模式(Mediator Pattern)是用来降低多个对象和类之间的通信复杂性.这种模式提供了一个中介类,该类通常处理不同类之间的通信,并 ...

随机推荐

  1. ubuntu 安装chrome浏览器

    对于一个一直用chrome的人来说,真的很不习惯用firefox,虽然firebug很好用.. 好吧,心情不佳,直接上命令: 下载命令(有墙,下不下来,多试几次): wget https://dl.g ...

  2. 避免Node.js中回调地狱

    为了解决这个阻塞问题,JavaScript严重依赖于回调,这是在长时间运行的进程(IO,定时器等)完成后运行的函数,因此允许代码执行经过长时间运行的任务. downloadFile('example. ...

  3. Spring框架中整合JUnit单元测试的方法

    一. 步骤: 1. 拷贝jar包: 1. JUnit-4.9.jar和spring-test-4.2.4.RELEASE.jar ; 2. 替换原来的main函数: 1. 在测试类上使用注解方式替换: ...

  4. js原生拓展网址——mozilla开发者

    https://developer.mozilla.org/zh-CN/docs/Web/JavaScript https://developer.mozilla.org/zh-CN/docs/Web ...

  5. Pomelo的监控模块

    对服务器的监控和管理有三个主体:master,monitor,client:master负责收集所有服务器的信息,下发对服务器的操作指令.monitor负责上报服务器状态,并对master的命令作出反 ...

  6. Java 导出Excel的各种尝试

    最近的一个项目比较忙,一直没时间过来跟新博客.今天过来分享一下在此项目中遇到的一个小问题:导出Excel:相信导出Excel这个功能是特别常见的,也有很多的方式.好了,不多说了,直接说说自己遇到的各种 ...

  7. es6笔记5^_^set、map、iterator

    一.set 1.基本用法 数据结构Set类似于数组,但是成员的值都是唯一的,没有重复的值. let s = new Set(); [2,3,5,4,5,2,2].map(x => s.add(x ...

  8. HDU4738(割边)

    Caocao's Bridges Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  9. Vmware虚拟机安装Ubuntu 16.04 LTS(长期支持)版本+VMware tools安装

    今天用VMware虚拟机安装了Ubuntu 16.04,过程用点繁琐,顺便又安装了VMware tools,这样就可以全屏显示Ubuntu系统了,下面是具体的安装过程! 第一步:准备工作 1.下载Ub ...

  10. Myeclipse插件将wsdl生成java客户端代码

    一.建立webservice服务端: 1.新建一个web service project,名称为webservice_server截图如下,点击finish. 2.选择工程,点击右键,选择new-&g ...