适配器模式

适配器模式

  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 个工作方法。很麻烦。
    适配器模式_第1张图片

    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. 只定义一个适配器实现类
    这种方式类似于多功能充电器,一个电源插头上接着多种类型的充电接口。用户在使用时需要使用电器接口与多功能充电器上的充电接口逐个进行对比,接口匹配,则可以充电。
    适配器模式_第2张图片
    定义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. 为每一个工种都定义一个适配器
    适配器模式_第3张图片
    修改 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);
    	}
    }
    

    定义测试类
    适配器模式_第4张图片
    适配器模式_第5张图片

你可能感兴趣的:(GOF23设计模式,适配器模式)