定义:将一个类的接口转化成客户希望的另一个接口,适配器模式让那些接口不兼容的类可以一起工作。别名(包装器[Wrapper]模式)
它属于创建型模式的成员,何为创建型模式:就是关注如何将现有类或对象组织在一起形成更大的结构。由于系统中存在类和对象,所以存在两种结构型模式:类结构型模式(关注类的组合,由多个类组成一个更大的系统,一般只有继承关系和实现关系)、对象结构型模式(关注类和对象的组合,通过关联关系,在一个类中定义另一个类的对象,然后通过该对象调用相关方法)。
适配器,适配器,笔记本要用的就是电源适配器(AC Adapter),没错,有了电源适配器,我们笔记本就能使用本来不能使用的220V的电压了,这也就是电源适配器的功劳。我们这里也一样,引入适配器模式以兼容某些结构。
结构:
简单分析:
上图是课上老师给的例子,这样理解起来就很容易了。伪装者即适配器类,由于要用到鸭子的方法,所以用火鸡伪装下,它关联鸭子,就可以在内部生成鸭子的对象。即披着鸭子皮的火鸡,让小朋友们误以为是鸭子在表演。
定义:缺当不需要实现一个接口所提供的所有方法时,可先设计一个抽象类实现该接口,并为接口中每个方法提供一个默认实现(空方法),那么该抽象类的子类可以选择性地覆盖父类的某些方法来实现需求,它适用于不想使用一个接口中的所有方法的情况,又称为单接口适配器模式。
结构:
适配器中同时包含对目标类和适配器类的引用,适配者可以通过调用目标类中的方法,目标类也可以通过它调用适配者类中的方法,该适配器即双向适配器
结构:
1 public class Adapter : Target, Adaptee 2 { 3 //同时维持对抽象目标类和适配者的引用 4 private Target target; 5 private Adaptee adaptee; 6 7 public Adapter(Target target) 8 { 9 this.target = target;10 }11 12 public Adapter(Adaptee adaptee) 13 {14 this.adaptee = adaptee;15 }16 17 public void Request() 18 {19 adaptee.SpecificRequest();20 }21 22 public void SpecificRequest() 23 {24 target.Request();25 }26 }
应用:实现一个双向适配器实例,使得猫(Cat)可以学狗(Dog)叫(Cry()),狗可以学猫捉老鼠(CatchMouse())
实现:
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 6 namespace 适配器模式 7 { 8 public interface IDog 9 {10 void Action();11 void Wang();12 }13 14 public interface ICat15 {16 void Cry();17 void CatchMouse();18 }19 20 public class Snoopy : IDog21 {22 public void Action()23 {24 }25 26 public void Wang()27 {28 Console.WriteLine("汪汪的叫.......");29 }30 }31 32 public class Tom : ICat33 {34 public void Cry()35 {36 }37 38 public void CatchMouse()39 {40 Console.WriteLine("捉老鼠.....");41 }42 }43 44 public class Adapter : ICat, IDog45 {46 private IDog dog;47 private ICat cat;48 49 public Adapter(IDog d)50 {51 this.dog = d;52 }53 54 public Adapter(ICat c)55 {56 this.cat = c;57 }58 59 public void Cry()60 {61 dog.Wang();62 }63 64 public void CatchMouse()65 {66 cat.CatchMouse();67 }68 69 public void Action()70 {71 cat.CatchMouse();72 }73 74 public void Wang()75 {76 dog.Wang();77 }78 }79 80 class Program81 {82 static void Main(string[] args)83 {84 //这里猫想学狗叫,实现Cry的方法,所以适配者首先是一只猫,它要实现猫的Cry的方法,85 //但适配者是假的,它只能借助狗的方法来实现。86 ICat cat = new Adapter(new Snoopy());87 Console.Write("Cat learn:");88 cat.Cry();89 Console.Read();90 }91 }92 93 }
联系客服