适配器模式:将一个类的接口,转换成客户期望的另一个接口。适配器让原本接口不兼容的类可以合作无间。
如果它走起路来像只鸭子,叫起来像只鸭子,那么它必定可能是一只鸭子包装了鸭子适配器的火鸡……
最近有一个鸭子选美大赛,比赛项目是叫声和飞行距离。我养的是一只野火鸡,但我想让它伪装成鸭子去参加比赛。首先所有鸭子会叫也会飞,即所有鸭子都实现鸭子接口
interface Duck { void quack();//鸭子呱呱叫 void fly();//鸭子会飞 }
所有火鸡也需要实现一个接口
interface Turkey { void gobble();//火鸡咯咯叫 void fly();//火鸡会飞,虽然飞不远 }
比赛的对手是绿头鸭
class MallardDuck : Duck { public void quack() { Console.WriteLine("呱呱呱"); } public void fly() { Console.WriteLine("我在飞"); } }
我的野火鸡
class WildTurkey : Turkey { public void gobble() { Console.WriteLine("咯咯咯"); } public void fly() { Console.WriteLine("我飞了很短一段距离"); } }
比赛的流程如下
static void testDuck(Duck duck) { duck.quack(); duck.fly(); }
显然我的野火鸡接口不同,不能公然拿来使用,但是我们可以给他伪装一下,伪造一个鸭子血统
class TurkeyAdapter : Duck { Turkey turkey; public TurkeyAdapter(Turkey turkey) { this.turkey = turkey; } public void quack() { turkey.gobble();//独特的叫声或许是加分项 } public void fly() { for (int i = 0; i < 5; i++) { turkey.fly();//飞的不够远就多飞几次 } } }
好了,现在我的野火鸡也可以参加鸭子大赛了,不过在此之前,我的野火鸡将作为特邀嘉宾先上场表演
static void Main(string[] args) { MallardDuck duck = new MallardDuck(); WildTurkey turkey = new WildTurkey(); Duck turkeyAdapter = new TurkeyAdapter(turkey); Console.WriteLine("特邀嘉宾(火鸡)上场"); turkey.gobble(); turkey.fly(); Console.WriteLine("\n鸭子一号(绿头鸭)上场"); testDuck(duck); Console.WriteLine("\n鸭子二号(伪装成鸭子的火鸡)上场"); testDuck(turkeyAdapter); Console.ReadKey(); }
我的火鸡就这样顺利的参加了鸭子大赛
时间: 2024-10-08 11:13:48