1. 简介
    1. 简介是为了描述一下该模式是干嘛用的,为了让不了解该模式的人看了之后也有一些新的认识。
    1. 本文章分为两部分,第一部分主要介绍适配器模式;第二部分介绍该模式与相近模式的异同。
    1. 下午一直在讨论设计模式,米老师也对模式的讲解做了点指正,我们讲课重点放在了一些理论的层次,而且局限于书中,效果是对于理论往往是越深入讨论越迷糊,倒不如拿出经常用到的一些经典实例来讨论,因此,以后博客会把重点放在实际应用以及模式之间得区别与联系上。
  1. 生活中的“适配器”
    1. 不知道小时候你们是否看到过变压器,记得小时候每天放学后经常在村里面跑着玩,也经常看到路边有变压器,上面挂着一个“闪电标识”,表示危险,也不敢走的太近,而且每逢雷雨过后经常出现停电的情况,问一下为嘛停电了?听别人说由于变压器坏了,那时并不知道变压器是个什么东西,但它的作用还是很大的。
    1. 在不同的国家变压器的电压是不相同的,比如在美国电器的电压为110V,在我们国家电压是220V,那如果你从美国买一个电视机很可能在中国用不了,为了解决电器之间的通用性,有人设计了变压器来调节电压,使得不能正常工作的电视可以工作,由此可见,变压器如此之重要。
    1. 回到正题,“适配器”发挥的作用其实就如同变压器一样,起到了一个间接作用,使得原本不能一起工作的两个或多个东西可以一起工作。
  1. 继承、组合----->>类适配器、对象适配器
    1. 适配器有两种形式分别为类适配器与对象适配器,为什么会分为这两种需要从CARP原则来分析,适配器模式本质上来说是CARP原则的具体化。
      1. 如果你对适配器不了解,那么你应该了解继承吧,这是面向对象的特征之一,大家想一下子类是不是在重写父类方法同时,可以引入新的方法,如果再让子类去实现一个接口呢,这不就是类适配器吗?
      1. 而组合是通过传入源对象的引用来达到目的,正如对象适配器,可以传入一个也可以传入多个对象,给他们适配。
    1. 我想大家已经对继承、组合的优点缺点了然于心,它们的优缺点即适配器的优缺点,在这里也就不用累述了,只给大家提一点:要尽量使用组合,少用继承。
    1. 不管是继承还是组合,它们的目的是为了复用已有的类,适配器也是如此,下面就给大家举一个利用已有的类来完成新类功能的例子。
  1. 应用实例
    1. 前提是这样的,我们需要写一个类完成栈(Stack)队列结构,先进先出后进后出(FIFO)功能,所有的功能你是不是全部来从同开发,那样会很麻烦,我这里是通过复用ArrayList类来实现,该类作为被适配对象。
    1. 代码如下
      1. 自己定义的队列接口
          1. package com.adapter;
          2. /**
          3. * 自己定义一个接口,完成栈队列功能
          4. * @author LLS
          5. *
          6. */
          7. public interface MyQueue {
          8. /*
          9. * 进队列
          10. */
          11. public void push(Object item);
          12. /*
          13. * 出队列
          14. */
          15. public Object putout();
          16. /*
          17. * 返回队列中最后一项
          18. */
          19. public Object ShowLastItem();
          20. /*
          21. * 返回队列中第一项
          22. */
          23. public Object ShowFirstItem();
          24.  
          25. }
      1. 适配器类
          1. package com.adapter;
          2.  
          3. import java.util.ArrayList;
          4. /**
          5. * 适配器类完成栈功能
          6. * @author LLS
          7. *
          8. */
          9. public class Adapter implements MyQueue {
          10. //持有对适配对象的引用
          11. private ArrayList adaptee;
          12. //构造函数
          13. public Adapter()
          14. {
          15. adaptee=new ArrayList();
          16. }
          17.  
          18. @Override
          19. public void push(Object item) {
          20. //像队列中加入一个元素
          21. adaptee.add(item);
          22. }
          23.  
          24. @Override
          25. public Object putout() {
          26. //将第一个元素取出来
          27. Object itemObject=adaptee.get(0);
          28. //从队列中移除第一个元素
          29. adaptee.remove(0);
          30. //返回第一个元素
          31. return itemObject;
          32. }
          33.  
          34. @Override
          35. public Object ShowLastItem() {
          36. //返回队列中最后一个元素
          37. return adaptee.get(adaptee.size()-1);
          38. }
          39.  
          40. @Override
          41. public Object ShowFirstItem() {
          42. return adaptee.get(0);
          43. }
          44.  
          45. }
      1. 通过复用ArrayList类,大大减少了我们自己写的代码,元素的获取、加入等一些功能已经在ArrayList中实现,这种例子比比皆是。
  1. JDK中典型例子
    1. 缺省适配器
      1. 你是否有这样的疑问,系统提供了那么多接口,接口里有那么多方法,当我们使用某一个接口时只实现了某几个方法,而我们知道的原则是接口中方法必须全部实现,这里面用到了适配器类。
      2. 下面是自己定义的一个接口,其中,有四个方法,我们只实现两个。
      3. 自定义接口
          1. package com.adapter;
          2. //自定义接口,其中,有四个方法
          3. public interface MyInterface {
          4. public void methodOne();
          5. public void methodTwo();
          6. public void methodThird();
          7. public void methodFour();
          8. }
      1. 被适配类
          1. package com.adapter;
          2.  
          3. public abstract class Adatee implements MyInterface {
          4.  
          5. @Override
          6. public void methodOne() {
          7. }
          8. @Override
          9. public void methodTwo() {
          10.  
          11. }
          12. @Override
          13. public void methodThird() {
          14.  
          15. }
          16. @Override
          17. public void methodFour() {
          18. }
          19.  
          20. }
      1. 适配类(只需实现自己需要方法即可)
          1. package com.adapter;
          2.  
          3. public class MyClass extends Adatee {
          4. //只实现方法methodOne即可
          5. public void methodOne()
          6. {
          7. //实现代码
          8. }
          9. }
      1. 在.NET或Java中提供了很多这样的接口,提供了缺省适配,只实现自己需要的方法,不需要的不用管,减少了不必要的麻烦。
  1. 项目开发中应用场景
    1. 看下面这张图
    1. 想了想现在我们做的系统中,对这个模式的应用,还是寥寥无几没有用到这个模式,又考虑了哪里可以加入这个模式。
      1. 数据库同步
        1. 在教务的基础数据系统、评教、考试这几个系统之间肯定会涉及到数据库同步问题,他们之间得数据也有些差异,有一些公司也在做数据库同步的产品,例如TIBCO数据库适配器(TIBCO Adapter for Active Database),简称ADB可以实现多个数据库之间得双向同步。
        1. 可见这也是一个比较重要的方向。
      1. 数据字典
        1. 在数据字典中使用适配器主要是调用已经写好的字典,或是再往里面添加新数据时,新老字典的集成可以通过适配器。
  1. 适配器与其它模式的关系以后介绍……

