适配器模式(Adapter)

关键字: adapter

一、介绍

配器模式使得一个接口与其它接口兼容,从而给出多个不同接口的统一抽象。换句话说,该模式是将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。

   

   

二、实例

在本模式的实例部分,我们有一个TeaBag类,由TeaCup来支配使用,完成泡茶的这个过程。

Java代码

  • public class TeaBag {        
  •    boolean teaBagIsSteeped;       
  •           
  •    public TeaBag() {      
  •        teaBagIsSteeped = false;      
  •    }      
  •          
  •    public void steepTeaInCup() {      
  •        teaBagIsSteeped = true;      
  •        System.out.println("tea bag is steeping in cup");      
  •    }      
  • }      
  •      
  • public class TeaCup {        
  •    public void steepTeaBag(TeaBag teaBag) {      
  •        teaBag.steepTeaInCup();      
  •    }      
  • }   

 

   

在有一个LooseLeafTee要被引入,换句话说,我现在想泡一杯新买入的LooseLeafTee

Java代码

  • public class LooseLeafTea {     
  •    boolean teaIsSteeped;    
  •        
  •    public LooseLeafTea() {   
  •        teaIsSteeped = false;   
  •    }   
  •       
  •    public void steepTea() {   
  •        teaIsSteeped = true;   
  •        System.out.println("tea is steeping");   
  •    }   
  • }  

 

   

为了让我的这个TeaCup可以泡这个LooseLeafTee,我们创建一个TeaBall来牵线搭桥。

Java代码

  • public class TeaBall extends TeaBag {         
  •    LooseLeafTea looseLeafTea;       
  •           
  •    public TeaBall(LooseLeafTea looseLeafTeaIn) {       
  •        looseLeafTea = looseLeafTeaIn;       
  •        teaBagIsSteeped = looseLeafTea.teaIsSteeped;       
  •    }       
  •            
  •    public void steepTeaInCup() {       
  •        looseLeafTea.steepTea();       
  •        teaBagIsSteeped = true;       
  •    }       
  • }    

   

   

在实际使用的过程中,我们这样使用这个适配器模式带来的优越感。

Java代码

  • class TestTeaBagAdaptation {       
  •       
  •    public static void main(String[] args) {       
  •        TeaCup teaCup = new TeaCup();       
  •       
  •        System.out.println("Steeping tea bag");       
  •        TeaBag teaBag = new TeaBag();              
  •        teaCup.steepTeaBag(teaBag);       
  •       
  •        System.out.println("Steeping loose leaf tea");       
  •        LooseLeafTea looseLeafTea = new LooseLeafTea();       
  •        TeaBall teaBall = new TeaBall(looseLeafTea);       
  •        teaCup.steepTeaBag(teaBall);       
  •    }       
  • }   

   

   

三、分析

从以上的实例,我们大致可以总结出适配器模式的几个主要角色:

  • Client 客户对象,即处理业务逻辑的主体,如实例中的TeaCup
  • Target 目标对象,也是Client使用的与特定领域相关的接口,如实例中的TeaBag
  • Adaptee 被改编(适应)者,target需要协同工作的接口,如实例中的LooseLeafTea
  • Adapter 适配器(改编者),对Adaptee的接口和Target接口进行配,如实例中的TeaBall

实现一个适配器模式,我们需要首先要定义TargetAdaptee,这里的Target即是Client已经认定的操作对象,而Adaptee可以理解为一个新来者,现在我们需要对它进行改造,使它也可以为Client所使用,当然,这就是Adapter的主要任务了。

1、创建这个Adapter非常关键,要保持Target的原汁原味,那么Adapter首先要继承(extends)Target的一切。

2Adapter要做到改造Adaptee,首先要引入这个Adaptee,比如说通过Adapter的构造函数来引入一个Adaptee对象。

3、在Target的原有的方法中,我们在Adapter中进一步包装,通过Adaptee的方法来替换或渲染已有的逻辑,真正做到融为一体。

   

总之,适配器模式就是在不改变Adaptee的前提下,让它和现有的系统协调工作。举一个比较实际的例子,当你从第三方购买到了这个Adaptee,但是没有他的源代码,这时就很有必要考虑适配器模式了。

   

