冯超

好好工作,天天向上

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

4        Adapter模式

4.1      概述

Adapter模式又叫适配器模式,顾名思义,这个模式就是把一个不能用的东西“适配”成可以用的东西。

4.2      设计

那么是如何“适配”的呢?比如,东西A想使用东西B,但是A没有能力(没法)使用B,怎么办?A就让东西C帮忙,A通过C就可以用B了。C如何帮忙呢?C一边可以通过一个“手柄”让A握住,A一用力,C就在另一边握住B的“手柄”,使用B。这样A就可以间接的使用到B了。说的这么多,搞的糊里糊涂的,其实AB就好像是两节水管,C就好像是连接水管的接头。

4.3      实现

UML图:

示例代码为:

  1using System;
  2
  3namespace Example
  4{
  5    /// <summary>
  6    /// 示例
  7    /// </summary>

  8    class Example
  9    {
 10        /// <summary>
 11        /// 应用程序的主入口点。
 12        /// </summary>

 13        [STAThread]
 14        static void Main(string[] args)
 15        {
 16            Hosepipe pipe = new BigHosepipe() ;
 17            pipe.Influx() ;
 18            pipe.Effuse() ;
 19        }

 20        /// <summary>
 21        /// 水
 22        /// </summary>

 23        public class Water
 24        {
 25            public Water() {}
 26        }

 27        /// <summary>
 28        /// 大水管
 29        /// </summary>
 30        /// <remarks>
 31        /// 程序员A编写
 32        /// 测试员C测试
 33        /// </remarks>

 34        public class BigPipe
 35        {
 36            public Water In() 
 37            {
 38                Console.WriteLine( "流入水" ) ;
 39                return new Water() ;
 40            }
 
 41            public void Out() 
 42            {
 43                Console.WriteLine( "水流出" ) ;
 44            }

 45        }

 46        /// <summary>
 47        /// 水管接口
 48        /// </summary>

 49        interface Hosepipe
 50        {
 51            /// <summary>
 52            /// 进水
 53            /// </summary>
 54            /// <returns></returns>

 55            Water Influx() ;
 56            /// <summary>
 57            /// 出水
 58            /// </summary>

 59            void Effuse() ;
 60        }

 61        /// <summary>
 62        /// 小水管
 63        /// </summary>

 64        public class SmallHosepipe : Hosepipe
 65        {
 66            #region Hosepipe 成员
 67
 68            public Water Influx()
 69            {
 70                // TODO:  添加 SmallHosepipe.Influx 实现
 71                return null;
 72            }

 73
 74            public void Effuse()
 75            {
 76                // TODO:  添加 SmallHosepipe.Effuse 实现
 77            }

 78
 79            #endregion

 80        }

 81        /// <summary>
 82        /// 中水管
 83        /// </summary>

 84        public class MiddleHosepipe : Hosepipe
 85        {
 86            #region Hosepipe 成员
 87
 88            public Water Influx()
 89            {
 90                // TODO:  添加 MiddleHosepipe.Influx 实现
 91                return null;
 92            }

 93
 94            public void Effuse()
 95            {
 96                // TODO:  添加 MiddleHosepipe.Effuse 实现
 97            }

 98
 99            #endregion

100        }

101        /// <summary>
102        /// 大水管
103        /// </summary>
104        /// <remarks>
105        /// 当准备写大水管的进出水方法时,发现程序A已经写过同样功能的代码
106        /// 但是A命名时并没有征求你的意见以及你也没有要求
107        /// 所以只要采用Adapter模式,使用A已编好的功能
108        /// </remarks>

109        public class BigHosepipe : Hosepipe
110        {
111            private BigPipe bigPipe = new BigPipe() ;
112            #region Hosepipe 成员
113            public Water Influx()
114            {
115                return bigPipe.In() ;
116            }

117            public void Effuse()
118            {
119                bigPipe.Out() ;
120            }

121            #endregion

122        }

123    }

124}

125
posted on 2005-07-30 15:36  超哥  阅读(1860)  评论(1编辑  收藏  举报