适配器模式-三类实现
-
定义:适配器模式将某个类的接口转换成客户端期望的另一个接口表示,主的目的是兼容性,让原本因接口不匹配不能一起工作的两个类可以协同工作。其别名为包装器(Wrapper)。
-
属于结构型模式
-
主要分为三类:类适配器模式、对象的适配器模式、接口的适配器模式
自定义场景:
唱歌、跳舞两件事不能同时实现。
类适配器模式
-
自定义场景:
唱歌是接口、跳舞是类; -
一句话解释:
Wrapper 类,通过继承 Dance 类,实现 Sing 类接口,完成Dance ->Sing 的适配;
类适配器.png -
代码:
//唱歌 public interface Sing { public String doSing(); } //跳舞 public class Dance { public String doDance() { return "doDance"; } } //唱跳 public class Wrapper extends Dance implements Sing { @Override public String doSing() { return "doSing and " + doDance(); } public static void main(String[] args) { Wrapper wrapper = new Wrapper(); System.out.print(wrapper.doSing()); } }
对象适配器模式
-
自定义场景:
唱歌是接口、跳舞是类; -
一句话解释:
Wrapper 类,通过持有 Dance 类(可换成使用反射),实现 Sing 类接口,完成Dance ->Sing 的适配;
对象适配器.jpg
注意:Wrapper中持有Dance类在UML中没显示;
-
代码:
//唱歌 public interface Sing { public String doSing(); } //跳舞 public class Dance { public String doDance() { return "doDance"; } } //唱跳 //对象适配器 public class Wrapper implements Sing { private Dance dance; public Wrapper(Dance dance) { this.dance = dance; } @Override public String doSing() { return "对象适配器:doSing and " + dance.doDance(); } public static void main(String[] args) { Wrapper wrapper = new Wrapper(new Dance()); System.out.print(wrapper.doSing()); } }
接口适配器模式
-
自定义场景:
唱歌是接口(多个方法);MySing只想用唱中的一种方法; -
N句话解释:
通过抽象类来实现适配;
当存在这样一个接口,其中定义了很多很多方法;而我们现在却只想使用其中的一个到几个方法,如果我们直接实现接口,那么我们要对所有的方法进行实现,就算我们对不需要的方法进行置空(只写一对大括号,不作具体方法实现)也会导致着这个类变得臃肿,调用不便。这时我们可以使用一个抽象类作为适配器,用这个抽象类实现接口,而在抽象类中所有方法都进行置空;那么我们在创建抽象类的继承类,而且只重写我们需要使用的那几个方法就行。
接口适配器.jpg-
代码:
//有多个唱歌方法的接口 public interface Sing { public String doSing(); public String doSingA(); public String doSingB(); } //接口适配器 abstract class Wrapper implements Sing { public String doSing() { return null; } public String doSingA() { return null; } public String doSingB() { return null; } } //适配器的使用,只用一个方法 public class MySing extends Wrapper { //我在使用第一种唱歌方法的时候,就不需要把其他方法也实现; @Override public String doSing() { return "只用一种唱歌"; } }
感谢网友的分分享:
https://blog.csdn.net/u013276277/article/details/78394756
https://blog.csdn.net/zxt0601/article/details/52848004
https://blog.csdn.net/psp0001060/article/details/50738580