Gof中有两种适配器模式,一种本文提起的,也是比较通用的。还有一种是使用对象版本的方式来实现适配器(Adapter)模式的,这个以后我再补充。

   

   

示例

有一个Message实体类,某个类对它的操作有Insert()Get()方法。现在需要把这个类转到另一个接口,分别对应Add()Select()方法。

MessageModel

using System;

using System.Collections.Generic;

using System.Text;

   

namespace Pattern.Adapter

{

/**

/// Message实体类

///

public class MessageModel

{

/**

/// 构造函数

///

/// Message内容

/// Message发布时间

public MessageModel(string msg, DateTime pt)

{

this._message = msg;

this._publishTime = pt;

}

   

private string _message;

/**

/// Message内容

///

public string Message

{

get { return _message; }

set { _message = value; }

}

   

private DateTime _publishTime;

/**

/// Message发布时间

///

public DateTime PublishTime

{

get { return _publishTime; }

set { _publishTime = value; }

}

}

}

SqlMessage

using System;

using System.Collections.Generic;

using System.Text;

   

namespace Pattern.Adapter

{

/**

/// 源(Adaptee)角色

/// Sql方式操作Message

///

public class SqlMessage

{

/**

/// 获取Message

///

///

public List Get()

{

List l = new List ();

l.Add(new MessageModel("SQL方式获取Message", DateTime.Now));

   

return l;

}

   

/**

/// 插入Message

///

/// Message实体对象

///

public bool Insert(MessageModel mm)

{

// 代码略

return true;

}

}

}

IMessage

using System;

using System.Collections.Generic;

using System.Text;

   

namespace Pattern.Adapter

{

/**

/// 目标(Target)角色

/// 操作Message的接口

///

public interface IMessage

{

/**

/// 获取Message

///

///

List Select();

   

/**

/// 插入Message

///

/// Message实体对象

///

bool Add(MessageModel mm);

}

}

Message

using System;

using System.Collections.Generic;

using System.Text;

   

namespace Pattern.Adapter

{

/**

/// 适配器Adapter)角色

/// 适配器

/// 把源配到这个类

///

public class Message : SqlMessage, IMessage

{

/**

/// 获取Message

///

///

public List Select()

{

return base.Get();

}

   

/**

/// 插入Message

///

/// Message实体对象

///

public bool Add(MessageModel mm)

{

return base.Insert(mm);

}

}

}

Message2

using System;

using System.Collections.Generic;

using System.Text;

   

namespace Pattern.Adapter

{

/**

/// 适配器Adapter)角色

/// 对象适配器

/// 把源配到这个类

///

public class Message2 : IMessage

{

private SqlMessage _sqlMessage;

   

/**

/// 构造函数

///

public Message2()

{

_sqlMessage = new SqlMessage();

}

   

/**

/// 获取Message

///

///

public List Select()

{

return _sqlMessage.Get();

}

   

/**

/// 插入Message

///

/// Message实体对象

///

public bool Add(MessageModel mm)

{

return _sqlMessage.Insert(mm);

}

}

}

   

   

   

   

   

SqlMessage:

   

namespace FAN.SqlMessage

{

public class SqlMessage

{

public ArrayList Get()

{

ArrayList list = new ArrayList();

list.Add("SqlMessage");

return list;

}

   

public int Insert(ArrayList list)

{

return 1;

}

}

}

   

IMessage

   

namespace FAN.Message

{

public interface IMessage

{

ArrayList Select();

int Add(ArrayList list);

}

}

   

   

namespace FAN.Message

{

public class Message:SqlMessage.SqlMessage,IMessage

{

public ArrayList Select()

{

return base.Get();

}

   

public int Add(ArrayList list)

{

return base.Insert(list);

}

   

}

   

   

public class Message2 : IMessage

{

private SqlMessage.SqlMessage _sqlMessage;

   

public Message2()

{

this._sqlMessage = new FAN.SqlMessage.SqlMessage();

}

   

public ArrayList Select()

{

return this._sqlMessage.Get();

}

   

public int Add(ArrayList list)

{

return this._sqlMessage.Insert(list);

}

   

   

}

}

   

   

   

   

   

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值