【Java设计模式05】——适配器模式
2017-04-08 21:49
363 查看
转载:http://www.linxh.blog.chinaunix.net/uid-29140694-id-4138579.html
适配器(Adapter)模式:将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以在一起工作。
适配器模式应用场景描述:当要实现某个特定的功能需要依赖现有的实现,我们不想改动现有程序,但现有的程序又不能完全满足需求时,我们就可以考虑适配器模式。
适配器模式包括:
(1)目标角色(Target):系统所期待实现的目标。
(2)源角色(Adaptee):系统原有的实现,被适配的角色。
(3)适配器角色(Adapter):将原有实现转化成目标实现。
适配器模式包含两种适配方式:类适配器和对象适配器。
在对象适配器里面,我们持有被适配对象的引用。
下面以QQ币买道具为例:
如上为我们要用人民币买游戏道具,但不能用人民币直接买,必须得借助QQ币才可以买。适配器类QQCoin中会包含一个被适配的对象rmb,当我们要用这个适配器再适配其他类时,只要在适配器角色中再增加其对象就可以了。
对象适配器的优点:
(1)适配器模式可以理解成是在原有基础上的封装,不需要对原有程序进行改动,即可实现特定功能。
(2)对象适配器可以服务于多个源角色,便于程序的扩展。
适配器(Adapter)模式:将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以在一起工作。
适配器模式应用场景描述:当要实现某个特定的功能需要依赖现有的实现,我们不想改动现有程序,但现有的程序又不能完全满足需求时,我们就可以考虑适配器模式。
适配器模式包括:
(1)目标角色(Target):系统所期待实现的目标。
(2)源角色(Adaptee):系统原有的实现,被适配的角色。
(3)适配器角色(Adapter):将原有实现转化成目标实现。
适配器模式包含两种适配方式:类适配器和对象适配器。
一、类适配器(不常用)
类适配器结构图://目标接口:Target interface Target { /** * 源角色包含的方法 */ public void operation1(); /** * 原角色不包含的方法 */ public void operation2(); } //源角色类:Adaptee class Adaptee { public void operation1(){ System.out.println("operation-1"); } } //适配器类:Adapter class Adapter extends Adaptee implements Target{ @Override public void operation2() { System.out.println("operation-2"); } }如上代码为类适配器的实现方式,由于java是单继承语言,某个类适配器只能服务于一个被适配角色,不利于程序的扩展,并且由于是基于继承的方式,源角色的所有和属性和操作都对适配器暴露,也不利于程序的安全和可控。所以类适配器的方式其实在实际开发中比较少用。
二、对象适配器
对象适配器的基础实现,如下为其结构图:在对象适配器里面,我们持有被适配对象的引用。
下面以QQ币买道具为例:
package Adapter; /** * 适配器模式(Adapter) * 包括:被适配的角色类(Adaptee)、适配器类(Adapter)、目标类(Target) * */ //目标接口:Target interface Target { /** * 购买游戏道具 */ public void buyGameProps(); } //被适配的角色类:Adaptee --> Rmb class Rmb { //RMB数量,单位(元) private int count; public Rmb(int count) { this.count = count; } public int getCount() { return count; } public void setCount(int count) { this.count = count; } } //适配器类:QQ币类 class QQCoin implements Target { //人民币对象的引用 private Rmb rmb; //QQ币的数量,单位(个) private int count; public QQCoin(Rmb rmb) { this.count = rmb.getCount()*10; //1:10 } public int getCount() { return count; } @Override public void buyGameProps() { System.out.println("您拥有QQ币: " + this.getCount() + ", 可以购买玩具(单价2Q币): " + this.getCount()/2 + "个"); } } public class AdapterTest { public static void main(String[] args) { //5 元 Rmb rmb = new Rmb(5); Target qqCoin = new QQCoin(rmb); qqCoin.buyGameProps(); } }
如上为我们要用人民币买游戏道具,但不能用人民币直接买,必须得借助QQ币才可以买。适配器类QQCoin中会包含一个被适配的对象rmb,当我们要用这个适配器再适配其他类时,只要在适配器角色中再增加其对象就可以了。
对象适配器的优点:
(1)适配器模式可以理解成是在原有基础上的封装,不需要对原有程序进行改动,即可实现特定功能。
(2)对象适配器可以服务于多个源角色,便于程序的扩展。
相关文章推荐
- Java设计模式学习05——适配器模式
- Java设计模式学习05——适配器模式
- 23种经典设计模式的java实现_2_适配器模式
- 【设计模式】Java与模式 --- 适配器模式
- Java设计模式之适配器模式
- 设计模式(六)----- 适配器模式(Adapter)----(JAVA版)
- Java设计模式构造型之适配器模式
- 23种经典设计模式的java实现_2_适配器模式
- Java设计模式之------(Adapter)适配器模式实现
- java设计模式之适配器模式
- java设计模式—适配器模式
- Java设计模式之适配器模式
- java设计模式----适配器模式
- 浅谈 java 设计模式--适配器模式(Adaptor pattern)
- 深入浅出Java设计模式之适配器模式
- Java设计模式之适配器模式
- Java设计模式——结构型模式——适配器模式
- java设计模式:适配器模式[Apater]
- java_23种设计模式之适配器模式
- JAVA设计模式——适配器模式