设计模式深入学习---Adapter 适配器模式(结构型模式)

   首先我们了解下什么是Adapter 适配器模式。在多人开发程序中,经常会碰到这样的问题,A编写了一套数据,B也编写了一套数据,两个人的实现目的相同,结构相同,但就是名字不一样。这时候A要把B的代码结合到自己的程序中,如A制作了几个敌人攻击类,里面都有Attack方法,通过循环把全部敌人的Attack方法调用。B也制作了一个敌人类,但是B的敌人类的方法不是Attack方法,叫Hit方法,那这时怎么办呢,可能你会说把B的方法名字改一下不就好了,那如果B写的代码很多,修改起来很复杂,又或者这时候CDEF又有新的类需要接入过来呢,几十个人共同开发的话那不就得累死人了么。这时候就用得上Adapter 适配器模式了,简单说,Adapter 适配器模式就像我们生活中的转接头一样,相当于实现了一个转接头,把各种不同的插头,统一转换过来,并改造成适合我们使用的类。废话完毕,开动代码。正好之前做过类似某民突击的实现,就用这个做下例子,我们做几个AI敌人,分别是 步兵,狙击手,他们分别继承于一个虚类Soldier,然后都有一个攻击方法,防御方法。

public abstract class Soldier
 {
   public string Name;
 
     public Soldier(string name)
     {
         this.Name = name;
     }
 
     public abstract void Attack();
     public abstract void Defense();
 }
   上面就是虚类的构成,我们现在把步兵和狙击兵实现一下 :

//步兵
   public class Infantry : Soldier {
        public Infantry(string name) : base(name)
        {
 
        }
 
        public override void Attack()
        {
            Console.WriteLine(this.Name + "使用突击枪攻击");
        }
 
        public override void Defense()
        {
            Console.WriteLine(this.Name + "使用突击枪防御");
        }
    }
 
    //狙击兵
    public class Sniper : Soldier
    {
        public Sniper(string name) : base(name)
        {
        }
 
        public override void Attack()
        {
            Console.WriteLine(this.Name+"使用狙击枪攻击");
        }
[mw_shl_code=applescript,true]   static void Main(string[] args)
        {
            Soldier sniper = new Sniper("狙击手1号");
            sniper.Attack();
            sniper.Defense();
 
            Soldier infantry=new Infantry("步兵2号");
            infantry.Attack();
            infantry.Defense();
  
            Console.Read();
        }
   好了,这时候我们在初始化的时候把他们分别new一下,然后就可以看到两个士兵分别运行了起来。
static void Main(string[] args)
     {
         Soldier sniper = new Sniper("狙击手1号");
         sniper.Attack();
         sniper.Defense();
 
         Soldier infantry=new Infantry("步兵2号");
         infantry.Attack();
         infantry.Defense();
 
         Console.Read();
     }

   如果这时候,我们有了一个新的机器人的一个类进来,它的攻击和防御方法都和我们不一样,回到我们原来说的 ,如果这段代码不允许我们去更改的话,那应该怎么办呢 ?
public class RobotSoldier
   {
       public string Name;
 
       public RobotSoldier()
       {
       }
 
       public RobotSoldier(string name)
       {
           this.Name = name;
       }
 
       public void RobotAttack()
       {
           Console.WriteLine(Name+"使用激光器攻击");
       }
 
       public void RobotDefense()
       {
           Console.WriteLine(Name + "使用光盾防御");
       }
   }

   这时候,我们的适配器模式就可以派上用场了。首先我们新建一个 Translator类(适配器类),继承于士兵类,然后在类里面new一个外部的机器人 类, 我们在我们的适配器 里面重新封装里面的方法,就可以让我们的程序和适配器类一块调用起来了。
public class Translator : Soldier
   {
       private RobotSoldier RotSoldier=new RobotSoldier();
 
       public Translator(string name) : base(name)
       {
           RotSoldier.Name = name;
 
       }
 
       public override void Attack()
       {
        RotSoldier.RobotAttack();
       }
 
       public override void Defense()
       {
          RotSoldier.RobotDefense();
       }
   }
好,现在我们重新再来声明一下,就可以让机器人和我们之前的士兵们一块运行,并统一调配了:
class Program
  {
      static void Main(string[] args)
      {
          Soldier sniper = new Sniper("狙击手1号");
          sniper.Attack();
          sniper.Defense();
 
          Soldier infantry=new Infantry("步兵2号");
          infantry.Attack();
          infantry.Defense();
 
          Soldier rotSoldier=new Translator("机器人5号");
          rotSoldier.Attack();
          rotSoldier.Defense();
 
 
          Console.Read();
      }
  }

   我们就可以看到画面按照我们设想的一样正常运行了:  
 



     看到这里是不是觉得适配器模式又简单又好用呢,我们简单的来回顾一下适配器设计模式。
    Adapter模式主要应用于"希望复用一些现存的类,但是接口又和复用环境要求不一致的情况",在遗留代码复用,类库迁移等方法非常有效。
     Adapter模式本身要求我们尽可能的使用"面向接口的编程"风格,这样才能在后期很方便的适配。  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值