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

/**
 * 适配器模式
 * 	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+"] 干倒了一名对方球员");
	};
}

 输出结果:

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



 

 

 

猜你喜欢

转载自duolaaqian.iteye.com/blog/2251161