结构型模式的作用: 从程序的结构上实现松耦合,从而可以扩大整体的类结构,用来解决更大的问题
适配器模式(也称包装样式or包装):将一个类的接口适配成用户所期待的。一个适配允许通常因为接口不兼容而不能在一起工作的类工作在一起,做法是将类自己的接口包裹在一个已存在的类中。
//1. -------- 被适配的类:网线 --------
public class NetCable {
public void request(){
System.out.println("连上网线,可以上网");
}
}
//2. -------- 客户端类:想上网,但接口插不上网线 --------
public class Computer {
//上网的具体实现,插不上传统网线,需要一个转接头
public void net(NetToUsb adapter){
//上网的具体实现
adapter.handlerRequest();
}
}
//3. -------- 接口转换器的抽象实现 --------
public interface NetToUsb {
//作用:处理请求(将 网线插口 ---》 USB插口)
public void handlerRequest();
}
/**
* 4. -------- 真正的适配器:需要连接USB 和 网线 --------
* 继承网线类,实现网线转USB接口
*/
public class Adapter extends NetCable implements NetToUsb {
@Override
public void handlerRequest() {
super.request(); //调用网线的上网方法
}
}
//5. -------- 测试:电脑通过适配器,调用网线的上网方法 --------
public static void main(String[] args) {
//创建电脑、适配器;适配器实现了转接口的功能,可以调用
Computer computer = new Computer();
Adapter adapter = new Adapter();
computer.net(adapter);
}
适配器有两种方式: 1.继承:类适配器(java是单继承) 上面代码就是 类适配器 2.组合:对象适配器(常用)
// ------ 对象适配器:通过组合的方式,将网线的功能集成进来 ------
public class Adapter2 implements NetToUsb {
private NetCable netCable; //通过组合,集成网线类
//构造方法中,传入网线对象
public Adapter2(NetCable netCable) {
this.netCable = netCable;
}
@Override
public void handlerRequest() {
netCable.request();
}
}
public static void main(String[] args) {
//1.创建电脑
Computer computer = new Computer();
//2.创建网线对象
NetCable netCable = new NetCable();
//3.将网线对象,放入适配器中
Adapter2 adapter2 = new Adapter2(netCable);
//4.电脑调用适配器接口,可以上网
computer.net(adapter2);
}
适配器模式:将一个类的接口,转换成客户希望的另一个接口。Adapter模式使得原来由于接口不兼容而不能一起工作的类,可以在一起工作。 角色分析:
目标接口:客户期待的接口。目标接口可以是具体或者抽象类,也可以是接口(电脑需要的USB接口)
需要适配的类:被适配的类或者适配者类(网线)
适配器:通过包装一个需要适配的对象,把原接口转换成目标对象(SUB、网线 接口转换器)
分类 | 描述 |
---|---|
对象适配器优点 | 1.一个对象适配器,可以将多个不同的适配者,适配到同一个目标 2.满足里氏替换原则:由于适配器和适配者是关联关系,可以适配一个适配者或者它的子类 |
类适配器缺点 | 1.对于java、C#这种不支持多继承的语言,一个适配器只能适配一个适配者 2.在java、C#等语言中,类适配器模式中的目标抽象类,只能为接口不能为类,有局限性 |
适用场景 | 1.系统要使用一些现有的类,但这些类的接口(如方法名)不符合系统需要,甚至没有这些类的源代码 2.想创建一个可以重复使用的类,用于与一些彼此之间没有关联、甚至将来可能引进的类,一起工作 |
评论
登录后才可以进行评论哦!