`
duolaaqian
  • 浏览: 14296 次
  • 性别: Icon_minigender_1
  • 来自: 天津
社区版块
存档分类
最新评论

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

阅读更多

 

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

 输出结果:

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

 

 



 

 

 

  • 大小: 4 MB
  • 大小: 2.9 MB
  • 大小: 2.6 MB
分享到:
评论

相关推荐

    设计模式-Java语言中的应用(pdf)

    《设计模式——Java语言中的应用》是一本专为Java开发者深入理解面向对象设计而编写的经典书籍。...无论是初级开发者还是经验丰富的程序员,都应该不断探索和实践设计模式,以提升自己的专业技能。

    JAVA设计模式-设计模式公司出品

    初级程序员可以学习设计模式的基本概念和应用,高级程序员能够从书中掌握更多高级技巧,而系统分析师可以通过设计模式来解决项目中遇到的复杂问题。 总体而言,设计模式是软件工程领域的宝贵财富,而《JAVA设计模式...

    研磨设计模式-part2

    《研磨设计模式》难度为初级到中级,适合与所有开发人员、设计人员或者即将成为开发人员的朋友。也可以作为高效学生深入学习设计模式的参考读物! 第1章 设计模式基础 第2章 简单工厂 第3章 外观模式 第4章 ...

    研磨设计模式-part4

    《研磨设计模式》难度为初级到中级,适合与所有开发人员、设计人员或者即将成为开发人员的朋友。也可以作为高效学生深入学习设计模式的参考读物! 第1章 设计模式基础 第2章 简单工厂 第3章 外观模式 第4章 ...

    研磨设计模式-part3

    《研磨设计模式》难度为初级到中级,适合与所有开发人员、设计人员或者即将成为开发人员的朋友。也可以作为高效学生深入学习设计模式的参考读物! 第1章 设计模式基础 第2章 简单工厂 第3章 外观模式 第4章 ...

    研磨设计模式(完整带书签).part2.pdf

    《研磨设计模式》难度为初级到中级,适合与所有开发人员、设计人员或者即将成为开发人员的朋友。也可以作为高效学生深入学习设计模式的参考读物! 第1章 设计模式基础 第2章 简单工厂 第3章 外观模式 第4章 ...

    Java设计模式之禅

    《Java设计模式之禅》是一本深入浅出讲解设计模式的书籍,书...综上所述,本书不仅是一本关于设计模式的入门书,也是对设计模式应用的深入探讨,无论是对于初级开发者、高级程序员,还是系统分析师,都能从中获得价值。

    JS设计模式与开发实践

    - **初级开发者**:可以学习JavaScript的基础知识和一些简单的设计模式。 - **中级开发者**:可以通过学习设计模式进阶,了解更高级的设计模式和技术细节。 - **高级开发者**:可以深入了解设计模式的应用,以及如何...

    java设计模式的 3本书 1 ppt

    这23种模式是根据GOF(GoF,Gang of Four)的经典著作《设计模式:可复用面向对象软件的基础》中的分类,包括创建型模式(如工厂模式、抽象工厂模式、单例模式等)、结构型模式(如适配器模式、桥接模式、装饰模式等...

    研磨设计模式PDF

    例如,适配器模式(Adapter)用于使不兼容的接口协同工作;装饰器模式(Decorator)允许动态地给对象添加新的行为或责任;代理模式(Proxy)为对象提供一个代理以控制对这个对象的访问;桥接模式(Bridge)将抽象...

    java23种设计模式详细讲解

    设计模式是软件工程中解决常见问题的模板或通用解决方案,Java设计模式是这些解决方案在Java语言中的具体实现。《java23种设计模式详细讲解》这本书系统地介绍了23种设计模式,并通过具体的例子来阐释每种模式的应用...

    java开发设计模式

    对于不同级别的程序员,设计模式能够提供不同程度的帮助和指导,从初级程序员的基础编程技能提升,到高级程序员的系统设计和架构,再到系统分析师的项目问题解决,设计模式都能发挥关键作用。 在应用设计模式时,...

    C/C++设计模式基础教程

    - **适配器模式**:允许不兼容的接口协同工作。 - **桥接模式**:将抽象部分与其实现部分分离,使得两者可以独立变化。 - **组合模式**:将对象组合成树形结构以表示“部分-整体”的层次结构。 - **外观模式**:...

    研磨设计模式(完整带书签).part1.pdf

    《研磨设计模式》难度为初级到中级,适合与所有开发人员、设计人员或者即将成为开发人员的朋友。也可以作为高效学生深入学习设计模式的参考读物! 第1章 设计模式基础 第2章 简单工厂 第3章 外观模式 第4章 ...

    您的设计模式

    本文讲述的是软件开发领域内设计模式的概念,以及如何将这些模式应用于Java编程中。设计模式是软件工程中,为了解决特定问题而形成的一种通用、可重复使用的解决方案模板。在软件开发中,设计模式为开发者提供了一套...

Global site tag (gtag.js) - Google Analytics