您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 资本运营 > 面向对象范式-2014策略模式
itc.bnuep.com策略模式欢迎来到OO设计模式村!itc.bnuep.com如何对同一个算法概念拥有多种的实现算法-而客户端可以一致的调用这些具体算法设计模式—策略模式itc.bnuep.com设计场景1鸭子模拟器游戏设计场景:公司需要开发一款鸭子模拟器游戏,游戏中有多种鸭子,如绿头鸭、红头鸭、橡皮鸭、木偶鸭等等,每种鸭子可以游泳、叫、飞、走、抓鱼吃等行为,每种鸭子可以用不同的方式来完成这些行为展示给玩家看,如叫可以是支支叫、呱呱叫,飞可以是展翅飞、拍翅飞等等,以吸引玩家。请设计该场景,便于将来进行扩展。itc.bnuep.comitc.bnuep.comHOWTO简单步骤:1、做什么(场景),需要解决的问题2、谁来做(概念角色模型),有哪些核心概念、对象?3、谁做什么(类职责/方法/契约),对象职责分配4、谁做什么时和谁协作(类关系),确定对象协作关系5、哪些“谁”可以进行变化点封装(类泛化/特化—抽象类及接口派生和实现)6、可视化方式表达静态结构(类图表达)8、写出代码(类实现)7、可视化方式表达动态结构(对象时序图表达)分析—概念设计—规格表示编码—实现评估9、设计效果评估(维护性,扩展性,复用性)注:设计中使用时序图设计类方法及方法实现逻辑完整的具体的OOAD步骤itc.bnuep.com设计场景2设计场景:动作冒险游戏,游戏中有一系列角色(Character),包括国王(King)、皇后(Queen)、骑士(Knight)、妖怪(Troll),这些角色可以在游戏中每一次使用一个武器(Weapon)来攻击对方,并且可以在运行时切换武器,为了增加游戏的乐趣,可以有的武器包括:匕首、宝剑、斧头、弓箭等等,可能以后又更时髦的武器出现。请设计该场景。itc.bnuep.com模拟鸭子游戏SimDuckJoe上班的公司做了一套相当成功的模拟鸭子游戏:游戏中出现各种鸭子,一边游泳戏水,一边呱呱叫,此系统内部设计使用了标准的OO技术,设计如下:itc.bnuep.com模拟鸭子游戏SimDuck此系统内部设计使用了标准的OO技术,设计如下itc.bnuep.com现在的问题?(1、设计场景:做什么)现在我们得让鸭子itc.bnuep.comJoe的解决方案子类继承Duck类的Fly方法,这样会有什么问题呢?itc.bnuep.comJoe的解决方案所有鸭子都会一样的飞?itc.bnuep.comJoe的解决方案—可怕的问题发生了橡皮鸭子怎么也会飞?itc.bnuep.comJoe的解决方案—可怕的问题发生了橡皮鸭子怎么也会飞?现在怎么改才行呢?itc.bnuep.comJoe的解决方案—再次想到继承子类方法覆盖,OK?解决方式:如果子类不同方式飞或叫,就覆盖,不然就直接继承父类的方法itc.bnuep.comJoe的解决方案—再次想到继承1、可是还可能有更多的鸭子2、每当有新的鸭子出现,joe就要检查是否需要覆盖哪些方法这不是噩梦吗?itc.bnuep.comJoe的解决方案—利用接口如何?超笨的主意!!重复代码!!!itc.bnuep.com如果你是Joe,你要怎么办?还记得优雅的修改、扩展吗?如何让我们上面的设计能优雅的适应需求的变化呢itc.bnuep.com把问题归零--设计原则把会变化的部分取出并“封装”起来,好让其他部分不会受到影响结果如何?修改代码所引起的不经意后果变少,系统变得更有弹性原则的另一种思考方式,把会变化的部分取出并封装起来,以便以后可以轻易的改动或者扩充此部分,而不影响不需要变化的其他部分。封装的工具:抽象类或者接口itc.bnuep.com重新设计封装的工具:抽象类或者接口分开变化与不会变化的部分Duck类内的fly()和quack()会随着鸭子的不同而改变。为了要把这两个行为从duck类中分开,我们将它们封装拥抱变化:变化点有1、鸭子2、?3、?itc.bnuep.com设计鸭子的行为封装的工具:抽象类或者接口分开变化与不会变化的部分拥抱变化Duck类内的fly()和quack()会随着鸭子的不同而改变。为了要把这两个行为从duck类中分开,我们将它们用“接口”封装,这样duck类就不需要知道行为的实现细节如何修改和扩展呢,效果如何?itc.bnuep.com设计鸭子的行为我只知道你是我的偶像知人知面不知心类型限制针对超类型(SuperType)编程,即抽象类或接口,定义变量时的声明类型应该是超类型,这样才会在运行时体现多态的效果!如何修改和扩展呢,效果如何?itc.bnuep.com如果你还不知道多态,请看!itc.bnuep.com实现鸭子的行为(最高境界)效果如何?与继承对比轻松多了itc.bnuep.com调用鸭子的行为(变量定义)超类型变量定义itc.bnuep.com调用鸭子的行为问题:1、MallardDuck的行为能否动态改变呢?如先呱呱叫,接着吱吱叫2、是否是针对接口编程呢?itc.bnuep.com调用鸭子的行为OOP三件事:1、声明对象变量;2、实例化对象;3、对象方法调用。OOP两种编程方式:1、针对接口编程;2、针对具体实现编程。类关联成员变量的实例化有哪些方式?请尽量多的例举!itc.bnuep.com动态设定行为(setter方法)问题:1、MallardDuck的行为能否动态改变呢?如先呱呱叫,接着吱吱叫2、是否是针对接口编程呢?itc.bnuep.com测试类调用你能画出测试方法的时序图吗?itc.bnuep.com设计类图itc.bnuep.com作业思考你能划出鸭子模拟器的设计类图吗?你能列出在设计过程中所有用到的原则吗?你能画出鸭子模拟器的时序图吗?你能在设计类图中指出该设计如何做到修改、扩展和复用的效果吗?哪种类关系能够做到动态设置行为?以上场景实际是代码重构的过程,现在我们采用另外一种方式—完全新开发一个鸭子模拟器游戏。请写出设计场景itc.bnuep.com回顾itc.bnuep.com当前同学们在软件设计时的一些问题1、对软件设计没有感觉、没有兴趣?itc.bnuep.com当前同学们在软件设计时的一些问题怎么办?1)探究式的案例学习、小组讨论、角色扮演。2)形象的案例场景和固定步骤的设计模式实现。3)采用三个层次的练习--验证式小型练习(基础面向对象思想及语言训练)、探究式中型案例练习(设计模式)、深入系统型练习(相对完整系统实现)。itc.bnuep.com当前同学们在软件设计时的一些问题怎么办?4)事实上,如《代码大全》所述:设计是一个险恶的问题你在学校中所开发的程序和你在职业生涯中所开发的程序的主要差异就在于,学校里的程序所解决的设计问题很少(如果有的话)是险恶的。学校里给你的编程作业都是为了让你能从头到尾直线前进而设计的。如果有位老师给你一份编程作业,你刚完成设计时他就把作业的要求改了,然后就在你将要提交完整的程序时,他又对作业的要求再次改动,这时你肯定会十分生气。然而这一过程正是在专业编程中每日可见的真实情形。这个时候,你可以使用版本管理的方式进行改进,保留每次改进的结果,这样可能导致成就感,也就培养了兴趣。itc.bnuep.com当前同学们在软件设计时的一些问题2、编程语言问题:不熟悉面向对象语言,如java\c++:现在有同学说我们用自然语言(中文)可以很好的描述需要设计的场景,但是当我们要将这些转变为面向对象语言,就很困难解决方式:1)语法分析,语法成分映射:一个软件需要完成一定的功能,“功能”如何使用中文描述?--谁做什么--叙述句--如何对应面向对象语言的成分呢?如后页描述2)多练习java编程,可以通过小型作业(练习六种类关系)和中型作业(一个设计场景)和系统作业(完整的软件)来加强面向对象语言的实践和理解。itc.bnuep.com《代码大全》中对比自然语言和编程语言某些语言更能表达编程中的各种概念。你可以将自然语言(如英语)和编程语言(如Java和C++)做一个类比。对于自然语言,语言学家Sapir和Whorf对“语言的表达能力”和“思考的能力”之间的关系提出了一个假说。Sapir-Whorf假说是,你思考的能力取决于你是否知道能够表达该思想的词汇。如果你不知道这些词汇,就无法表达出这种思想,甚至可能不能形成这种思想(Whorf1956)。程序员同样受到所用编程语言的影响。在一种编程语言中可用来表达编程思想的词汇,毫无疑问地决定了你将如何表达你的思想,甚至可能决定了你能表达什么样的思想。itc.bnuep.com当前同学们在软件设计时的一些问题按照结构关系,可以把现代汉语的单句分为主谓句(同时含有主语和谓语)和非主谓句(分不出主语和谓语)两大类型主谓句名词谓语句今天星期天。动词谓语句“把”字句你去把垃圾倒了。工人把路灯熄了“被”字句树叶被风吹跑了。蛋糕||〔被老鼠〕叼走了。连谓句父亲听了后很高兴。老师拿粉笔在黑板上写字,左先生||去打电话叫车。兼语句老师鼓励大家学好外语。我们选他当代表。双宾句管理员递给我两本新书。存现句门口停着一辆小汽车。形容词谓语句果园的苹果熟了。主谓谓语句她眼睛熬得通红。非主谓句名词性非主谓句谁?动词性非主谓句下雨了。形容词性非主谓句真不错!叹词句哎哟!itc.bnuep.com自然语言与面向对象语言映射自然语言—职责驱动语言—面向对象语言1自然语言主语、宾语谓语宾语2职责驱动语言角色职责协作3面向对象语言类类方法类方法体代码执行逻辑语句(对象方法调用)国王使用武器攻击对方骑士,武器打击骑士,骑士改变生命力自然语言国王、武器、骑士1使用、2攻击损伤改变1武器(关联)、2骑士(依赖)骑士生命力职责驱动语言角色是:...国王职责:武器职责:骑士职责:setWeapon(weapon)\fight(knight)attack(knight)setHP(hp)OO语言国王、武器、骑士king.setWeapon(weapon)\king.fight(knight)其他类似见下页方法代码实现。itc.bnuep.com设计和实现1.king的方法实现2.publicclassKing{3.privateWeaponcurrentw;4.privateArrayListws;5.publicvoidsetWeapon()//改良:多个武器,选一个6.{this.currentw=ws.next();}//这里只是伪代码7.publicvoidfight(Knightk){8.intlife=currentw.attack(k);9.k.setHP(k.getHP()-life);10.}11.publicvoidaddWeapon(Weaponw){ws.add(w);}12.privatedoubleabilityrate=0.4;//防疫力比例13.privateinthp=100;14.publicvoidsetHP(inthp){this.hp=hp;}15.publicdoublegetAbilityRate(){returnabilityrate;}}itc.bnuep.com设计和实现1.Knight的方法实现(这里可以暂时简单的将不同武器的攻击力设置为相应的常量,你可以考虑,如果每个武器对不同的攻击对象有不同的攻击力,如何设计呢?King等和骑士类似实现,可抽象出一个共同父类Character)2.publicclassKnight{3.privateWeaponcurrentw;4.privateArrayListws;5.publicvoidsetWeapon()//改良:多个武器,选一个6.{this.currentw=ws.next();}//这里只是伪代码7.publicvoidfight(Characterk){8.intlife=currentw.attack(k);9.k.setHP(k.getHP()-life);10.}11.publicvoidaddWeapon(Weaponw){ws.a
本文标题:面向对象范式-2014策略模式
链接地址:https://www.777doc.com/doc-1960784 .html