架构设计之设计模式 (一) 适配器(Adapter)---提高复用性的更多相关文章

  1. Atitit.架构设计趋势 设计模式 ---微服务架构  soa

    Atitit.架构设计趋势 设计模式 ---微服务架构  soa 什么是微服务架构?1 .微服务与SOA的关系 :微服务架架构师面向服务架构(SOA)的一种特定实现1 微服务与康威定律2 微服务的一些 ...

  2. Java设计模式之 — 适配器(Adapter)

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/9400141 今天一大早,你的leader就匆匆忙忙跑过来找到你:“快,快,紧急任务 ...

  3. 设计模式模式适配器(Adapter)摘录

    23种子GOF设计模式一般分为三类:创建模式.结构模型.行为模式. 创建模式抽象的实例,他们帮助建立一个系统,是独立于如何.这是一个这些对象和陈述的组合.创建使用继承一个类架构更改实例,一个对象类型模 ...

  4. Java读源代码学设计模式:适配器Adapter

    适配器模式相关源代码:slf4j-1.6.1.hibernate-3.6.7 大家都知道.log4j是一个广泛使用的日志工具,除此之外.sun公司在JDK中也有自己的日志工具,也就是java.util ...

  5. 设计模式--适配器(Adapter)模式

    今天学习另一个设计模式,适配器(Adapter)模式,这是一个共同方向,但有特殊要求,就应用到此设计模式.写到这里,想起很久以前,有写过一篇<ASP.NET的适配器设计模式(Adapter)&g ...

  6. iOS架构设计系列之解耦的尝试之变异的MVVM

    最近一段时间,在思考如何合理的架构一个可扩展性良好的界面编程方式.这一部分的成果做成了一个叫ElementKit的库.目前功能在不断的完善中. 关于iOS的架构,看多了MVVM,VIPER,MVC,M ...

  7. 分布式抽奖秒杀系统,DDD架构设计和实现分享

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.用大项目,贯穿知识体系 写CRUD.堆API.改屎山⛰,熬多少个996也只是成为重复的螺丝 ...

  8. Ruby设计模式透析之 —— 适配器(Adapter)

    转载请注明出处:http://blog.csdn.net/sinyu890807/article/details/9400153 此为Java设计模式透析的拷贝版,专门为Ruby爱好者提供的,不熟悉R ...

  9. 设计模式学习心得<适配器 Adapter>

    适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁.这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能. 这种模式涉及到一个单一的类,该类负责加入独立的或不兼容的接 ...

