[初级]设计模式--适配器模式
2015-10-22 20:45
225 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/u010398336/article/details/84746148
/** * 适配器模式 * 1、源角色(已有的角色) * 2、目标角色(需要成为的角色) * 3、适配器角色(将 原角色 转换成 目标角色) * * 优点: * 1、不用修改已有代码 * 2、复用已有代码 * 缺点: * 1、会造成类相互之间的关系不清晰 * * 注意: * 属于"补丁"方法,尽量不要有机会使用 * * 场景: * 功能复合需求,但是调用跟需求不匹配时,中间通过一个转换类来实现两者之间的调用 * * NBA不可轻易改变,CBA不可轻易改变 * CBA球员不会英语,听不懂attack,无法进入NBA球队 * 通过翻译翻译,CBA知道了attack就是jingong,可以进入NBA球队 */ public class AdapterDemo01 { public static void main(String[] args) { NBAPlayer tmac = new NBAPlayer("T-mac"); NBAPlayer brooks = new NBAPlayer("布鲁克斯"); NBAPlayer mutombo = new NBAPlayer("穆托姆博"); CBAPlayer ym = new CBAPlayer("姚明"); CBAPlayer dazhizi = new CBAPlayer("郭艾伦"); NBATeam rockets = new NBATeam(); rockets.add(tmac); rockets.add(brooks); rockets.add(mutombo); // rockets.add(ym);//编译报错 // rockets.add(dazhizi);//编译报错 rockets.add(new Translator(ym));//编译通过 rockets.add(new Translator(dazhizi));//编译通过 rockets.play(); } } interface NBA{ public void defend(); public void attack(); } interface CBA{ public void fangShou(); public void jinGong(); } class NBAPlayer implements NBA{ String name; public NBAPlayer(String name){ this.name = name; } @Override public void defend() { System.out.println(this.name + " defend!!!"); } @Override public void attack() { System.out.println(this.name + " attack!!!"); } } class CBAPlayer implements CBA{ private String name; public CBAPlayer(String name){ this.name = name; } @Override public void fangShou() { System.out.println(this.name + " 防守!!!"); } @Override public void jinGong() { System.out.println(this.name + " 进攻!!!"); } } class NBATeam{ private List<NBA> playerList = new ArrayList<NBA>(); public void add(NBA player){ playerList.add(player); } public void play(){ for(NBA play : playerList){ System.out.println("[NBA]"); play.attack(); play.defend(); } } } /** * 翻译(适配器) */ class Translator implements NBA{ public CBAPlayer player; public Translator(CBAPlayer p){ this.player = p; } @Override public void defend() { System.out.println("====翻译翻译 defend 为 defend"); player.fangShou(); } @Override public void attack() { System.out.println("====翻译翻译 attack 为 jinGong"); player.jinGong(); } }
输出结果:
[NBA] T-mac attack!!! T-mac defend!!! [NBA] 布鲁克斯 attack!!! 布鲁克斯 defend!!! [NBA] 穆托姆博 attack!!! 穆托姆博 defend!!! [NBA] ====翻译翻译 attack 为 jinGong 姚明 进攻!!! ====翻译翻译 defend 为 defend 姚明 防守!!! [NBA] ====翻译翻译 attack 为 jinGong 郭艾伦 进攻!!! ====翻译翻译 defend 为 defend 郭艾伦 防守!!!
/** * 缺省适配模式 * * 1、标准接口 * 2、适配器父类 * 3、具体实现类 * * 有时候我们继承父类,但是只实现了部分功能,其他功能只是空的实现 * 我们定义一个专门实现空方法的父类,之后子类继承该父类,避免了子类去继承空方法的麻烦 * * 场景: * 2015男篮亚锦赛决赛 * 会打球可以进入菲律宾男篮,会打架也可以, * 所以菲男篮就有三个接口(throwBall、throwBall、scuffle) * 但有的球员只会打球,有的只会打架, * 所以为了让球员更关注与自己的工作,我们定义缺省适配器 * 这样,各个球员只关注他们的主要工作就可以了 */ public class AdapterDemo02 { public static void main(String[] args) { SaucePlayer blch = new SaucePlayer("布拉彻"); CorePlayer dacb = new CorePlayer("兰迪尔-迪-奥坎波");//33锁喉 CorePlayer dh = new CorePlayer("东多-汉迪弗罗斯");//25断子绝孙腿 CorePlayer ka = new CorePlayer("卡尔文-阿布埃瓦");//8锁喉 PhilippineNationalTeam pnt = new PhilippineNationalTeam(); pnt.add(blch); pnt.add(dacb); pnt.add(dh); pnt.add(ka); pnt.play(); } } /** * 菲律宾国家队 */ class PhilippineNationalTeam{ private List<PBA> playerList = new ArrayList<PBA>(); public void add(PBA player){ playerList.add(player); } public void play(){ for(PBA play : playerList){ play.throwBall(); play.eyeDefense(); play.scuffle(); } } } /** * 菲律宾联赛 */ interface PBA{ public void throwBall(); public void eyeDefense(); public void scuffle(); } /** * 缺省适配器 */ abstract class DefaultPBA implements PBA{ public void throwBall(){}; public void eyeDefense(){}; public void scuffle(){}; } /** * 普通球员 */ class SaucePlayer extends DefaultPBA{ private String name; public SaucePlayer(String name){ this.name = name; } public void throwBall(){ System.out.println("普通球员["+this.name+"] 进攻"); }; public void eyeDefense(){ System.out.println("普通球员["+this.name+"] 防守"); }; } /** * 主要球员 */ class CorePlayer extends DefaultPBA{ private String name; public CorePlayer(String name){ this.name = name; } public void scuffle(){ System.out.println("核心球员["+this.name+"] 干倒了一名对方球员"); }; }
输出结果:
普通球员[布拉彻] 进攻 普通球员[布拉彻] 防守 核心球员[兰迪尔-迪-奥坎波] 干倒了一名对方球员 核心球员[东多-汉迪弗罗斯] 干倒了一名对方球员 核心球员[卡尔文-阿布埃瓦] 干倒了一名对方球员
相关文章推荐
- [工作中的设计模式]适配器模式adapter
- 设计模式之适配器模式
- 设计模式之(十三、适配器模式)Adapter
- 设计模式之适配器模式
- 设计模式之:适配器模式
- 设计模式之适配器模式
- Java设计模式--适配器模式
- 设计模式(四)适配器模式(转)
- 设计模式之适配器模式
- 23种设计模式(6):适配器模式
- 设计模式学习笔记——适配器模式(Adapter Patten)
- JAVA设计模式---adapter(适配器模式)
- 设计模式之禅学习笔记--适配器模式
- 设计模式之适配器模式(Adapter Class/Object)
- 设计模式之适配器模式 adapter
- 设计模式之适配器模式的学习思考
- 设计模式 - 适配器模式
- Java设计设计模式之适配器模式(Adaptor)
- 设计模式学习笔记(3)——适配器模式(Adapter Pattern)
- java设计模式之适配器模式