设计模式--适配器模式--简记

适配器模式(Adapter Pattern):

  将一个类的接口转换成客户希望的另外一个接口。

  使得原本由于接口不兼容而不能一起工作的那些类可以在一起工作。

 

何时使用:

  1.系统需要使用现有的类,而此类的接口不符合系统的需要。

  2.想要建立一个可以重复使用的类,用于与一些彼此之间没有太大关联的一些类。

  3.通过接口转换,讲一个类插入另一个类系中。

 

优点:

  1.可以让任何两个没有关联的类一起运行

  2.提高类的复用性

  3.灵活性好

缺点:

  1.过多的使用适配器会让系统变的非常的凌乱,不易整体进行把握

  2.由于Java至多继承一个类,所以至多只能适配一个适配者类,而且目标类必须是抽象类

注:适配器不是在详细设计中添加的,而是解决正在服役的项目

 1 //一个接口
 2 public interface MediaPlayer {
 3     public void play(String audioType, String fileName);
 4 }
 5 
 6 //另一个接口
 7 public interface AdvancedMediaPlayer {
 8     public void playVlc(String fileName);
 9     public void playMp4(String fileName);
10 }
11 
12 //实现接口的类
13 public class VlcPlayer implements AdvancedMediaPlayer {
14     @override
15     public void playVlc(String fileName) {
16         System.out.println("Playing vlc file : " + fileName);
17     }
18     
19     @override
20     public void playMp4(String fileName) {
21         //do nothing
22     }
23 }
24 
25 public class Mp4Player implements AdvancedMediaPlayer {
26     @override
27     public void playVlc(String fileName) {
28         //do nothing
29     }
30     
31     @override
32     public void playMp4(String fileName) {
33         System.out.println("Playing mp4 file : " + fileName);
34     }
35 }
36 
37 //创建实现MediaPlay接口的适配器
38 public class MediaAdapter implements MediaPlayer {
39     
40     AdanceMediaPlayer advanceMusicPlayer;
41     
42     public MediaAdapter(String audioType) {
43         if(audioType.equalsIgnoreCase("vlc")) {
44             advanceMusicPlayer = new VlcPlayer();
45         } else if(audioType.equalsIgnoreCase("mp4")) {
46             advanceMusicPlayer = new Mp4Player();
47         }
48     }
49     
50     @Override
51     public void play(String audioType, String fileName) {
52         if(audioType.equalsIgnoreCase("vlc")) {
53             advanceMusicPlayer.playVlc(fileName);
54         }else if(audioType.equalsIgnoreCase("mp4")) {
55             advanceMusicPlayer.playMp4(fileName);
56         }
57     }
58 }
59 
60 //创建实现了MediaPlayer接口的实现类
61 public class AudioPlay implements MeidaPlayer {
62     
63     MediaAdapter mediaAdapter;
64     
65     @override
66     public void play(String audioType, String fileName) {
67         if(audioType.equalsIgnoreCase("mp3")) {
68             System.out.println("Playing mp3 file : " + fileName);
69         }
70         else if(audioType.equalsIgnoreCase("vlc") || audioType.equalsIgnoreCase("mp4")) {
71             mediaAdapter = new MeidaAdapter(audioType);
72             mediaAdapter.play(audioType, fileName);
73         }
74         else {
75             System.out.println("Invalid media.");
76         }
77     }
78 }
79 
80 
81 //Test
82 public class AdapterPatternDemo {
83     
84     public static void main(String[] args) {
85         AudioPlayer audioPlayer = new AudioPlayer();
86         
87         audioPlayer.play("mp3","beyond the horizon.mp3");
88         audioPlayer.play("mp4","alone.mp4");
89         audioPlayer.play("vlc","far far.vlc");
90         audioPlayer.play("avi","mind me.avi");
91     }
92 }
View Code

 

详情:http://www.runoob.com/design-pattern/adapter-pattern.html

 

posted on 2018-03-07 15:44  我要的明天  阅读(144)  评论(0编辑  收藏  举报

导航