码迷,mamicode.com
首页 > 编程语言 > 详细

Java设计模式1-适配器模式

时间:2015-01-15 17:36:32      阅读:147      评论:0      收藏:0      [点我收藏+]

标签:

一、适配器模式简介

    适配器模式主要解决的问题是:当需调用已存接口类型,此接口类型无法满足当前需求。需要创建一个适配器对已存接口类型进行转换,转换后达到供新需求调用的目的。适配器仅仅起到一个功能转换的目的,而具体实现仍然是旧接口类型。

    下面以一个比较通俗的例子进行阐述:

     大家都在用手机,当我们手机没电时需要充电,我们不能直接把220V交流电插入手机上,否则手机肯定报废。而是需要一个充电器把高压电流转化成符合手机的低压电流。从而实现了手机充电这个功能。

二、适配器适用场景

    1、使用第三方类提供的方法时,需要转换成当前系统需要的方法。

    2、当前已经存在系统,新建一个系统并且要求新系统能够使用旧系统的数据接口。

三、Java适配器分类

    1、类适配器

         当新需求需要调用一个接口规则时,我们可以让适配器继承自已存接口类型,并且同时实现接口类型方法。在实现方法内调用已存接口类型的方法。从而达到实现转换的目的。

    2、对象适配器

        当新需求调用非接口时,我们让适配器继承自需求类,并且在适配器内部新建一个已存类型的实例,在需求方法内部调用已存类型的方法。从而达到转换的目的。

四、涉及角色

    4.1、调用者(Client)

    4.2、目标(Target)

    4.3、适配器(Adapter)

    4.4、被适配者(Adaptee)

五、适配器模式实例讲解

      实例场景:

      某公司已经在线运行ERP软件(自主开发),一直运行比较稳定,由部门程序员小张维护。近期、委托B软件公司进行扩展功能开发,已经根据需求完成了大半的工作。此时,B软件公司需要一个功能,把当前ERP的库存进行展现,设计调用规则为接口的GetList()方法,考虑到ERP已经存在此模块功能,但是原功能函数为Query()。此时,为了数据的来源的一致性,需要小张提供一个接口实现,完成功能转换。

     4.1、类适配器类图

   类图:

    技术分享

     角色分解:

     ClientClass:调用者,是B软件公司显示库存的功能。

     TargetInterface:目标接口,B软件公司设计的调用规则,规定调用GetList()函数功能,(java中的接口类型)

     AdapteeClass:被适配者,ERP软件中已存模块,其中查询库存使用了Query()函数。

     AdapterClass:适配器,用于把AdapteeClass中的Query()函数转换成ClientClass中使用的调用规则函数GetList().

    代码:

///客户端使用类
public class ClientClass {

	///运行
	public static void main(String[] args)
	{
		ClientClass d = new ClientClass();
		d.GetData();
	}

	
	public void GetData()
	{
		TargetInterface target = new AdapterClass();
		ArrayList<String> data = target.GetList();
		System.out.print(data);
		
	}
}


///目标
public interface TargetInterface {
	ArrayList<String> GetList();
}


///适配器
public class AdapterClass implements TargetInterface {

	public ArrayList<String> GetList() {
		AdapteeClass adapter = new AdapteeClass();
		return adapter.Query();
	}

}

///被适配者
public class AdapteeClass {
	
	public ArrayList<String> Query()
	{
		return  new ArrayList<String>(){{add("1");add("2");add("3");}};
	}

}

  运行效果:

  技术分享

  4.2、对象适配模式

  类图

技术分享

     角色分解:

     ClientClass:调用者,是B软件公司显示库存的功能。

     TargetInterface:目标接口,B软件公司设计的调用规则,规定调用GetList()函数功能,(java中的抽象类)

     AdapteeClass:被适配者,ERP软件中已存模块,其中查询库存使用了Query()函数。

     AdapterClass:适配器,用于把AdapteeClass中的Query()函数转换成ClientClass中使用的调用规则函数GetList().

   代码实例:

   

package com.msj.adapter.objectadapter;

import java.util.ArrayList;



public class ClientClass {

    ///运行
    public static void main(String[] args)
    {
        ClientClass d = new ClientClass();
        d.GetData();
    }

    
    public void GetData()
    {
        TargetAbstractClass target = new AdapterClass();
        ArrayList<String> data = target.GetList();
        System.out.print(data);

        
    }
}

public abstract class TargetAbstractClass {
    
    abstract ArrayList<String> GetList();
}

public class AdapterClass extends TargetAbstractClass{
    
    @Override
    java.util.ArrayList<String> GetList() {
        AdapteeClass adapter = new AdapteeClass();
        return adapter.Query();
    }
    

}



public class AdapteeClass {
    
    public ArrayList<String> Query()
    {
        return  new ArrayList<String>(){{add("1");add("2");add("3");}};
    }

}

运行效果:

  跟类适配器效果相同。

 

Java设计模式1-适配器模式

标签:

原文地址:http://www.cnblogs.com/msjqd/p/4224173.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!