您的位置:首页 > 其它

[初级]设计模式--适配器模式

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+"] 干倒了一名对方球员");
};
}

 输出结果:

普通球员[布拉彻] 进攻
普通球员[布拉彻] 防守
核心球员[兰迪尔-迪-奥坎波] 干倒了一名对方球员
核心球员[东多-汉迪弗罗斯] 干倒了一名对方球员
核心球员[卡尔文-阿布埃瓦] 干倒了一名对方球员

 

 



 

 

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: