【计划模式】适配器模式和桥接模式

打印 上一主题 下一主题

主题 1778|帖子 1778|积分 5334

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
适配器模式

概述

适配器模式是一种结构型计划模式,它将一个类的接口转换成客户端所盼望的另一个接口。适配器使得本来由于接口不兼容而不能一起工作的那些类可以协同工作
实现方式



  • 类适配器:通过多重继承实现。
  • 对象适配器:通过组合实现。(使用的比较多)
示例代码(对象适配器)

  1. // 目标接口
  2. interface MediaPlayer {
  3.     void play(String audioType, String fileName);
  4. }
  5. // 已有类
  6. class AdvancedMediaPlayer {
  7.     public void playVlc(String fileName) {
  8.         System.out.println("Playing vlc file. Name: " + fileName);
  9.     }
  10.    
  11.     public void playMp4(String fileName) {
  12.         System.out.println("Playing mp4 file. Name: " + fileName);
  13.     }
  14. }
  15. // 适配器类
  16. class MediaAdapter implements MediaPlayer {
  17.     private AdvancedMediaPlayer advancedMusicPlayer;
  18.     public MediaAdapter() {
  19.         this.advancedMusicPlayer = new AdvancedMediaPlayer();
  20.     }
  21.     @Override
  22.     public void play(String audioType, String fileName) {
  23.         if (audioType.equalsIgnoreCase("vlc")) {
  24.             advancedMusicPlayer.playVlc(fileName);
  25.         } else if (audioType.equalsIgnoreCase("mp4")) {
  26.             advancedMusicPlayer.playMp4(fileName);
  27.         }
  28.     }
  29. }
  30. // 使用目标接口的客户端代码
  31. class AudioPlayer implements MediaPlayer {
  32.     private MediaAdapter mediaAdapter;
  33.     @Override
  34.     public void play(String audioType, String fileName) {
  35.         if (audioType.equalsIgnoreCase("mp3")) {
  36.             System.out.println("Playing mp3 file. Name: " + fileName);
  37.         } else if (audioType.equalsIgnoreCase("vlc") || audioType.equalsIgnoreCase("mp4")) {
  38.             mediaAdapter = new MediaAdapter();
  39.             mediaAdapter.play(audioType, fileName);
  40.         } else {
  41.             System.out.println("Invalid media. " + audioType + " format not supported");
  42.         }
  43.     }
  44. }
  45. public class AdapterPatternDemo {
  46.     public static void main(String[] args) {
  47.         AudioPlayer audioPlayer = new AudioPlayer();
  48.         audioPlayer.play("mp3", "beyond the horizon.mp3");
  49.         audioPlayer.play("mp4", "alone.mp4");
  50.         audioPlayer.play("vlc", "far far away.vlc");
  51.         audioPlayer.play("avi", "mind me.avi");
  52.     }
  53. }
复制代码
桥接模式

概述

桥接模式是一种结构型计划模式,它将抽象部分与它的实现部分分离,使它们都可以独立地变革。如许做的目标是为了防止在增长新的具体实现和抽象时导致类数量的急剧增长加粗样式
实现示例

  1. // 实现部分接口
  2. interface Implementor {
  3.     void operationImp();
  4. }
  5. // 具体实现A
  6. class ConcreteImplementorA implements Implementor {
  7.     @Override
  8.     public void operationImp() {
  9.         System.out.println("ConcreteImplementorA operation");
  10.     }
  11. }
  12. // 具体实现B
  13. class ConcreteImplementorB implements Implementor {
  14.     @Override
  15.     public void operationImp() {
  16.         System.out.println("ConcreteImplementorB operation");
  17.     }
  18. }
  19. // 抽象部分
  20. abstract class Abstraction {
  21.     protected Implementor implementor;
  22.     public void setImplementor(Implementor implementor) {
  23.         this.implementor = implementor;
  24.     }
  25.     public abstract void operation();
  26. }
  27. // 扩展抽象部分
  28. class RefinedAbstraction extends Abstraction {
  29.     @Override
  30.     public void operation() {
  31.         implementor.operationImp();
  32.     }
  33. }
  34. // 客户端代码
  35. public class BridgePatternDemo {
  36.     public static void main(String[] args) {
  37.         Abstraction abstraction = new RefinedAbstraction();
  38.         abstraction.setImplementor(new ConcreteImplementorA());
  39.         abstraction.operation();
  40.         abstraction.setImplementor(new ConcreteImplementorB());
  41.         abstraction.operation();
  42.     }
  43. }
复制代码
在Java中的应用



  • 适配器模式

    • Java标准库中java.util.Arrays#asList()方法就是一个适配器的例子,它将数组转换为列表。
    • 在图形用户界面(GUI)开辟中,经常使用适配器来处置惩罚变乱监听器。比方,MouseAdapter、KeyAdapter等,这些类提供了默认的方法实现,开辟者只需要覆盖感爱好的方法即可。

  • 桥接模式

    • JDBC API加粗样式 是桥接模式的一个例子。JDBC驱动步伐提供了一个抽象层,允许应用步伐通过雷同的接口访问不同范例的数据库,而不必关心具体的数据库实现细节。
    • 在AWT/Swing中,GUI组件与其外观实现了桥接模式。这允许雷同的组件在不同的平台上有不同的外观。


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

熊熊出没

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表