码迷,mamicode.com
首页 > 其他好文 > 详细

适配器模式

时间:2014-05-01 11:07:59      阅读:413      评论:0      收藏:0      [点我收藏+]

标签:style   blog   class   code   java   tar   javascript   width   color   get   art   

概述

  将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以在一起工作。

解决

  即Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以在一起工作。

角色

  目标接口(Target):客户所期待的接口。目标可以是具体的或抽象的类,也可以是接口。

  需要适配的类(Adaptee):需要适配的类或适配者类。

  适配器(Adapter):通过包装一个需要适配的对象,把原接口转换成目标接口。

解读

  UML

mamicode.com,码迷

  C#代码:

mamicode.com,码迷
mamicode.com,码迷
 1   /// <summary>
 2     /// 客户期望的接口
 3     /// </summary>
 4     interface Target
 5     {
 6         void Request ();
 7     }
 8 
 9     /// <summary>
10     /// 目标接口
11     /// </summary>
12     interface Adaptee
13     {
14         void SpecifRequest ();
15     }
16 
17     /// <summary>
18     /// 适配器
19     /// </summary>
20     public class Adapter : Target
21     {
22         private Adaptee _adaptee;
23 
24         public void Request()
25         {
26             _adaptee.SpecifRequest ();
27         }       
28 
29         /// <summary>
30         /// 通过重写接口调用目标接口事件
31         /// </summary>
32         /// <param name="adaptee"></param>
33         public Adapter(Adaptee adaptee)
34         {
35             _adaptee = adaptee;
36         }
37     }
View Code
mamicode.com,码迷

 

实例:电源适配器转换<两圆口至三扁头转换>

  UML

mamicode.com,码迷

 

 

    C#代码

mamicode.com,码迷
mamicode.com,码迷
 1    /// <summary>
 2     /// 德标插口
 3     /// </summary>
 4     public interface IDBSocket
 5     {
 6         void PowerByTowRound ();
 7     }
 8 
 9     /// <summary>
10     /// 国标插口 
11     /// </summary>
12     public interface IGBSocket
13     {
14         void PowerByThreeFlat ();
15     }
16 
17     public class DBScoket:IDBSocket
18     {
19         public void PowerByTowRound ()
20         {
21             Console.WriteLine ("Power By Tow Round");
22         }
23     }
24 
25     public class GbScoket:IGBSocket
26     {
27         public void PowerByThreeFlat()
28         {
29             Console.WriteLine ("Power By Three Flat");
30         }
31     }
32 
33     /// <summary>
34     /// 适配器
35     /// </summary>
36     public class SocketAdapter:IDBSocket
37     {
38         private IGBSocket _gb;
39 
40         public SocketAdapter (IGBSocket gbscoket)
41         {
42             _gb = gbscoket;
43         }
44 
45         public void PowerByTowRound()
46         {
47             _gb.PowerByThreeFlat ();
48         }
49     }
50 
51 
52     public class Host
53     {
54         private IDBSocket _socket;
55 
56         public Host(IDBSocket db)
57         {
58             _socket=db;
59         }
60 
61         public void Power()
62         {
63             _socket.PowerByTowRound();
64         }
65     }
View Code
mamicode.com,码迷


总结

  优点:

    通过适配器,客户端可以调用同一接口,因而对客户端来说是透明的。这样做更简单、更直接、更紧凑

    复用了现存的类,解决了现存类和复用环境要求不一致的问题。

    将目标类和适配者类解耦,通过引入一个适配器类重用现有的适配者类,而无需修改原有代码。

    一个对象适配器可以把多个不同的适配者类适配到同一个目标,也就是说,同一个适配器可以把适配者类和它的子类都适配到目标接口

  缺点:

    对于对象适配器来说,更换适配器的实现过程比较复杂。

  适用场景

    系统需要使用现有的类,而这些类的接口不符合系统的接口。

    想要建立一个可以重用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作

    两个类所做的事情相同或相似,但是具有不同接口的时候

    旧的系统开发的类已经实现了一些功能,但是客户端却只能以另外接口的形式访问,但我们不希望手动更改原有类的时候

    使用第三方组件,组件接口定义和自己定义的不同,不希望修改自己的接口,但是要使用第三方组件接口的功能

随笔

    关键在于实现客户的预期接口,并在接口调用目标方法

适配器模式,码迷,mamicode.com

适配器模式

标签:style   blog   class   code   java   tar   javascript   width   color   get   art   

原文地址:http://www.cnblogs.com/hjqc/p/3701680.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!