适配器模式

本文详细介绍了适配器模式的概念及应用,通过具体实例展示了如何将不同接口的类进行统一管理,实现协同工作。探讨了三种适配方式:不使用适配器、单一适配器实现类和为每个工种定义适配器。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

适配器模式

  1. 适配器模式的定义是,Convert the interface of a class into another interface clients expect,将某个类的接口转换为接口客户所需的类型。换句话说,适配器模式解决的问题是,使得原本由于接口不兼容而不能一起工作、不能统一管理的那些类可以在一起工作、可以进行统一管理。

  2. 这里举个适配器模式的例子:这里有厨师接口 ICooker、程序员接口 IProgrammer,分别用于定义他们各自工种的具体工作。然后又定义了全聚德的厨师 QjdCooker、京东的程序员JdProgrammer。这些不同的工种所做的工作都各自是不同的,无法进行统一管理,协同工作。所以,此时就需要定义一个员工适配器接口 IWorkerAdapter,用于将这些不同的工种进行统一管理。

    interface ICooker{
    //定义ICooker
    	String cook();
    }
    
    interface IProgrammer{
    //定义IProgrammer
    	String program();
    }
    
    class QjdCooker implements ICooker{
    
    	@Override
    	public String cook() {
    		return "美味烤鸭";
    	}
    }
    class JdProgrammer implements IProgrammer{
    
    	@Override
    	public String program() {
    		return "高效程序";
    	}
    }
    
  3. 不使用适配器模式
    若不使用适配器模式,则调用者需要定义出所有的工种对象,然后逐个工种对象的工作方法进行调用。有 30 个工种,就应调用 30 个工作方法。很麻烦。
    在这里插入图片描述

    class MyTest{
    	public static void main(String[] args) {
    		ICooker cooker=new QjdCooker();
    		IProgrammer programmer=new JdProgrammer();
    		
    		System.out.println(cooker.cook());
    		System.out.println(programmer.program());
    	}
    }
    
  4. 只定义一个适配器实现类
    这种方式类似于多功能充电器,一个电源插头上接着多种类型的充电接口。用户在使用时需要使用电器接口与多功能充电器上的充电接口逐个进行对比,接口匹配,则可以充电。
    在这里插入图片描述
    定义IWorkerAdapter

    interface IWorkAdapter{
    	//为了兼容所有的工种,这里的参数必须为Object
    	void work(Object worker);
    }
    

    定义 WorkerAdapter

    class WorkAdapter implements IWorkAdapter{
    
    	@Override
    	public void work(Object worker) {
    		if(worker instanceof IProgrammer){
    			System.out.println(((IProgrammer)worker).program());
    		}
    		if(worker instanceof ICooker){
    			System.out.println(((ICooker)worker).cook());
    		}
    		
    	}
    	
    }
    

    定义测试类

    class MyTest2{
    	public static void main(String[] args) {
    		ICooker cooker=new QjdCooker();
    		IProgrammer programmer=new JdProgrammer();
    		Object[] workers={cooker,programmer};
    		IWorkAdapter adapter=new WorkAdapter();
    		for(Object worker:workers){
    			adapter.work(worker);
    		}
     	}
    }
    
  5. 为每一个工种都定义一个适配器
    在这里插入图片描述
    修改 IWorkerAdapter

    interface IWorkAdapter{
    	//为了兼容所有的工种,这里的参数必须为Object
    	void work(Object worker);
    	//判断当前适配器是否支持指定的工种对象
    	boolean supports (Object worker);
    }
    

    定义 CookerAdatper、ProgrammerAdapter

    class CookerAdapter implements IWorkAdapter{
    
    	@Override
    	public void work(Object worker) {
    		System.out.println(((ICooker)worker).cook());
    	}
    	@Override
    	public boolean supports(Object worker) {
    		// TODO Auto-generated method stub
    		return (worker instanceof ICooker);
    	}
    	
    }
    
    class ProgrammerAdapter implements IWorkAdapter{
    
    	@Override
    	public void work(Object worker) {
    		System.out.println(((IProgrammer)worker).program());
    	}
    	@Override
    	public boolean supports(Object worker) {
    		// TODO Auto-generated method stub
    		return (worker instanceof IProgrammer);
    	}
    }
    

    定义测试类
    在这里插入图片描述
    在这里插入图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值