Chinaunix首页 | 论坛 | 博客
  • 博客访问: 6275593
  • 博文数量: 2759
  • 博客积分: 1021
  • 博客等级: 中士
  • 技术积分: 4091
  • 用 户 组: 普通用户
  • 注册时间: 2012-03-11 14:14
文章分类

全部博文(2759)

文章存档

2019年(1)

2017年(84)

2016年(196)

2015年(204)

2014年(636)

2013年(1176)

2012年(463)

分类: Java

2014-03-12 08:47:05

适配器模式属于结构型设计模式,也是一种实际开发中使用非常广泛的设计模式。
首先看下GOF对适配器模式的定义:将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以在一起工作。
说到适配器大家可能会想到电脑电源适配器,为什么要用电源适配器呢?原因很简单我们的电脑不能直接插到插座上,因为插座的电源是220v的,但我们的电脑只需要20v左右的电压。适配器的作用其实就是在两者之间起到了一个转化的作用。
适配器模式应用场景描述:当要实现某个特定的功能需要依赖现有的实现,我们不想改动现有程序,但现有的程序又不能完全满足需求时,我们就可以考虑适配器模式。
适配器参与角色:
(1)目标角色(Target):系统所期待实现的目标。
(2)源角色(Adaptee):系统原有的实现,被适配的角色。
(3)适配器角色(Adapter):将原有实现转化成目标实现。
适配器模式包含两种适配方式:类适配器和对象适配器。
类适配器结构图:

类适配器的代码实现:
1、第一个文件目标角色(Target.java)

点击(此处)折叠或打开

  1. public interface Target {

  2.     /**
  3.      * 源角色也包含的方法
  4.      */
  5.     public void operation1();
  6.     
  7.     /**
  8.      * 原角色不包含的方法
  9.      */
  10.     public void operation2();
  11. }
2、第二个文件源角色:Adaptee.java

点击(此处)折叠或打开

  1. /**
  2.  * 原角色实现类
  3.  */
  4. public class Adaptee {

  5.     public void operation1(){
  6.         System.out.println("operation-1");
  7.     }
  8. }
3、第三个文件适配器角色:Adapter.java

点击(此处)折叠或打开

  1. /**
  2.  * 适配器角色
  3.  */
  4. public class Adapter extends Adaptee implements Target{

  5.     @Override
  6.     public void operation2() {
  7.         System.out.println("operation-2");
  8.     }
  9. }
如上代码为类适配器的实现方式,由于java是单继承语言,某个类适配器只能服务于一个被适配角色,不利于程序的扩展,并且由于是基于继承的方式,源角色的所有和属性和操作都对适配器暴露,也不利于程序的安全和可控。所以类适配器的方式其实在实际开发中比较少用。
下面我们再说下对象适配器的基础实现,如下为其结构图:

 对象适配器的代码实现:
4、第一个文件目标角色:Target.java

点击(此处)折叠或打开

  1. /**
  2.  * 抽象目标接口
  3.  */
  4. public interface Target {

  5.     /**
  6.      * 购买游戏道具
  7.      */
  8.     public void buyGameProps();
  9. }
5、第二个文件源角色 :Rmb.java

点击(此处)折叠或打开

  1. /**
  2.  * 被适配对象
  3.  */
  4. public class Rmb {

  5.     /**
  6.      * 金额属性
  7.      */
  8.     public int money;
  9.     
  10.     /**
  11.      * 构造方法
  12.      * @param money
  13.      */
  14.     public Rmb(int money){
  15.         this.money = money;
  16.     }

  17.     public int getMoney() {
  18.         return money;
  19.     }

  20.     public void setMoney(int money) {
  21.         this.money = money;
  22.     }
  23.     
  24. }
6、第三个文件适配器角色:QQCoin.java

点击(此处)折叠或打开

  1. /**
  2.  * QQ币实现类(适配器角色)
  3.  */
  4. public class QQCoin implements Target{

  5.     /**
  6.      * 人民币实体对象
  7.      */
  8.     public Rmb rmbImpl;
  9.     
  10.     /**
  11.      * QQ币数量
  12.      */
  13.     public int count;
  14.     
  15.     /**
  16.      * 构造方法
  17.      * @param rmb
  18.      */
  19.     public QQCoin(Rmb rmb){
  20.         this.count = rmb.getMoney() * 10;
  21.     }
  22.     
  23.     /**
  24.      * 具体实现方法
  25.      */
  26.     @Override
  27.     public void buyGameProps() {
  28.         System.out.println("您购买了 " + count + " 个道具!");
  29.     }

  30. }
7、第四个文件:TestMain.java 

点击(此处)折叠或打开

  1. /**
  2.  * 测试Main方法
  3.  */
  4. public class TestMain {

  5.     public static void main(String [] args){
  6.         Rmb rmb = new Rmb(5);
  7.         QQCoin coin = new QQCoin(rmb);
  8.         coin.buyGameProps();
  9.     }
  10. }
如上为我们要用人民币买游戏道具,但不能用人民币直接买,必须得借助QQ币才可以买。适配器QQCoin.java中会包含一个被适配的对象,当我们要用这个适配器再适配其他类时,只要在适配器角色中再增加其对象就可以了。
设计模式是一种代码实现的思想,很多时候我们在写代码时要灵活的去运用设计模式切不可生搬硬套设计模式,更不应该硬套某个设计模式的标准代码结构。比如适配器模式,理论上来说凡是对原有代码的封装我们都可以理解成是一种适配的思想。
下面总结下对象适配器的优点:
(1)适配器模式可以理解成是在原有基础上的封装,不需要对原有程序进行改动,即可实现特定功能。
(2)对象适配器可以服务于多个源角色,便于程序的扩展。
阅读(569) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~