登陆注册
8183300000179

第179章 10 简单的模拟鸭子应用学习

大B:“游戏中会出现各种鸭子,一边游戏戏水,一边呱呱叫,我们设计了一个鸭子超类(Duck),并让各种鸭子继承此类。”

Java代码

Public abstract class Duck{

void quack();//呱呱叫

void swin();//游泳

abstract void display();//鸭子外观不同,所以是抽象的

//other

}

Public class MallardDuck extends Duck{

Public void display(){

//外观是绿头

}

}

Public class RedheadDuck extends Duck{

Public void display(){

//外观是红头

}

}

//other extends

public abstract class Duck{

void quack();//呱呱叫

void swin();//游泳

abstract void display();//鸭子外观不同,所以是抽象的

//other

}

public class MallardDuck extends Duck{

public void display(){

//外观是绿头

}

}

public class RedheadDuck extends Duck{

public void display(){

//外观是红头

}

}

//other extends

大B:“现在多了个主意,要让鸭子能飞,那么你可能想到只要在Duck类中加上fly()方法,然后让所有的鸭子都来继承这个方法。”

Java代码

Public abstract class Duck{

Void quack();//呱呱叫

Void swin();//游泳

abstract void display();//鸭子外观不同,所以是抽象的

fly();//刚加的会飞的方法,所有的子类都会继承

//other

}

public abstract class Duck{

void quack();//呱呱叫

void swin();//游泳

abstract void display();//鸭子外观不同,所以是抽象的

fly();//刚加的会飞的方法,所有的子类都会继承

//other

}

大B:“但是,可怕的问题就出来了:‘塑料橡皮鸭子’也会飞了,忽略了一件事,并非所有的鸭子都会飞。能想到继承,把橡皮鸭子类中的fly()方法覆盖掉,什么也不做。可是,如果以后要加入木头鸭子,不会飞也不会叫,你又想到了,把fly()从超类中取出来,做一个Flyable()接口,同样的方式,设计一个会叫的接口Quackable()。”

小A:“但是你没发现这么一来重复的代码会很多吗?”

大B:“现在我们知道使用继承并不能很好的解决问题,因为鸭子的行为在子类里不断的改变,让所有的子类都有这些行为是不恰当的。”

第一个设计原则:

找出应用中可能需要变化之处,把它独立出来,不要和那些不需要变化的代码混在一起。现在知道Duck()类里的fly()和quack()会随着鸭子的不同而改变,我们把它从Duck()类里取出来,写2个接口:

代码:

public interface FlyBehavior{

public void fly();//飞行行为必须实现的接口

}

public interface QuackBehavior{

public void quack();//叫行为必须实现的接口

}public interface FlyBehavior{public void fly();//飞行行为必须实现的接口

}

public interface QuackBehavior{

public void quack();//叫行为必须实现的接口

}

这样的设计可以让这2个动作行为与鸭子类无关,可以被其他的对象复用,也可以新增加一些行为。

第二个设计原则:

针对接口编程,而不是针对实现编程。

现在来整合下鸭子的行为:

代码:

1、Duck()抽象类

public abstract class Duck{

//为行为接口类型声明2个引用变量,所有的鸭子子类都继承它们

FlyBehavior flyBehavior;

QuackBehavior quackBehavior;

public Duck(){

}

//设定鸭子的行为,而不是在鸭子的构造器内实例化

public void setFlyBehavior(FlyBehavior fb){

flyBehavior=fb;

}

public void setQuackBehavior(QuackBehavior qb){

quackBehavior=qb;

}

abstract void display();//抽象外观方法

public void performFly(){

flyBehavior。fly();//委托给会飞的行为类

}

public void performQuack(){

quackBehavior。quack();//委托给会叫的行为类

}

public void swim(){

System。out。println(“All ducks float,even decoys!”);

}

}

2、FlyBehavior()接口与2个行为实现类

