设计模式(十三)适配器模式

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

在软件的开发中,系统的数据和行为都正确,但接口不符时,我们应该考虑用适配器,目的是使控制范围之外的一个原有对象与某个接口匹配。适配器模式主要应用于希望复用一些现存的类,但是接口又与复用环境要求不一致的情况。

在.NET 中有一个类库 DataAdapter 用作 DataSet(XML数据)和数据源之间的适配器以便检索和保存数据。DataAdapter 通过映射 Fill (这更改了 DataSet 中的数据以便与数据源中的数据相匹配)和 Update(这更改了数据源中的数据以便与 DataSet 中的数据相匹配)来提供这一适配器。

基本代码

 1 // 客户所期待的接口
 2 class Target
 3 {
 4   public virtual void Request()
 5   {
 6     Console.WriteLine( " 普通请求!");
 7   }
 8 }
 9 
10 // 需要适配的类
11 class Adaptee
12 {
13   public void SpecificRequest()
14   {
15     Console.WriteLine( " 特殊请求!");    
16   }
17 }
18 
19 // 通过在内部包装一个 Adaptee 对象,把源接口转换成目标接口
20 class Adapter : Target
21 {
22   private Adaptee adaptee = new Adaptee();
23 
24   public override void Request()
25   {
26     adaptee.SpecificRequest();
27   }
28 }
29 
30 // 客户端
31 static void Main(string[] args)
32 {
33   Target target = new Adapter();
34   target.Request();
35 
36   Console.Read();
37 }

 【例】翻译者

基本代码

 1 // 球员
 2 abstract class Player
 3 {
 4   protected string name;
 5   public Player(string name)
 6   {
 7     this.name = name;
 8   }
 9 
10   public abstract void Attack();  // 进攻
11   public abstract void Defense();  // 防守
12 }
13 
14 // 前锋
15 class Forwards : Plater
16 {
17   // 构造方法
18   public Forwards(string name) : base(name)
19   {
20   }
21   // 进攻
22   public abstract void Attack()
23   {
24     Console.WriteLine("前锋 {0} 进攻", name);
25   }
26   public abstract void Defense()
27   {
28     Console.WriteLine("前锋 {0} 防守", name);
29   }
30 }
31 
32 // 外籍中锋
33 class ForeignCenter
34 {
35   // 属性
36   private string name;
37   public string Name
38   {
39     get { return name; }
40     set { name = value; }
41   }
42   // 进攻
43   public abstract void Attack()
44   {
45     Console.WriteLine("外籍中锋 {0} 进攻", name);
46   }
47   public abstract void Defense()
48   {
49     Console.WriteLine("外籍中锋 {0} 防守", name);
50   }
51 }
52 
53 // 翻译者
54 class Translator : Player
55 {
56   private ForeignCenter wjzf = new ForeignCenter();
57 
58   public Translator(string name) : base(name)
59   {
60     wjzf.Name = name;
61   }
62 
63   public override void Attack()
64   {
65     wjzf.进攻();
66   }
67 
68   public override void Defense()
69   {
70     wjzf.防守();
71   }
72 }

 

posted @ 2015-06-19 19:36  壬子木  阅读(119)  评论(0)    收藏  举报