• 架构设计之设计模式 (一) 适配器(Adapter)---提高复用性


    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;
            /**
             * 自己定义一个接口,完成栈队列功能
             * @author LLS
             *
             */
            public interface MyQueue {
            	/*
            	 * 进队列
            	 */
            	public void push(Object item);     
            	/*
            	 * 出队列
            	 */
                public Object putout();            
            	/*
            	 * 返回队列中最后一项
            	 */
                public Object ShowLastItem();      
            	/*
            	 * 返回队列中第一项
            	 */
                public Object ShowFirstItem();     
            
            }

        1. 适配器类
          1. package com.adapter;
            
            import java.util.ArrayList;
            /**
             * 适配器类完成栈功能
             * @author LLS
             *
             */
            public class Adapter implements MyQueue {
            	//持有对适配对象的引用
            	private ArrayList adaptee;
            	//构造函数
            	public Adapter()
            	{
            		adaptee=new ArrayList();
            	}
            	
            	@Override
            	public void push(Object item) {
            		//像队列中加入一个元素
            		adaptee.add(item);
            	}
            
            	@Override
            	public Object putout() {
            		//将第一个元素取出来
            		Object itemObject=adaptee.get(0);
            		//从队列中移除第一个元素
            		adaptee.remove(0);
            		//返回第一个元素
            		return itemObject;
            	}
            
            	@Override
            	public Object ShowLastItem() {
            		//返回队列中最后一个元素
            		return adaptee.get(adaptee.size()-1);
            	}
            
            	@Override
            	public Object ShowFirstItem() {
            		return adaptee.get(0);
            	}
            
            }
            

        1. 通过复用ArrayList类,大大减少了我们自己写的代码,元素的获取、加入等一些功能已经在ArrayList中实现,这种例子比比皆是。
    1. JDK中典型例子
      1. 缺省适配器
        1. 你是否有这样的疑问,系统提供了那么多接口,接口里有那么多方法,当我们使用某一个接口时只实现了某几个方法,而我们知道的原则是接口中方法必须全部实现,这里面用到了适配器类。
        2. 下面是自己定义的一个接口,其中,有四个方法,我们只实现两个。
        3. 自定义接口
          1. package com.adapter;
            //自定义接口,其中,有四个方法
            public interface MyInterface {
            	public void methodOne();
            	public void methodTwo();
            	public void methodThird();
            	public void methodFour();
            }
            

        1. 被适配类
          1. package com.adapter;
            
            public abstract class Adatee implements MyInterface {
            
            	@Override
            	public void methodOne() {
            	}
            	@Override
            	public void methodTwo() {
            
            	}
            	@Override
            	public void methodThird() {
            
            	}
            	@Override
            	public void methodFour() {
            	}
            
            }
            

        1. 适配类(只需实现自己需要方法即可)
          1. package com.adapter;
            
            public class MyClass extends Adatee {
            	//只实现方法methodOne即可
            	public void methodOne()
            	{
            		//实现代码
            	}
            }
            

        1. .NETJava中提供了很多这样的接口,提供了缺省适配,只实现自己需要的方法,不需要的不用管,减少了不必要的麻烦。
    1. 项目开发中应用场景
      1. 看下面这张图
      1. 想了想现在我们做的系统中,对这个模式的应用,还是寥寥无几没有用到这个模式,又考虑了哪里可以加入这个模式。
        1. 数据库同步
          1. 在教务的基础数据系统、评教、考试这几个系统之间肯定会涉及到数据库同步问题,他们之间得数据也有些差异,有一些公司也在做数据库同步的产品,例如TIBCO数据库适配器(TIBCO Adapter for Active Database),简称ADB可以实现多个数据库之间得双向同步。
          1. 可见这也是一个比较重要的方向。
        1. 数据字典
          1. 在数据字典中使用适配器主要是调用已经写好的字典,或是再往里面添加新数据时,新老字典的集成可以通过适配器。
    1. 适配器与其它模式的关系以后介绍……
  • 相关阅读:
    马哥学习笔记二十一——LVS DR模型
    马哥学习笔记二十——集群系列之LVS调度方法及NAT模型
    CCNA学习笔记九——访问控制列表(ACL)
    CCNA学习笔记八——动态路由协议
    CCNA学习笔记七——路由概述
    CCNA学习笔记六——网络层协议
    WPF点补间、拟合回归直线
    WPF三种基本触发器与【与或】逻辑触发器
    C#与mysql做ASP.NET网页数据库查询速度测试
    VS2013单元测试及代码覆盖率分析--Xunit
  • 原文地址:https://www.cnblogs.com/lilongsheng1125/p/4978578.html
Copyright © 2020-2023  润新知