public interface FlyBehavior{

public void fly();

}

public class FlyNoWay implements FlyBehavior{

public void fly(){

System。out。println(“I cant fly”);

}

}

public class FlyWithWings implements FlyBehavior{

public void fly(){

System。out。println(“Im flying!”);

}

}

3、QuackBehavior()接口与2个行为实现类

Public interface QuackBehavior{

public void quack();

}

public class Quack implements QuackBehavior{

public void quack(){

System。out。println(“Quack”);

}

}

public class MuteQuack implements QuackBehavior{

public void quack(){

System。out。println(“《Silence》”);

}

}

4、来看看如何设定FlyBehavior和QuackBehavior的实例变量(继承)

public class MallardDuck extends Duck{

public MallardDuck(){

//绿头鸭子使用Quack类处理呱呱叫,所以当performQuack被调用时,叫的责任被委托给Quack对象,

//而我们得到了真正的呱呱叫

quackBehavior=newQuack();

//使用FlyWithWings作为其FlyBehavior类型

flyBehavior=newFlyWithWings();

}

public void display(){

System。out。println(“Im a real Mallard duck”);

}

}

5、制造一个新的鸭子类型

public class ModelDuck extends Duck{

public ModelDuck(){

flyBehavior=newFlyNoWay();//一开始我们的鸭子是不会飞的

quackBehavior=newQuack();

}

public void display(){

System。out。println(“Im a model duck”);

}

}

6、建立一个新的FlyBehavior类型,火箭动力的飞行行为

public class FlyRocketPowered implements FlyBehavior{

public void fly(){

System。out。println(“Im flying with a rocket”);

}

}

7、测试类

public class MiniDuckSimulator{

public static void main(String[]args){

Duck mallard=new MallardDuck();

//这会调用MallardDuck继承来的performQuack方法,进而委托给该对象的QuackBehavion对象处理

//也就是说调用继承来的quackBehavion引用对象的quack()方法

mallard。performQuack();

mallard。performFly();

Duck model=new ModelDuck();

//第一次调用performFly会被委托给flyBahavion对象,

//也就是FlyNoWay实例,该对象是在模型鸭子构造器中设置的

model。performFly();

//这会调用继承来的setter方法,把FlyRocketPowered火箭动力飞行行为设定到模型鸭子中,牛吧……

model。setFlyBehavior(new FlyRocketPowered());

//如果成功了,就意味着模型鸭子可以动态的改变它的飞行行为

model。performFly();

}

}

同类推荐
  • 微软360度

    微软360度

    本书是由微软总部华人协会组织编写的第二本书,是《微软360度——企业和文件》一书的姐妹篇,本书将着重向你呈现微软总部的华人专家是如何一步一步地走向成功的及在微软总部成功的心路历程,以及如何应对挑战,揭示了微软成功的最重要秘密之一——人才至上,读者读后收获更多的是这些成功人士的成功经验,从而为自己的成功做出更好的规划。就让我们一起通过此书来看看微软公司人才至上管理的方方面面,聆听微软的心声,感觉微软的脉动吧。
  • 中文版AutoCAD2005建筑绘图精讲精学

    中文版AutoCAD2005建筑绘图精讲精学

    本书从中文版AutoCAD2005建筑绘图的基础进行介绍,讲解了建筑绘图的环境设置、二维建筑图形的绘制、二维建筑及装饰图形的编辑、建筑绘图中的文字标注和图形查询、建筑装潢平面图中的尺寸标注、建筑绘图中图块的应用、建筑平面图的绘制、建筑立面图的绘制、建筑剖面图的绘制、建筑绘图中的三维造型、三维建筑模型绘制及建筑图纸的布局与打印输出等内容。
  • 多媒体技术

    多媒体技术

    多媒体技术多媒体技术多媒体技术多媒体技术多媒体技术多媒体技术多媒体技术多媒体技术多媒体技术多媒体技术多媒体技术
  • 大话设计模式

    大话设计模式

    本书主要采用JAVA语言介绍设计模式中比较常见的23种设计模式,分29章具体介绍,以现实生活中常见的事情为例来具体分析讲解。
  • 成为淘宝创业的超级毕业生

    成为淘宝创业的超级毕业生

    本书讲述如何通过淘宝创业将大学在校生打造成为“超级毕业生”。主要内容包括大学生从事淘宝创业的理论基础、学以致用的操作指南,以及可资借鉴的案例。书中的理念篇可供对创业教育感兴趣的高校教师参考;实战篇提出的“淘宝十二招”,操作简单,易学易用;案例篇讲述了十位成功在校创业大学生的故事,主要供学生参考。读完本书,相信凡是关注大学教育者或希望通过淘宝创业的大学生,皆能从中获得启发,对创业从无心变有心,从有心变行动,亲身投入或参与到这个伟大的事业中来。
