适配器模式

前言

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

一、球员抽象类

  

 1     //球员类 
 2     public abstract class Player
 3     {
 4         protected string name;
 5         public Player(string name)
 6         {
 7             this.name = name;
 8         }
 9         public abstract void Attack();
10         public abstract void Defense();
11     }

二、前锋、中锋、后卫类

  

 1   //前锋
 2     public class Forwwards : Player
 3     {
 4         public Forwwards(string name) : base(name)
 5         {
 6         }
 7 
 8         public override void Attack()
 9         {
10             Console.WriteLine("前锋{0}进攻",name);
11         }
12 
13         public override void Defense()
14         {
15             Console.WriteLine("前锋{0}防守", name);
16         }
17     }
18     //中锋
19     public class Center : Player
20     {
21         public Center(string name) : base(name)
22         {
23         }
24 
25         public override void Attack()
26         {
27             Console.WriteLine("中锋{0}进攻", name);
28         }
29 
30         public override void Defense()
31         {
32             Console.WriteLine("中锋{0}防守", name);
33         }
34     }
35     //后卫
36     public class Guards : Player
37     {
38         public Guards(string name) : base(name)
39         {
40         }
41 
42         public override void Attack()
43         {
44             Console.WriteLine("后卫{0}进攻", name);
45         }
46 
47         public override void Defense()
48         {
49             Console.WriteLine("后卫{0}防守", name);
50         }
51     }

三、外籍中锋

 1  //外籍中锋
 2     public class ForeignCenter
 3     {
 4         /// <summary>
 5         /// 外籍中锋类球员的姓名用属性而不是构造方法来区别与前面的球员类的不同
 6         /// </summary>
 7         public string Name { get; set; }
 8         //表示”外籍中锋“只懂中文”进攻“
 9         public void 进攻()
10         {
11             Console.WriteLine("中锋{0}进攻", Name);
12         }
13         //表示”外籍中锋“只懂中文”防守“
14         public void 防守()
15         {
16             Console.WriteLine("中锋{0}防守", Name);
17         }
18     }

四、翻译者类

  

 1     public class Tarnslator : Player
 2     {
 3         private ForeignCenter w = new ForeignCenter();
 4         public Tarnslator(string name) : base(name)
 5         {
 6             w.Name = name;
 7         }
 8         //翻译者将“Attack”翻译为“进攻”告诉外籍中锋
 9         public override void Attack()
10         {
11             w.进攻();
12         }
13         //翻译者将“Defense”翻译为“防守”告诉外籍中锋
14         public override void Defense()
15         {
16             w.防守();
17         }
18     }

五、客户端类

  

 1     class Program
 2     {
 3         static void Main(string[] args)
 4         {
 5             Player b = new Forwwards("内马尔");
 6             b.Attack();
 7             Player m = new Guards("麦克格");
 8             m.Attack();
 9 
10             //姚明,不懂中文Attach和Defense是什么意思
11             //Player ym = new Center("姚明");
12             //ym.Attack();
13             //ym.Defense();
14             Player ym = new Tarnslator("姚明");
15             ym.Attack();
16             ym.Defense();
17             Console.ReadKey();
18         }
19     }

总结

  1、在想使用一个已经存在的类,但如果它的接口,也就是它的方法和你的要求不同时,就应该考虑用适配器模式。两个类所做的事情相同或相似,但时具体不同的接口时要使用它。

  2、客户端代码可以统一调用同一接口,这样更简单、更直接、更紧凑。

  参考书籍:大话设计模式

原文地址:https://www.cnblogs.com/hyunbar/p/9929320.html