适配器设计模式

1)概述

适配器模式是结构型设计模式之一,其在不修改原来两个模块代码的情况下,将两个不兼容的类融合在一起,有点像粘合剂,通过转换使得他们能够协作起来, 

符合了开闭原则.

2)定义

适配器模式把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配无法在一起工作的两个类可以在一起工作.

3)使用场景

  • 系统需要使用现有的类,而此类接口不符合系统的需要,即接口不兼容
  • 想要建立一个可重复使用的类,用于关联彼此没有太大关联的一些类(包括即将引入的类)
  • 需要一个统一的输出接口,而输入端类型不确定.

4)UML

Adapter模式的结构图如下.

UML类图

  • Target:目标角色,期待得到的接口.
  • Adaptee:适配者角色,被适配的接口.
  • Adapter:适配器角色,将源接口转换成目标接口.

5)分类

  • 类适配器通过继承,是静态的定义方式. 
  • 而对象适配器通过代理,是动态组合的方式。

6)实现

    一.Target,源目标接口:各类水果

package com.zqr.design.adapterPattern;
/**客户想喝果汁
 * 	Target,源目标接口:各类水果
    * @ClassName: Target  
 */
public interface Target {
	//苹果
	public void apple();
	//香蕉
	public void banan();
}

        具体的源目标,注:可有可无,没有的时候可以让适配器adapter直接实现Target

package com.zqr.design.adapterPattern;
/**
 * 	具体的源目标,注:可有可无,没有的时候可以让适配器adapter直接实现Target
    * @ClassName: TargetImpl  
 */
public class TargetImpl implements Target{

	@Override
	public void apple() {
		System.out.println("拿到苹果.....");
	}
	@Override
	public void banan() {
		System.out.println("拿到香蕉.....");
	}
}

    二.Adaptee,被适配者:各类果汁

package com.zqr.design.adapterPattern;
/**
 * Adaptee,被适配者:各类果汁
    * @ClassName: Adaptee  
 */
public interface Adaptee {
	//苹果汁
	public void appleJuice();
	//香蕉汁
	public void bananaJuice();
}

        具体的被适配者AdapteeImpl

package com.zqr.design.adapterPattern;
/**
 * 具体的被适配者
    * @ClassName: ConcreteAdaptee  
 */
public class AdapteeImpl implements Adaptee{
	@Override
	public void appleJuice() {
		System.out.println("榨成苹果汁.....");
	}
	@Override
	public void bananaJuice() {
		System.out.println("榨成香蕉汁.....");
	}
}

三.对象适配器:榨汁机Adapter,可以把水果变成果汁

package com.zqr.design.adapterPattern;
/**
 * 榨汁机Adapter:可以把水果变成果汁
    * @ClassName: Adapter  
 */
public class Adapter extends TargetImpl{//实现或者继承源目标Target
	private Adaptee adaptee;//私有,被适配者Adaptee
	public Adapter(Adaptee adaptee) {
		this.adaptee = adaptee;
	}
	
	@Override
	public void apple() {//重写吃苹果的方法,实际上却喝到了苹果汁
		super.apple();
		adaptee.appleJuice();
	}
	@Override
	public void banan() {//重写吃香蕉的方法,实际上却喝到了香蕉汁
		super.banan();
		adaptee.bananaJuice();
	}
}

四.客户Client拿到水果Target,想喝果汁Adaptee

package com.zqr.design.adapterPattern;
/**
 * 	客户Client拿到水果Target,想喝果汁Adaptee
    * @ClassName: Client  
 */
public class Client {
	private Target target;
	public Client(Target target) {
		this.target = target;
	}
	public void drinkAppleJuice() {
		target.apple();
	}
	public void drinkBananasJuice() {
		target.banan();
	}


五.测试



Pass:

类适配器AdapterClass,实现源目标接口,继承被适配者

package com.zqr.design.adapterPattern;
/**
 * 	类适配器:实现源目标接口,继承被适配者
    * @ClassName: AdapterClass  
 */
public class AdapterClass extends AdapteeImpl implements Target{
	@Override
	public void apple() {
		super.appleJuice();//调用源目标的apple()方法,实际执行的是被适配者的appleJuice()方法
	}
	@Override
	public void banan() {
		super.bananaJuice();//调用源目标的banan()方法,实际执行的是被适配者的bananaJuice()方法
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值