热门推荐
  • 类次元人生

    类次元人生

    公元6042年,人类科技由几个科学家的饭后小谈而突破壁垒,然而受到外星文明入侵,技术流落民间,代号:类次元。被通缉的科学家安木子,落魄小子米小布,报仇的冷家兄妹,富二代东方玉轩…………
  • 周易天下

    周易天下

    纣王无道,天欲取之!这既是一场国与国之间的战争!也是一场神与仙之间的较量!或许从始至终都是高人间的一场游戏,更或者说……它只是一个阴谋!
  • 天行

    天行

    号称“北辰骑神”的天才玩家以自创的“牧马冲锋流”战术击败了国服第一弓手北冥雪,被誉为天纵战榜第一骑士的他,却受到小人排挤,最终离开了效力已久的银狐俱乐部。是沉沦,还是再次崛起?恰逢其时,月恒集团第四款游戏“天行”正式上线,虚拟世界再起风云!
  • 霸界神御

    霸界神御

    “遁我空门,修真霸气。狂杀神魔,立地成佛······”风起云涌之后,空炎来到了一个未知的世界,血腥残酷,强者生存,还是······这里是一个能量与霸气盛行的世界,人类的敌人是神,魔???看空炎勇闯这乱世······
  • 对你不理睬

    对你不理睬

    身为考古学家的姜涛难得能够放大假,二话不说就飞回台湾打算好好享受假期!想不到回国的第一天,他就在自己床上看见了一个“超正”的外国妞?!看来他的死党八成是看在他生活太枯燥的份上,才会特地送给他一个惊喜……如果他不好好享用这活色生香的大餐,岂不是辜负了人家的好意?
  • 了不起修仙模拟器

    了不起修仙模拟器

    带着神奇的修仙系统穿越到异界的故事,在这里你可以选择潜心修行,突破层层困难飞升成仙;也可以闯荡天下,收集天材地宝,留下赫赫威名;或是采集天下灵草,炼制奇丹神药;亦或是成为炼器大师,铸造神器法宝,流芳百世。
  • tfboys之樱花回忆

    tfboys之樱花回忆

    六年前,他离她而去,他约定六年后一定会回来找她。她笑这说好,没几日,父母却将她送到法国。六年后,她遵守他的约定,回到故土来等他找她。他们,能否再次相见?(作者是学生党,不会经常更文,但作者不会弃文的。)
  • 王妃不着调

    王妃不着调

    也许傻傻的轻松,才是我想要的余生.不希望大起大落,只愿此生有你.足以
  • 我若为星辰

    我若为星辰

    人若要我死,我必屠尸百万!仙若要杀我,我必弑仙无数!天若要亡我,我必焚灭诸天!
  • 桃花树下的十年之约

    桃花树下的十年之约

    男孩的声音依然回荡在耳边,可是身边的人,却不是他“你不能忘了他吗?”“忘了他,对不起我做不到”“可是你已经嫁给我了”男孩霸气的抬起她的头,低头便吻了上去