适配器模式

来源:互联网 发布:kcf跟踪算法原理 编辑:程序博客网 时间:2024/05/18 22:17

实例:

NBA运动员翻译


UML类图:



实例实现代码:

//篮球运动员    abstract class Player    {        protected string name;        public Player(string name)        {            this.name = name;        }        public abstract void Attack();        public abstract void Defense();    }    //前锋    class Forwards : Player    {        public Forwards(string name)            : base(name)        {        }        public override void Attack()        {            Console.WriteLine("前锋 {0} 进攻", name);        }        public override void Defense()        {            Console.WriteLine("前锋 {0} 防守", name);        }    }    //中锋    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);        }    }    //后卫    class Guards : Player    {        public Guards(string name)            : base(name)        {        }        public override void Attack()        {            Console.WriteLine("后卫 {0} 进攻", name);        }        public override void Defense()        {            Console.WriteLine("后卫 {0} 防守", name);        }    }    //外籍中锋    class ForeignCenter    {        private string name;        public string Name        {            get { return name; }            set { name = value; }        }        public void 进攻()        {            Console.WriteLine("外籍中锋 {0} 进攻", name);        }        public void 防守()        {            Console.WriteLine("外籍中锋 {0} 防守", name);        }    }    //翻译者    class Translator : Player    {        private ForeignCenter wjzf = new ForeignCenter();        public Translator(string name)            : base(name)        {            wjzf.Name = name;        }        public override void Attack()        {            wjzf.进攻();        }        public override void Defense()        {            wjzf.防守();        }    }

客户端实现:

        static void Main(string[] args)        {            Player b = new Forwards("巴蒂尔");            b.Attack();            Player m = new Guards("麦克格雷迪");            m.Attack();            //Player ym = new Center("姚明");            Player ym = new Translator("姚明");            ym.Attack();            ym.Defense();            Console.Read();        }

说明:

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

共有两类适配器模式:

对象适配器模式

-- 对象适配器不继承被适配者,而是组合了一个对它的引用;如下图:


Adapter是一个Target类型,同时也是一个Adaptee类型。Adapter重载Target的request方法,但是Adapter没有重载Adaptee的specificRequest方法,而是在Adapter的request方法的实现中,调用超类的specificRequest方法。request方法在运行时向超类发送[superspecificRequest]消息。super就是Adaptee,它在Adapter的request方法的作用域内,按自己的方式执行specificRequest方法。只有当Target是协议而不是类时,类适配器才能够用OC来实现。


以上的例子中,Translator就是Adapter,ForeignCenter就是Adaptee,Translator组合了一个ForeignCenter的引用


类适配器模式
-- 通过继承来适配两个接口;如下图:



在Objective-C中,类可以实现协议,同时又继承超类,达到C++的多重继承效果,要在OC中实现类适配器,首先需要有定义了客户端要使用的一套行为的协议,然后要用具体的适配器类来实现这个协议,适配器类同时也要继承被适配者。



参考资料

-《大话设计模式》

-《OC编程之道》


1 1
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 自己班同学被自己取好多外号怎么办 刚学会走路的宝宝脚外八字怎么办 宝宝两岁走路膝盖弯曲不直怎么办 一岁多的宝宝走路o型腿怎么办 21个月的宝宝走路o型腿怎么办 宝宝十一个月了0型腿怎么办 14个月宝宝o型腿怎么办 深蹲了三个月大腿变粗了怎么办 脚踢球时被踢肿了变紫了怎么办 没钱去健身房想要练出好身材怎么办 群里有人发反政府视频怎么办 部队取消番号后之前军人档案怎么办 新疆武警黄金部队新兵改革后怎么办 别人偷了自己的东西没有证据怎么办 家里项链被邻居偷了没有证据怎么办 知道是谁偷钱都是没有证据怎么办 武警驾照开地方车被交警拦了怎么办 双手擦了纤体瘦身膏辣疼怎么办 乳房全切术后切口裂开化脓怎么办 擦了锁水的霜之后出汗怎么办 用完瘦脸霜感觉脸部又痒又烧怎么办 嘴角起好多的小炮泡怎么办快好 DNF龙腾光环领错角色怎么办 海盗来了卡在新手奖励怎么办 海盗来了获得新手奖励卡了怎么办 魔域帐号忘了哪个区的了怎么办 魔域口袋版幻兽栏满了怎么办 苹果平板的密码和邮箱都忘了怎么办 二级报名忘了邮箱和密码怎么办 用身份证买的手机号变成空号怎么办 魔域口袋版背包幻兽满了怎么办? 魔域宝宝转世满了还不变雷怎么办 魔域口袋版家族试炼士气不足怎么办 聚水潭暂存位没有箱号怎么办? 长时间不锻炼运动后浑身酸痛怎么办 体脂称身体年龄比实际年龄大怎么办 分手两天我好难过好想去找他怎么办 宝宝一吃药就哭得很厉害怎么办 比你入职晚的同事比你厉害怎么办 nba篮球大师能力值满了怎么办 做什么都觉得很累没有兴趣怎么办