欢迎来到天天文库
浏览记录
ID:37502604
大小:392.48 KB
页数:36页
时间:2019-05-24
《策略模式详解》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、DesignPattern设计模式课程1:StrategyPattern张长春(骆驼阿飞)1关于模式•模式–模式描述了一个在我们的环境中不断出现的问题,然后描述了该问题的解决方案的核心。通过这种方式,你可以无数次地使用那些已有的解决方案,无需在重复相同的工作。-------《建筑的永恒之道》Alexander–模式其实就是解决某一类问题的方法论。–把解决某类问题的方法总结归纳到理论高度,那就是模式。–模式对问题的描述以及对问题的解答应具有高度的抽象性和代表性。–模式是对现实生活某类现象的共同特质的高度抽象,描述了事务或者现象的规律,这种规律以及解决方法对
2、于类似的现象同样有用。2设计模式•软件的设计模式–指在软件设计和开发过程中,不断总结出来的,反应了某一类设计问题的解决方案。–模式是一种指导,在一个良好的指导下,有助于你完成任务,有助于你作出一个优良的设计方案,达到事半功倍的效果。而且会得到解决问题的最佳办法。–设计模式使人们可以更加简单方便地复用成功的设计和体系结构。3为什么我们要使用设计模式?•设计模式帮助你从别人的成功经验而不是你自己的失败那里学到更多东西;-------MarkJohnson•设计模式提供了一种共享经验的方式,可以使团体受益和避免不断的重复发明。4一些设计原则1•面向接口编程的原
3、则–面向接口编程,而不是面向实现编程。•可变性封装的原则–在设计时应当考虑系统中什么可能会发生变化,或者什么特性具备多变的特征。这种变化不应该散落在代码中的各个角落,而是应该被适当的封装起来,以便于维护以及扩展;•开-闭原则–软件中的实体(包括类,模块,函数等等)应当是可扩展的(开),而不应被修改(闭)。•里氏替换原则–父类的方法都要在子类中实现或者重写。–不允许子类出现父类所没有定义的方法。•依赖倒转原则–高层模块不应该依赖于低层模块。二者都应该依赖于抽象。–抽象不应该依赖于细节。细节应该依赖于抽象。5一些设计原则2•组合/聚合复用原则–尽量使用组合/
4、聚合、尽量不使用继承–在一个新的对象里面使用一些已有的对象,使之成为新对象的一部分;新的对象通过向这些对象的委派达到复用这些对象的目的•接口隔离原则–避免接口污染;–恰当的划分角色和接口;–从一个客户类的角度来讲:一个类对另外一个类的依赖性应当是建立在最小的接口上的–使用多个专门的接口比使用单一的总接口要好•所有设计原则的目标都是为了使软件:降低耦合,增强灵活性。•在接下来的设计模式的讲解中,我们再来体验这些设计原则给我们带来的方便6从一个例子开始:DuckSimulator这是一个鸭池仿真游戏《仿真鸭》。这个游戏可以展现了所有种类鸭子的游泳和嘎嘎叫声。
5、最初的系统设计者使用了标准的面向对象的技术并创建了“鸭”基类,使得其他种类的鸭可以继承。Duck所有的鸭子都会嘎嘎叫quack()和游泳,这个基类提供swim()了这些实现的代码display()//OtherducklikemethodsDisplay()方法是抽象的,大多数类型的鸭子都从这个Duck类中继承因为不同类型的鸭子看起来是不一样的RedHeadDuckMallardDuckdisplay(){display(){//lookslikeamallard}//lookslikeamallard}每一类鸭子负责实现自己的展现行为,使之可以在显示器
6、上展现出来7客户要求为鸭子增加“飞”的功能Joe正好接手这个项目开我仅仅只需要在Duck始展开工作,他想:现在类里增加fly()方法,然是展示我真正的面向对象后所有其他鸭子就都可才华的时候了。嘿嘿……以继承它了。Duckquack()swim()display()//OtherducklikemethodsFly():viodJoe在基类Duck中增加了一所有的子类都从Duck基类中继承了个方法,以为大功告成……fly()方法。RedHeadDuckMallardDuckdisplay(){display(){//lookslikeamallard}//
7、lookslikeamallard}8但似乎发生了很严重的错误……Joe,我正在股东大会上。他们刚看完演示,很多橡皮鸭子在屏幕上四处乱飞。Duckquack()swim()display()好吧,我的设计有//OtherducklikemethodsFly():viod一点小缺陷。我不明白为什么他们不给Duck基类增加新行为能只部分调用它。的时候,他也同时给那些不需要这些行为的Duck的子类增加了。MallardDuckRedHeadDuckRubberDuckdisplay(){display(){squeak()//lookslikeamallard
8、//lookslikeamallarddisplay(){}}//looksli
此文档下载收益归作者所有