随机推荐

  1. 第三届蓝桥杯Java高职组决赛第三题

    题目描述: 某少年宫引进了一批机器人小车.可以接受预先输入的指令,按指令行动.小车的基本动作很简单,只有3种:左转(记为L),右转(记为R),向前走若干厘米(直接记数字). 例如,我们可以对小车输入如 ...

  2. C# The process cannot access the file because it is being used by another process

    C# The process cannot access the file because it is being used by another process   The process cann ...

  3. 重新想象 Windows 8 Store Apps (18) - 绘图: Shape, Path, Stroke, Brush

    原文:重新想象 Windows 8 Store Apps (18) - 绘图: Shape, Path, Stroke, Brush [源码下载] 重新想象 Windows 8 Store Apps ...

  4. MySQL 最经常使用的一千行

    /* 启动MySQL */ net start mysql /* 连接和断开server */ mysql -h 住址 -P port -u username -p password /* 跳过许可认 ...

  5. Tuxedo学习门户网站

    中间件简介: 介于客户机和server之间的夹层,突破了传统的c/s架构,为构建大规模,高性能.分布式c/s应用程序提供了通信.事物,安全.容错等基础服务,屏蔽了底层应用细节,应用程序不必从底层开发, ...

  6. OutputCache说明

    当用户访问该页面,整个页面会server存储在内存中,因此,该页面缓存.当用户再次访问该页面,页面不会再次运行数据操作,页面首先检查server中是否存在缓存.假设缓存存在,则直接从缓存中获取页面信息 ...

  7. 介绍一款轻量级js控件:easy.js

    easy.js 组件高速入门 在使用 easy.js 的组件之前,假设能花上几分钟看看以下的一些简单的入门指南,在使用组件的时候你会更加的得心应手. 简单性 easy.js 的组件在 UI(界面) 层 ...

  8. [创意标题] spoj 11354 Amusing numbers

    意甲冠军: 给k(1<=k<=10^15),先询问k 大只包含数字5和6的数目是多少 实例 1那是,5 ,3那是,55 .4那是,56 思考: 首先,我们可以找到.有许多2这是头号,有两个 ...

  9. Makefile 中:= ?= += =的差别 和条件运行

    一:在Makefile中常常看到obj-m    := scull.o和KERNELDIR ?= /lib/modules/等不同的赋值方式,如今总结他们的差别: = 是最主要的赋值 := 是覆盖之前 ...

  10. js便签笔记(13)——jsonp事实上非常easy【ajax跨域请求】

    前两天被问到ajax跨域怎样解决,还真被问住了,光知道有个什么jsonp,迷迷糊糊的没有说上来.抱着有问题必须解决的态度,我看了很多资料,原来如此.. . 为何一直知道jsonp,但一直迷迷糊糊的不明 ...