适配器模式(Adater Pattern)

本文介绍了适配器模式的基本概念及其实现方式,包括类适配器和对象适配器两种类型。通过示例代码展示了如何使两个原本接口不匹配的类能够协同工作,增强了类的复用性和灵活性。

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

适配器模式(Adater Pattern)
适配器模式又叫变压模式,也叫做包装模式,但包装模式不止一个,装饰者模式也是包装者模式的一种:将一个类的接口变成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。

实现的核心思想:通过类的继承或者关联。
因此可以分成两类:
1. 类适配器:通过类间的继承实现。
[img]http://dl.iteye.com/upload/attachment/0065/4780/c077c0ea-981e-3896-be7c-15b047985908.png[/img]

2. 对象适配器:通过类间的关联实现。

[img]http://dl.iteye.com/upload/attachment/0065/4782/f17a65dd-520d-3023-b8ab-081b6d36073f.png[/img]


优点:
1. 使两个没有任何关系的类在一起运行。
2. 增加类的透明性,高层模块只需要调用Target目标角色,对于具体的业务实现不需要关心,交给源角色Adapee处理。对高层模块来说是透明的。
3. 提高类的复用度,源角色在原有系统中可以正常使用,在目标系统中又可以充当新的演员。
4. 灵活性好,加载和卸载简单。对于其它代码基本不需要修改。

使用场景:在一个已投产的项目中,需要使用一个已有的类或者新建的类,而这个类又不适合系统原有的接口,可以考虑使用适配者模式。

使用的注意事项:在详细设计中一般不会考虑使用适配者模式,而是在对系统的扩展上,同时要保证遵守依赖倒置和里氏替换原则。

代码:
类适配器:

package org.AdaterPattern.extend;

public interface Target {
public void request();
}



package org.AdaterPattern.extend;

public class ConcreteTarget implements Target {

public void request() {
System.out.println("this is ConcreteTarget");
}
}




package org.AdaterPattern.extend;

public class Adapee {
public void dosoming(){
System.out.println("this is Adapee");
}
}




package org.AdaterPattern.extend;

public class Adater extends Adapee implements Target {

public void request() {
super.dosoming();
}

}




package org.AdaterPattern.extend;

public class Client {
public static void main(String[] args) {
Target target = new ConcreteTarget();
target.request();
System.out.println("----------------");
// 高层模块通过适配器使用源角色Adapee的类
target = new Adater();
target.request();
}
}



对象适配器:
前面的Target,ConcreteTarget一样在此不重复。

package org.AdaterPattern.relation;

public interface IAdapee1 {
public abstract void dosoming();
}



package org.AdaterPattern.relation;

public interface IAdapee2 {
public void dosoming();
}



package org.AdaterPattern.relation;

public class Adapee1 implements IAdapee1 {
public void dosoming(){
System.out.println("this is Adapee1");
}
}




package org.AdaterPattern.relation;

public class Adapee2 implements IAdapee2{
public void dosoming(){
System.out.println("this is Adapee2");
}
}




package org.AdaterPattern.relation;

public class Adater implements Target {
private IAdapee1 iAdapee1;
private IAdapee2 iAdapee2;
private Adapee1 adapee1;
private Adapee2 adapee2;



public Adater(Adapee1 adapee1, Adapee2 adapee2) {
this.adapee1 = adapee1;
this.adapee2 = adapee2;

this.iAdapee1 = this.adapee1;
this.iAdapee2 = this.adapee2;
}

public void request() {
this.iAdapee1.dosoming();
this.iAdapee2.dosoming();
}

}




package org.AdaterPattern.relation;

public class Client {
public static void main(String[] args) {
Target target = new ConcreteTarget();
target.request();
System.out.println("----------------");
// 高层模块通过适配器使用源角色Adapee的类
target = new Adater(new Adapee1(),new Adapee2());
target.request();
}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值