适配器模式定义: 将一个类的接口, 转化成客户期望的另一个接口, 适配器让原来接口不兼容的类可以合作无间.
适配器在现实中的表现: 插座转化器, 形状拼图等等.
面向对象中的实现:
本文例子:
狗类, 兔子类, 适配器类, 测试类
要求:
1. 缺少兔子类对象, 先用狗类冒充一下
2. 不会让客户调用兔子类的方法, 发生改变(例如在客户调用的方法内做判断如果是某个值, 去调用狗类的方法, 去冒充兔子类)
代码实现:
狗的接口类
- package com.adapterPattern.dog;
- /**
- * @program: test
- * @description: 狗
- * @author: Mr.Yang
- * @create: 2018-12-15 16:17
- **/
- public interface Dog {
- /**
- * 狗也会跳, 不过没有兔子跳的远
- */
- public void jump();
- /**
- * 狗会发出汪汪的叫声
- */
- public void bark();
- }
- View Code
项目初始, 已经存在的小黑狗类, 先用这个顶替一个新的兔子类
- package com.adapterPattern.dog;
- /**
- * @program: test
- * @description: 小黑狗, 实现了狗接口的具体类
- * @author: Mr.Yang
- * @create: 2018-12-15 16:19
- **/
- public class LittleBlackDog implements Dog{
- public void jump() {
- System.out.println("小黑狗, 跳一米");
- }
- public void bark() {
- System.out.println("小黑狗, 汪汪的叫");
- }
- }
- View Code
兔子的接口类
- package com.adapterPattern.rabbit;
- /**
- * @program: test
- * @description: 兔子
- * @author: Mr.Yang
- * @create: 2018-12-15 16:13
- **/
- public interface Rabbit {
- /**
- * 兔子拥有跳的方法
- */
- public void jump();
- /**
- * 兔子会咕咕叫
- */
- public void coo();
- }
- View Code
项目初始, 已经存在的兔子类
- package com.adapterPattern.rabbit;
- /**
- * @program: test
- * @description: 小白兔类, 实现兔子接口的具体类
- * @author: Mr.Yang
- * @create: 2018-12-15 16:16
- **/
- public class LittleWhiteRabbit implements Rabbit{
- public void jump() {
- System.out.println("小白兔, 跳 2 米");
- }
- public void coo() {
- System.out.println("小白兔, 在咕咕叫");
- }
- }
- View Code
适配器类, 负责将已经存在的小黑狗先顶替成新的鸭子
- package com.adapterPattern.adapter;
- import com.adapterPattern.dog.Dog;
- import com.adapterPattern.rabbit.Rabbit;
- /**
- * @program: test
- * @description: 缺兔子对象, 适配器负责将狗类充当为兔子类
- * @author: Mr.Yang
- * @create: 2018-12-15 16:21
- **/
- public class ActAsRabbitAdapter implements Rabbit {
- Dog dog;
- public ActAsRabbitAdapter(Dog dog){
- this.dog=dog;
- }
- /**
- * 外部还是调用兔子的方法, 内部的实现是狗的跳, 狗需要跳两次才和兔子跳的距离一样
- */
- public void jump() {
- dog.jump();
- dog.jump();
- }
- /**
- * 外部还是调用兔子叫的方法, 内部的实现是狗的叫
- */
- public void coo() {
- dog.bark();
- }
- }
- View Code
测试类 --testRabbit()方法相等于客户之前的调用方法. 通过适配器, 成功的将新的兔子类给实现了, 只不过内部走的是狗的方法. testRabbit()还是正常的调用, 不做任何改变.
- package com.adapterPattern.patternTest;
- import com.adapterPattern.adapter.ActAsRabbitAdapter;
- import com.adapterPattern.dog.Dog;
- import com.adapterPattern.dog.LittleBlackDog;
- import com.adapterPattern.rabbit.LittleWhiteRabbit;
- import com.adapterPattern.rabbit.Rabbit;
- /**
- * @program: test
- * @description: 适配器模式测试类
- * @author: Mr.Yang
- * @create: 2018-12-15 16:26
- **/
- public class Test {
- /**
- * 负责执行鸭子的跳与叫
- * @param rabbit
- */
- public static void testRabbit(Rabbit rabbit){
- rabbit.jump();
- rabbit.coo();
- }
- /**
- * 负责执行狗的跳与叫
- * @param dog
- */
- public static void testDog(Dog dog){
- dog.jump();
- dog.bark();
- }
- public static void main(String[] args) {
- // 创建一个兔子类
- Rabbit rabbit = new LittleWhiteRabbit();
- // 创建一个狗类
- Dog dog = new LittleBlackDog();
- // 创建一个适配器, 包装狗类, 为兔子类
- Rabbit adapterRabbit = new ActAsRabbitAdapter(dog);
- System.out.println("---------------------- 小白兔的跳与叫 --------------------");
- testRabbit(rabbit);
- System.out.println("---------------------- 小黑狗的跳与叫 --------------------");
- testDog(dog);
- System.out.println("---------------------- 适配器 (相等于兔子) 的跳与叫 --------------------");
- // 适配实现了兔子接口, 所以可以别认为是个兔子, testRabbit()这个方法并不知道这个是适配器
- testRabbit(adapterRabbit);
- }
- }
- View Code
测试结果
---------------------- 兔子的跳与叫 --------------------
小白兔, 跳 2 米
小白兔, 在咕咕叫
---------------------- 狗的跳与叫 --------------------
小黑狗, 跳一米
小黑狗, 汪汪的叫
---------------------- 适配器 (相等于兔子) 的跳与叫 --------------------
小黑狗, 跳一米
小黑狗, 跳一米
小黑狗, 汪汪的叫
View Code
来源: https://www.cnblogs.com/yangxiaojie/p/10124050.html