上一题下一题
跳转到
 
 
  世界如此多姿,发展如此迅速,窥一斑未必还能知全豹。但正如万花筒一样,每一个管窥都色彩斑斓。  
 
 
  知识通道 | 学习首页 | 教师首页 | PK首页 | 知识创造首页 | 企业首页 | 登录
 
本文对应知识领域
设计模式之Adapter(适配器)
作者:未知 申领版权
2011年08月22日 共有 1375 次访问 【添加到收藏夹】 【我要附加题目
受欢迎度:

    适配器模式定义:
    将两个不兼容的类纠合在一起使用,属于结构型模式,需要有Adaptee(被适配者)和Adaptor(适配器)两个身份.
    为何使用?
    我们经常碰到要将两个没有关系的类组合在一起使用,第一解决方案是:修改各自类的接口,但是如果我们没有源代码,或者,我们不愿意为了一个应用而修改各自的接口。 怎么办?
    使用Adapter,在这两种接口之间创建一个混合接口(混血儿).
    如何使用?
    实现Adapter方式,其实"think in Java"的"类再生"一节中已经提到,有两种方式:组合(composition)和继承(inheritance).
    
    假设我们要打桩,有两种类:方形桩 圆形桩.
    public class SquarePeg{
    public void insert(String str){
    System.out.println("SquarePeg insert():" str);
    }
    }
    public class RoundPeg{
    public void insertIntohole(String msg){
    System.out.println("RoundPeg insertIntoHole():" msg);
    }
    }
    现在有一个应用,需要既打方形桩,又打圆形桩.那么我们需要将这两个没有关系的类综合应用.假设RoundPeg我们没有源代码,或源代码我们不想修改,那么我们使用Adapter来实现这个应用:
    public class PegAdapter extends SquarePeg{
    
    private RoundPeg roundPeg;
    public PegAdapter(RoundPeg peg)(this.roundPeg=peg;)
    public void insert(String str){super.insert(str); roundPeg.insertIntoHole(str);}
    }
    在上面代码中,RoundPeg属于Adaptee,是被适配者.PegAdapter是Adapter,将Adaptee(被适配者RoundPeg)和Target(目标SquarePeg)进行适配.实际上这是将组合方法(composition)和继承(inheritance)方法综合运用.
    PegAdapter首先继承SquarePeg,然后使用new的组合生成对象方式,生成RoundPeg的对象roundPeg,再重载父类insert()方法。从这里,你也了解使用new生成对象和使用extends继承生成对象的不同,前者无需对原来的类修改,甚至无需要知道其内部结构和源代码.
    如果你有些Java使用的经验,已经发现,这种模式经常使用。
    进一步使用
    上面的PegAdapter是继承了SquarePeg,如果我们需要两边继承,即继承SquarePeg 又继承RoundPeg,因为Java中不允许多继承,但是我们可以实现(implements)两个接口(interface)
    public interface IRoundPeg{
    public void insertIntoHole(String msg);
    
    }
    public interface ISquarePeg{
    public void insert(String str);
    }
    下面是新的RoundPeg 和SquarePeg, 除了实现接口这一区别,和上面的没什么区别。
    public class SquarePeg implements ISquarePeg{
    public void insert(String str){
    System.out.println("SquarePeg insert():" str);
    }
    }
    public class RoundPeg implements IRoundPeg{
    public void insertIntohole(String msg){
    System.out.println("RoundPeg insertIntoHole():" msg);
    }
    }
    下面是新的PegAdapter,叫做two-way adapter:
    public class PegAdapter implements IRoundPeg,ISquarePeg{
    
    private RoundPeg roundPeg;
    private SquarePeg squarePeg;
    
    // 构造方法
    public PegAdapter(RoundPeg peg){this.roundPeg=peg;}
    // 构造方法
    public PegAdapter(SquarePeg peg)(this.squarePeg=peg;)
    public void insert(String str){ roundPeg.insertIntoHole(str);}
    }
    还有一种叫Pluggable Adapters,可以动态的获取几个adapters中一个。使用Reflection技术,可以动态的发现类中的Public方法。

    

 

相关新闻

每一个程序员要遵守的一些优秀编程风格
《VB程序设计基础》选择题
设计模式之Iterator
设计模式之Visitor
设计模式之Interpreter(解释器)
设计模式之Mediator(中介者)
设计模式之Strategy(策略)
设计模式之State
设计模式之Command
设计模式之Chain of Responsibility(职责链)

您可能对这些感兴趣  

《VB程序设计基础》选择题
设计模式之Iterator
设计模式之Visitor
设计模式之Interpreter(解释器)
设计模式之Mediator(中介者)
设计模式之Strategy(策略)
设计模式之State
设计模式之Command
设计模式之Chain of Responsibility(职责链)
设计模式之Observer

题目筛选器
日期:
类型:
状态:
得分: <=
分类:
作者:
职业:
关键字:
搜索

 
 
 
  焦点事件
 
  知识体系
 
  职业列表
 
 
  最热文章
 
 
  最多引用文章
 
 
  最新文章
 
 
 
 
网站介绍 | 广告服务 | 招聘信息 | 保护隐私权 | 免责条款 | 法律顾问 | 意见反馈
版权所有 不得转载
沪ICP备 10203777 号 联系电话:021-54428255
  帮助提示    
《我的太学》是一种全新的应用,您在操作中遇到疑问或者问题,请拨打电话13564659895,15921448526。
《我的太学》