【设计模式】- 适配器模式
1.适配器模式:将一个类的接口转换为客户希望的另外一个接口。Adapter 模式是原来由于接口不兼容而不能一起工作的那些类可以一起工作。
2.形象的例子:姚明刚去NBA需要一个翻译,这个翻译就充当一个适配器的角色。在.NET体系中,经常使用的DataAdapter就是这个模式。
3.适配器模式一般情况下,是在软件后期维护时、或与三方客户对接时候;要求客户修改类、调整己方系统已存在的接口或类比较费劲时,可以考虑使用适配器设计模式,添加一个新的类去适应客户需求。
4.适配模式结构图
5.球员UML图
6. 具体代码实现
namespace AdapterPattern { /// <summary> /// 球员 /// </summary> public abstract class Player { protected string _name; protected Player(string name) { this._name = name; } public abstract void Attack(); public abstract void Defense(); } /// <summary> /// 前锋 /// </summary> public class Striker : Player { public Striker(string name) : base(name) { } public override void Attack() { Console.WriteLine("前锋{0}进攻",_name); } public override void Defense() { Console.WriteLine("前锋{0}防守", _name); } } /// <summary> /// 中锋 /// </summary> public class Center : Player { public Center(string name) : base(name) { } public override void Attack() { Console.WriteLine("中锋{0}进攻", _name); } public override void Defense() { Console.WriteLine("中锋{0}防守", _name); } } /// <summary> /// 后卫 /// </summary> public class Defender : Player { public Defender(string name) : base(name) { } public override void Attack() { Console.WriteLine("后卫{0}进攻", _name); } public override void Defense() { Console.WriteLine("后卫{0}防守", _name); } } }
namespace AdapterPattern { /// <summary> /// 外籍中锋 /// </summary> public class ForeignCenter { private string name; public string Name { get => name; set => name = value; } public void 进攻() { Console.WriteLine("外籍中锋{0}进攻",Name); } public void 防守() { Console.WriteLine("外籍中锋{0}防守", Name); } } /// <summary> /// 外籍中锋翻译(适配器) /// </summary> public class Adapter : Player { ForeignCenter foreignCenter; public Adapter(string name) : base(name) { foreignCenter = new ForeignCenter(); foreignCenter.Name = name; } public override void Attack() { foreignCenter.进攻(); } public override void Defense() { foreignCenter.防守(); } } }
class Program { static void Main(string[] args) { Player s = new Striker("麦迪"); Player c = new Center("姚明"); Player d = new Defender("弗朗西斯"); s.Attack(); c.Attack(); d.Attack(); Console.WriteLine("-----------------------------------------------------"); Player s1 = new Striker("麦迪"); Player c1 = new Adapter("姚明"); Player d1 = new Defender("弗朗西斯"); s1.Attack(); c1.Attack(); d1.Attack(); Console.ReadKey(); } }