java设计模式-适配器模式

模式导读:

   每个人都有自己不同的需要,每个人都有自己能够接受的不同方式,就像是为满足现在快速度发展的社会,几乎人人离不开手机的时代,我们也许会碰到在外出行手机电量不足的情况,这个时候如果你在车站,你就会发现一个专门用来手机充电的地方,而手机种类复杂多样,充电的接口也是各有千秋,所以为了适应这种情况,就有了各种各样的接头的出现,而这便是适配器模式的一种使用现实使用场景。

   将一个类的接口转换成客户希望的另外一个接口,适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。

参考类图:

类适配器实现代码:

1.定义一个抽象USB接口

1 package com.etc;
2 //定义抽象的USB接口
3 public interface USB {
4      void use();
5 }

2.具体的USB接口

1 package com.etc;
2 //电脑的USB接口
3 public class ComputerUSB implements USB {
4     @Override
5     public void use() {
6       System.out.println("-->电脑成功通过该USB接口进行充电!");
7     }
8 }
1 package com.etc;
2 
3 public class PhoneUSB implements USB {
4 
5     @Override
6     public void use() {
7         System.out.println("-->手机成功通过该USB接口来充电!");
8     }
9 }

3.定义抽象的外部接口(即需要进行转换的抽象接口)

1 package com.etc;
2 //其他的USB接口
3 public interface AnotherUSB {
4       void charge();
5 }

4.具体的适配器类

 1 package com.etc;
 2 
 3 public class ComputerAdapter extends ComputerUSB implements AnotherUSB {
 4 
 5     @Override
 6     public void charge() {
 7         System.out.println("已成功使用适配器!");
 8         use();
 9     }
10 }
 1 package com.etc;
 2 
 3 public class PhoneAdapter extends PhoneUSB implements AnotherUSB{
 4 
 5     @Override
 6     public void charge() {
 7         System.out.println("已成功使用适配器!");
 8         use();    
 9     }
10 }

5.客户端类

 1 package com.etc;
 2 //类适配器
 3 public class Client2 {
 4     public static void main(String[] args) {
 5 
 6         AnotherUSB usb=new ComputerAdapter();
 7         usb.charge();
 8         
 9         AnotherUSB usb2=new PhoneAdapter();
10         usb2.charge();
11     }
12 }

效果截图:

 

对象适配器代码实现:

 1.具体适配器类

 1 package com.etc;
 2 //电脑充电适配器
 3 public class ComputerUSBAdapter extends ComputerUSB implements AnotherUSB{
 4    
 5     private ComputerUSB cusb;
 6     
 7     public ComputerUSBAdapter(ComputerUSB cusb) {
 8         super();
 9         this.cusb = cusb;
10     }
11     //利用该适配器进行接口转换实现充电
12     @Override
13     public void charge() {
14         System.out.println("电脑USB接口已使用该适配器:");
15         cusb.use();
16     }
17 }
 1 package com.etc;
 2 //手机充电适配器
 3 public class PhoneUSBAdapter extends PhoneUSB implements AnotherUSB{
 4 
 5     private PhoneUSB pusb;
 6     
 7     public PhoneUSBAdapter(PhoneUSB pusb) {
 8         super();
 9         this.pusb = pusb;
10     }
11     //利用该适配器进行接口转换实现充电
12     @Override
13     public void charge() {
14         System.out.println("手机USB接口已使用该适配器:");
15         pusb.use();
16     }
17 }

2.客户端类

 1 package com.etc;
 2 
 3 public class Client {
 4 
 5     public static void main(String[] args) {
 6         //获取电脑的USB接口
 7         ComputerUSB cusb=new ComputerUSB();
 8         //将外部USB接口转化为电脑USB的适配器获取
 9         AnotherUSB cAdapter=new ComputerUSBAdapter(cusb);
10         cAdapter.charge();
11         
12         //获取手机的USB接口
13         PhoneUSB pusb=new PhoneUSB();
14         //将外部USB接口转化为手机USB的适配器获取
15         AnotherUSB pAdapter=new PhoneUSBAdapter(pusb);
16         pAdapter.charge();
17     }
18 }

效果截图:

 

适配器模式的优缺点:

 优点:

1、可以让任何两个没有关联的类一起运行。
2、提高了类的复用。
3、增加了类的透明度。
4、灵活性好。

 缺点:
1.过多地使用适配器,会让系统非常零乱,不易整体进行把握。
2.由于JAVA至多继承一个类,所以至多只能适配一个适配者类,而且目标类必须是抽象类。

适用场景:

1.想要使用一个已经存在的类,但是它却不符合现有的接口规范,导致无法直接去访问,这时创建一个适配器就能间接去访问这个类中的方法。
2.我们有一个类,想将其设计为可重用的类(可被多处访问),我们可以创建适配器来将这个类来适配其他没有提供合适接口的类。

原文地址:https://www.cnblogs.com/weekstart/p/10848031.html