《设计模式程序开发课件》由会员分享,可在线阅读,更多相关《设计模式程序开发课件(46页珍藏版)》请在金锄头文库上搜索。
1、我们讨论的设计模式,设计模式与面向对象的关系,面向对象设计的模式什么是面向对象设计什么是模式,“学习”设计模式有用吗?,直接学习,设计模式,一个栗子,iServer服务发布向导,如何实现?,if(第一步)thenif(第二步)thenif(第三步)thenIf(第四步并且选择了xx服务)then这样?,你猜对了!?,你猜对了!?,你猜对了!?,你猜对了!?,你猜对了!?,学挖掘机到底哪家强?,首先,程序猿吧,没对象吧,你们程序猿可以自己new 一个,找对象那么容易?,用面向对象原则分析,开闭原则修改封闭,扩展开放。分离变化的和不变的。变化的是什么不变的是什么怎么分离,不变的部分,变化的部分,变
2、化的部分,找对象的常见错误,直接翻译先入为主忽略异常,找对象的常见错误,直接翻译先入为主忽略异常,找对象的常见错误,直接翻译先入为主忽略异常,强调一下我的观点,设计模式本身是不复杂的使用设计模式,是要有对象的找对象,是要用心分析业务逻辑的,http:/ iPSE Java开发,CAS登录和QQ登录的过程几乎是一样的iServer自己实现的QQ登录VSshiro自己扩展实现的CAS登录,For 其他Java Web开发,shiro-web和shiro-core什么关系如果不使用shiro-web只使用shiro-core如何实现web应用安全你的代码与shiro-web相比有哪些不足,http:
3、/shiro.apache.org/,设计模式与面向对象有关系吗?,设计模式,是针对特定问题使用面向对象设计原则对业务逻辑进行抽象的参考。,学面向对象有用吗,如果面向对象有用还要软件工程干啥,业务逻辑中的魔鬼,class XXXComponent void setConfigDirectory(String path);,业务逻辑中的魔鬼,请输入xx路径:,浏览,这多简单,就是读取配置显示出来,输入配置保存嘛。搞个界面按照产品经理的要求把风格调好看点,还搞个浏览按钮让用户直接选择不用手动输入路径真贴心,用户体验好。获取之前保存的目录显示在界面上。接受用户输入的值,检查下正确性保存用户输入的值调
4、用XXXComponent .setConfigDirectory代码好简单了,2小时搞定,就是调界面上的css可能要费点时间,./config/XXdir,业务逻辑中的魔鬼,产品经理:界面上显示的相对目录,用户不知道绝对路径,要在界面上显示绝对路径。某程序猿:简单,把系统配置根目录传到前端,在前端拼接下字符串就ok了,业务逻辑中的魔鬼,产品经理:有用户觉得显示绝对路径不安全,需要增加一个securityPath配置,如果设置为true,绝对路径也要显示成先对路径,或者隐藏只显示一部分。某程序猿:简单,读取配置后根据securityPath的设置转换一下路径。,业务逻辑中的魔鬼,产品经理:XX
5、XComponent需要支持从数据库读取配置某程序猿:简单,数据库连接字符串里有特殊符号,在XXXComponent .setConfigDirectory里判断一下,如果是数据库连接字符串就从数据库读。,业务逻辑中的魔鬼,产品经理:用户修改了配置之后要把原来保存的数据迁移到新的位置某程序猿:简单,在XXXComponent .setConfigDirectory里,魔鬼养成!,某程序员:WhatFuck!这一堆代码都是干啥的配置相关逻辑分散得到处都是还前后端都有!XXXComponent为什么要负责读取配置,还分别读取数据库的和文件型的。说好的单职原则了!,面向对象能阻止这个魔鬼吗?设计模式
6、能阻止这个魔鬼吗?离了业务逻辑谈设计,都是扯淡。,Visitor模式,专治else if强迫症If(geometry instanceOf GeometryA) . else if (geometry instanceOf GeometryB) else if(geometry instanceOf GeometryC) else ,Visitor模式,Interface GeometryVisitor void visit(GeometryA geo);void visit(GeometryB geo);void visit(GeometryC geo);class Geometry abs
7、tract void accept(GeometryVisitory visitor);,Visitor模式,class GeometryA extends Geometryvoid accept(GeometryVisitor visitor) visitor.visit(this); class GeometryB extends Geometry void accept(GeometryVisitor visitor) visitor.visit(this);,Visitor模式,class MyVisitor implements GeometryVisitor public void visit(GeometryA geo) ;public void visit(GeometryB geo) ;public void visit(GeometryC geo) ;,