1、设计模式、框架及其实践 张永吉 .设计模式、框架及其实践 张永吉 .怎样成为一个象棋高手??第一步,学习基本规则 第二步,学习取胜的原理 这时,你说你已经学会下棋学会下棋了 但是,你要想成为一个象棋高手,除了多下棋和善于总结经验以外,一个重要的途径就是看高手们的棋谱,学习、理解、记忆和应用高手们总结的布局和定式?这里的布局和定式就相当于我们说的模式,有几百种。.怎样成为一个象棋高手??第一步,学习基本规则 第二步怎样成为一个软件设计高手??第一步,学习基本规则。例如,数据结构、各种算法、编程语言等。?第二步,学习软件设计的原理和方法。例如,结构程序设计、模块化方法、面向对象的设计方法等。这时,
2、你已经可以说学会软件设计学会软件设计了。?但是,你要想成为一个软件设计的高手,除了多动手和自己善于总结经验总结经验以外,一个重要的途径就是看软件设计的高手们的软件,学习、理解、记忆和重复应用软件设计模式。?这种模式很多,有几百种。.怎样成为一个软件设计高手??第一步,学习基本规则。例如,数目标?了解面向对象设计的基本原则了解面向对象设计的基本原则 了解设计模式概念及常用的设计模式 了解框架的概念及设计原则 掌握设计模式的学习方法.目标?了解面向对象设计的基本原则 了解设计模式概念及内容?面向对象设计开发的基本原则 设计模式概念、分类及常用设计模式 框架概念及设计原则 设计模式的运用实例?油品计
3、算框架?基于Jexcel的简易报表开发框架?Junit 设计.内容?面向对象设计开发的基本原则 设计模式概念、分类面向对象设计原则?开闭原则 针对接口编程原则 高内聚-低耦合原则 最少知识原则 类的单一职责原则 依赖倒置原则 里氏代换原则 .面向对象设计原则?开闭原则 针对接口编程原则 开闭原则?扩展系统的行为时,不需要修改以前的代码,而是扩展以前的代码?针对修改关闭?针对扩展开放?提高代码的可维护性.开闭原则?扩展系统的行为时,不需要修改以前的代码,而是扩展针对接口编程原则?接口是高层的抽象 接口可以隐藏实现的细节 接口可以清晰指出对象的职责 接口是实现软件pluggable的关键 松散耦合
4、 增加重用的可能性.针对接口编程原则?接口是高层的抽象 接口可以隐藏类的单一职责原则?一个类只做一件事?一个类的职责仅仅有一个原因而发生改变?例:如一个界面展示类夹杂业务逻辑代码或者数据数据库联接代码。.类的单一职责原则?一个类只做一件事?一个类的职责仅仅有一依赖倒置原则?抽象不应该依赖于具体?具体应该依赖于抽象?抽象依赖于具体,降低了重用的可能性.依赖倒置原则?抽象不应该依赖于具体?具体应该依赖于抽象 结构化编程 面向对象的架构.结构化编程 面向对象的架构.里氏代换原则?在所有引用基类的地方,都可以用此基类的子类替换,而不影响程序原来的功能?违背里氏代换原则将给程序带来不稳定性.里氏代换原则
5、?在所有引用基类的地方,都可以用此基类的子类替class 鸟 public void 飞();class 鹦鹉 public void 学话();.c l a s s 鸟 p u b l i c v o i d 飞();c lclass 鸵鸟:鸟 public void 飞()throws(“鸵鸟不能飞”);/public void play(鸟 d)d.飞();/此处换成鸵鸟将导致错误 .c l a s s 鸵鸟:鸟 p u b l i c v o i d 飞()目标?了解面向对象设计的基本原则 了解设计模式概念及常用的设计模式了解设计模式概念及常用的设计模式 了解框架的概念及设计原则 掌握
6、设计模式的学习方法.目标?了解面向对象设计的基本原则 了解设计模式概念及设计模式?为什么使用设计模式?什么是设计模式?如何描述一个设计模式?如何选择一个设计模式?设计模式的分类.设计模式?为什么使用设计模式?什么是设计模式?为什么使用设计模式??僵化性(Rigidity):设计难以改变。脆弱性(Fragility):设计易于遭到破坏。牢固性(Immobility):设计难以重用。粘滞性(Viscosity):难以做正确的事情。不必要的复杂性(Needless Complexity):过分设计。?不必要的重复(Needless Repetition):过多的重复。?晦涩性(Opacity):混乱
7、的表达。.为什么使用设计模式??僵化性(R i g i d i t y):什么是设计模式??面向对象设计经验的总结和理论化抽象?描述了软件设计过程中经常碰到的问题及其解决方案核心。.什么是设计模式??面向对象设计经验的总结和理论化抽象?描如何描述一个设计模式??意图 别名 动机 适用性 结构 参与者?协作 效果 实现 代码示例 已知应用 相关模式.如何描述一个设计模式??意图 别名 动机 适用性如何选择一个设计模式??了解每一个设计模式所解决的问题 了解模式的静态结构 了解模式的动态结构 查看当前设计系统易变的部分.如何选择一个设计模式??了解每一个设计模式所解决的问设计模式的分类?创建者模式
8、?有关对象创建的模式?结构型模式?描述对象构造和组成的方式?行为模式?描述一组对象交互的方式.设计模式的分类?创建者模式?有关对象创建的模式?结构型创建者模式?简单工厂模式(Simple Factory)工厂方法 (Factory Method)抽象工厂 (Abstract Factory)建造者模式 (Builder)原型模式 (Prototype)单例模式 (Singleton).创建者模式?简单工厂模式(S i mp l e F a c工厂模式?封装对象(产品)的构建过程 .工厂模式?封装对象(产品)的构建过程 .一般的对象创建方式?.Noodle noodle=new Noodle()
9、;Bread bread=new Bread();Rice rice=new Rice();一般的对象创建方式?.N o o d l使用工厂创建对象 .使用工厂创建对象 .餐厅里供应的菜谱 .餐厅里供应的菜谱 .简单工厂?简单工厂-手工作坊,个体户?生产面包,米饭,面条?所有的产品都有一个大师傅制作.简单工厂?简单工厂-手工作坊,个体户?生产面包,米饭,面简单工厂示例代码 .简单工厂示例代码 .调用者代码 .调用者代码 .工厂方法?工厂方法-规模扩大,更专业 工厂和产品是平行的继承层次结构 每一种产品都有专门的大师傅制作 有面包师,面条师,米饭师.工厂方法?工厂方法-规模扩大,更专业 工厂和产
10、品是平工厂方法类图 客户端客户端Factory+create():ProductProduct具体工厂具体工厂1具体工厂具体工厂2具体产品具体产品1具体产品具体产品2.工厂方法类图 客户端F a c t o r y+c r e a t e():P抽象工厂?产品线的生产方式?提供西北系列饮食?西北面包,西北面条,西北米饭?提供东北系列饮食?东北面包,东北面条,东北米饭.抽象工厂?产品线的生产方式?提供西北系列饮食?西北面包抽象工厂类图 Factory+createProductA():ProductA+createProductB():ProductB+createProductC():Prod
11、uctCProductAProductBProductCI型具体产品型具体产品AII型具体产品型具体产品AI型具体产品型具体产品BII型具体产品型具体产品BI型具体产品型具体产品CII型具体产品型具体产品CI型产品工厂型产品工厂II型产品工厂型产品工厂.抽象工厂类图 F a c t o r y+c r e a t e P r o更好的工厂实现方法?基于反射的实现方式?采用xml或数据库保存类的配置信息?Spring的Bean工厂 .更好的工厂实现方法?基于反射的实现方式?采用x ml 或数据SpringBean工厂示例.S p r i n g B e a n 工厂示例.工厂模式的总结?简单工厂
12、模式不满足开闭原则?工厂方法模式对增加新产品支持开闭原则?抽象工厂对增加新的产品系列满足开闭原则.工厂模式的总结?简单工厂模式不满足开闭原则?工厂方法模式建造者模式?解决一个复杂对象的构造过程?一碗兰州拉面由面条,汤,肉,香菜组成 ProductBuilder+buildPartA()+buildPartB()+buildPartC()+buildPartD()+getProduct():Product具体产品具体产品具体具体Builder1具体具体Builder2.建造者模式?解决一个复杂对象的构造过程?一碗兰州拉面由面原型模式?通过复制对象的方式来创建对象?Java和.net均提供了对原型
13、模式的直接支持.原型模式?通过复制对象的方式来创建对象?J a v a 和.n e单例模式 public final class SpringBeanUtil private static SpringBeanUtil springBeanUtil=null;private SpringBeanUtil()public static SpringBeanUtil getInstanse()if(null=springBeanUtil)springBeanUtil=new SpringBeanUtil();return springBeanUtil;.单例模式 p u b l i c f i n
14、 a l c l a s s S p r i n g结构模式?适配器模式适配器模式 (Adapter)桥接模式 (Bridge)组合模式 (Composite)装饰模式 (Decorator)外观模式 (Facade)代理模式 (Proxy)亨元模式 (Flyweight).结构模式?适配器模式 (A d a p t e r)桥适配器模式?把一个类的接口转变成客户希望的接口?使原本接口不一致的类提供统一的调用接口 220V电源接口电源接口+220V()220V电源电源+220V()220电压适配器电压适配器-power:110V电源+220V()110V电源电源.适配器模式?把一个类的接口转变
15、成客户希望的接口?使原本接结构模式?适配器模式 (Adapter)桥接模式 (Bridge)组合模式组合模式 (Composite)装饰模式 (Decorator)外观模式 (Facade)代理模式 (Proxy)亨元模式 (Flyweight).结构模式?适配器模式 (A d a p t e r)桥组合模式 文件夹抽象接口文件夹抽象接口文件文件文件夹文件夹1.组合模式 文件夹抽象接口文件文件夹1.装饰模式?适配器模式 (Adapter)桥接模式 (Bridge)组合模式 (Composite)装饰模式装饰模式 (Decorator)外观模式 (Facade)代理模式 (Proxy)亨元模式
16、(Flyweight).装饰模式?适配器模式 (A d a p t e r)桥房子房子装饰模式的引入-较深层次的继承结构 白胚房子白胚房子 装了窗的房子装了窗的房子装了水电的房子装了水电的房子装了家具的房子装了家具的房子.房子装饰模式的引入-较深层次的继承结构 白胚房子 装了窗的装饰模式?代替深层的继承结构代替深层的继承结构 房子房子白胚房白胚房房子装饰器房子装饰器1装水电装水电装门窗装门窗装柜子装柜子.装饰模式?代替深层的继承结构 房子白胚房房子装示例代码 .示例代码 .结构模式?适配器模式 (Adapter)桥接模式 (Bridge)组合模式 (Composite)装饰模式 (Decora
17、tor)外观模式外观模式 (Facade)代理模式 (Proxy)亨元模式 (Flyweight).结构模式?适配器模式 (A d a p t e r)桥外观模式?外部与一个子系统的通信仅通过一个门面类进行。客人 前台接待员 市场部 财务部 销售部 系统集成部 经理办公室.外观模式?外部与一个子系统的通信仅通过一个门面类进行。客行为模式?职责链模式 (Chain of Reponsibility)命令模式 (Command)解释器模式 (Interpreter)迭代子模式 (Iterator)调停者模式 (Mediator)备忘录模式 (Memento)观察者模式观察者模式 (Observer
18、)状态模式 (State)策略模式 (Strategy)模板方法模式(Template Method)参观者模式 (Visitor).行为模式?职责链模式 (C h a观察者模式?发布-订阅 一个主题,多个观察者 主题发生变化是,多个观察者被通知 Java和.net都有默认实现.观察者模式?发布-订阅 一个主题,多个观察者 主题发示例类图 .示例类图 .示例代码 .示例代码 .行为模式?职责链模式 (Chain of Reponsibility)命令模式 (Command)解释器模式 (Interpreter)迭代子模式 (Iterator)调停者模式 (Mediator)备忘录模式 (Mem
19、ento)观察者模式 (Observer)状态模式 (State)策略模式策略模式 (Strategy)模板方法模式(Template Method)观察者模式 (Visitor).行为模式?职责链模式 (C h a策略模式?针对一组算法,定义一个公共的接口,而将算法的不同实现方式封装到单独的类中 油罐计算类油罐计算类计算体积修正系数计算体积修正系数+calculate()原油计算逻辑原油计算逻辑+calculate()成品油计算逻辑成品油计算逻辑+calculate()化工产品计算逻辑化工产品计算逻辑+calculate().策略模式?针对一组算法,定义一个公共的接口,而将算法的不同行为模式
20、?职责链模式 (Chain of Reponsibility)命令模式 (Command)解释器模式 (Interpreter)迭代子模式 (Iterator)调停者模式 (Mediator)备忘录模式 (Memento)观察者模式 (Observer)状态模式 (State)策略模式 (Strategy)模板方法模式模板方法模式(Template Method)观察者模式 (Visitor).行为模式?职责链模式 (C h a模板方法模式?在较高的抽象层次定义一组操作?定义了抽象操作之间的执行关系 报表构建报表构建+建立模板()+填充数据()+后续处理()+构建()void 构建()建立模板
21、();填充数据();后续处理();报表构建器报表构建器+建立模板()+填充数据()+后续处理()+构建().模板方法模式?在较高的抽象层次定义一组操作?定义了抽象操目标?了解面向对象设计的基本原则 了解设计模式概念及常用的设计模式 了解框架的概念及设计原则了解框架的概念及设计原则 掌握设计模式的学习方法.目标?了解面向对象设计的基本原则 了解设计模式概念及什么是框架??解决某一特定领域的问题 由一组接口和类组成 好莱坞原则:Dont call us,well call you 冻点(Frozen Spots)热点(Hot Spots)框架的重用性 框架的可扩展性.什么是框架??解决某一特定领域
22、的问题 由一组接一个优秀的框架式如何产生的 1.2.3.4.抽象(抽象很难一次实现)类的职责分配 代码的重构 重复以上步骤.一个优秀的框架式如何产生的 1.2.3.4.抽象(抽象很难一目标?了解面向对象设计的基本原则 了解设计模式概念及常用的设计模式 了解框架的概念及设计原则 掌握设计模式的学习方法掌握设计模式的学习方法.目标?了解面向对象设计的基本原则 了解设计模式概念及设计模式学习的基础?熟悉面向对象的基本概念(继承,封装,多态)?熟悉面向对象的基本原则?熟悉UML常用静态关系-泛化,组合,关联 .设计模式学习的基础?熟悉面向对象的基本概念(继承,封装,多设计模式学习的方法和原则?看成熟框
23、架的开源代码,逆向工程 实践-思考-实践-思考 一个循环上升的过程 原则?了解设计模式能解决哪些问题?不要为了模式而模式.设计模式学习的方法和原则?看成熟框架的开源代码,逆向Q&A Any question?.Q&A A n y q u e s t i o n?.参考资料?设计模式-可复用面向对象软件的基础 Gang of Four 敏捷软件开发 Robert C.Martin 企业应用架构模式 Martin Fowler 重构-改善既有代码的设计 Martin Fowler Head First Design Patterns Object Design:Roles,Responsibilities,and Collaborations UML和模式应用 Craig Larman java与模式 阎宏 JUnit A Cooks Tour? http:/en.wikipedia.org/wiki/Design_pattern_(computer_science).参考资料?设计模式-可复用面向对象软件