适配器模式
Posted yangxiaojie
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了适配器模式相关的知识,希望对你有一定的参考价值。
适配器模式定义:将一个类的接口,转化成客户期望的另一个接口,适配器让原来接口不兼容的类可以合作无间。
适配器在现实中的表现:插座转化器,形状拼图等等。
面向对象中的实现:
本文例子:
-
狗类,兔子类,适配器类,测试类
要求:
1.缺少兔子类对象,先用狗类冒充一下
2.不会让客户调用兔子类的方法,发生改变(例如在客户调用的方法内做判断如果是某个值,去调用狗类的方法,去冒充兔子类)
代码实现:
狗的接口类
1 package com.adapterPattern.dog; 2 3 /** 4 * @program: test 5 * @description: 狗 6 * @author: Mr.Yang 7 * @create: 2018-12-15 16:17 8 **/ 9 public interface Dog { 10 11 /** 12 * 狗也会跳,不过没有兔子跳的远 13 */ 14 public void jump(); 15 16 /** 17 * 狗会发出汪汪的叫声 18 */ 19 public void bark(); 20 }
项目初始,已经存在的小黑狗类,先用这个顶替一个新的兔子类
1 package com.adapterPattern.dog; 2 3 /** 4 * @program: test 5 * @description: 小黑狗,实现了狗接口的具体类 6 * @author: Mr.Yang 7 * @create: 2018-12-15 16:19 8 **/ 9 public class LittleBlackDog implements Dog{ 10 11 public void jump() { 12 System.out.println("小黑狗,跳一米"); 13 } 14 15 public void bark() { 16 System.out.println("小黑狗,汪汪的叫"); 17 } 18 }
兔子的接口类
1 package com.adapterPattern.rabbit; 2 3 /** 4 * @program: test 5 * @description: 兔子 6 * @author: Mr.Yang 7 * @create: 2018-12-15 16:13 8 **/ 9 public interface Rabbit { 10 11 /** 12 * 兔子拥有跳的方法 13 */ 14 public void jump(); 15 16 /** 17 * 兔子会咕咕叫 18 */ 19 public void coo(); 20 }
项目初始,已经存在的兔子类
1 package com.adapterPattern.rabbit; 2 3 /** 4 * @program: test 5 * @description: 小白兔类,实现兔子接口的具体类 6 * @author: Mr.Yang 7 * @create: 2018-12-15 16:16 8 **/ 9 public class LittleWhiteRabbit implements Rabbit{ 10 11 public void jump() { 12 System.out.println("小白兔,跳2米"); 13 } 14 15 public void coo() { 16 System.out.println("小白兔,在咕咕叫"); 17 } 18 }
适配器类,负责将已经存在的小黑狗先顶替成新的鸭子
1 package com.adapterPattern.adapter; 2 3 import com.adapterPattern.dog.Dog; 4 import com.adapterPattern.rabbit.Rabbit; 5 6 /** 7 * @program: test 8 * @description: 缺兔子对象,适配器负责将狗类充当为兔子类 9 * @author: Mr.Yang 10 * @create: 2018-12-15 16:21 11 **/ 12 public class ActAsRabbitAdapter implements Rabbit { 13 Dog dog; 14 15 public ActAsRabbitAdapter(Dog dog){ 16 this.dog=dog; 17 } 18 19 /** 20 * 外部还是调用兔子的方法,内部的实现是狗的跳,狗需要跳两次才和兔子跳的距离一样 21 */ 22 public void jump() { 23 dog.jump(); 24 dog.jump(); 25 } 26 /** 27 * 外部还是调用兔子叫的方法,内部的实现是狗的叫 28 */ 29 public void coo() { 30 dog.bark(); 31 } 32 }
测试类--testRabbit()方法相等于客户之前的调用方法。通过适配器,成功的将新的兔子类给实现了,只不过内部走的是狗的方法。testRabbit()还是正常的调用,不做任何改变。
1 package com.adapterPattern.patternTest; 2 3 import com.adapterPattern.adapter.ActAsRabbitAdapter; 4 import com.adapterPattern.dog.Dog; 5 import com.adapterPattern.dog.LittleBlackDog; 6 import com.adapterPattern.rabbit.LittleWhiteRabbit; 7 import com.adapterPattern.rabbit.Rabbit; 8 9 /** 10 * @program: test 11 * @description: 适配器模式测试类 12 * @author: Mr.Yang 13 * @create: 2018-12-15 16:26 14 **/ 15 public class Test { 16 /** 17 * 负责执行鸭子的跳与叫 18 * @param rabbit 19 */ 20 public static void testRabbit(Rabbit rabbit){ 21 rabbit.jump(); 22 rabbit.coo(); 23 } 24 /** 25 * 负责执行狗的跳与叫 26 * @param dog 27 */ 28 public static void testDog(Dog dog){ 29 dog.jump(); 30 dog.bark(); 31 } 32 33 public static void main(String[] args) { 34 //创建一个兔子类 35 Rabbit rabbit = new LittleWhiteRabbit(); 36 //创建一个狗类 37 Dog dog = new LittleBlackDog(); 38 //创建一个适配器,包装狗类,为兔子类 39 Rabbit adapterRabbit = new ActAsRabbitAdapter(dog); 40 41 System.out.println("----------------------小白兔的跳与叫--------------------"); 42 testRabbit(rabbit); 43 44 System.out.println("----------------------小黑狗的跳与叫--------------------"); 45 testDog(dog); 46 47 System.out.println("----------------------适配器(相等于兔子)的跳与叫--------------------"); 48 //适配实现了兔子接口,所以可以别认为是个兔子,testRabbit()这个方法并不知道这个是适配器 49 testRabbit(adapterRabbit); 50 } 51 }
测试结果
1 ----------------------兔子的跳与叫-------------------- 2 小白兔,跳2米 3 小白兔,在咕咕叫 4 ----------------------狗的跳与叫-------------------- 5 小黑狗,跳一米 6 小黑狗,汪汪的叫 7 ----------------------适配器(相等于兔子)的跳与叫-------------------- 8 小黑狗,跳一米 9 小黑狗,跳一米 10 小黑狗,汪汪的叫
以上是关于适配器模式的主要内容,如果未能解决你的问题,请参考以下文章