Java基础之《设计模式》

设计模式

一、ChainOfResponsibility

责任链模式

责任链的作用:
理解tomcat filter
理解struts2 interceptor

1. 什么是过滤器连
Java基础之《设计模式》_第1张图片
当多个过滤器组合在一起的时候,就组成了一个过滤器链

我们对于信息的拦截就组成了一个链条,这个链条上的东西我们可以来回的组装,如果能写在配置文件里那就更爽了

2. 两个链条之间也可以任意的组合
在每条过滤器链内部定义doFilter调用自己链里的过滤器

3. 既可以过滤客户端发往服务器的消息,也可以过滤服务器发往客户端的消息
既处理过去的消息,也处理回来的消息
使用递归调用,filter调用另一个filter

4.
在Java web servlet里面有Filter接口,它有doFilter方法
doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
它处理的是servlet的request和response
原理:在doFilter里调用FilterChain里的下一个Filter

5. 责任链例子程序
http://pan.baidu.com/s/1jHZeRuI
如何让一个过滤器请求和应答有不同的过滤处理,在Filter里调用FilterChain的doFilter方法

二、Thinking in OO

1. 谈谈工具
思想是战略高度的东西
  永远不变的东西
工具是战术高度的东西
工具的学习:
敢用
勤用

2、项目背景
《东北人都是活雷锋》
老张开车去东北

eclipse如何切换workspace,File - Switch Workspace

面向对象思维的三个点:封装、继承、多态

OO思维(Object Oriented)
考虑类
  名词
属性
  不可脱离具体的应用环境
方法
类之间的关系
隐藏(封装)
  降低耦合度
继承
  什么什么是一种什么什么
  继承关系因为耦合度非常强,应该谨慎使用
多态
  有继承,有重写,父类的引用指向子类的对象
  核心中的核心
  可扩展性(Extensibility)
    是添加而不是修改

接口的作用:
一是实现多重继承,因为java是单根语言。
二是便于实现各种框架,java 的各种框架中,都是拿接口调来调去。一旦你实现了这个接口,你的代码就嵌入了框架。
三是为了实现前面各位说的规范。

注意:
设计没有绝对的对与错
Over Design也是一种罪过(过度设计)
没有任何实际中的设计会一步到位
初学者不要考虑太多的原则和条条框框,最重要是动手写

参加工作:
工期是第一位的

三、设计模式之Iterator(容器与容器的遍历)

1、Iterator迭代
1)请自己手动写一个可以动态添加对象的容器
2)考虑容器的可替换性
  通过定义接口,使集合类都实现相同的接口
  针对接口编程,可以不考虑具体的实现类是什么(面向接口编程)
  如果把创建对象放在配置文件中,那就代码都不用改了

2、
当你写一个组件的时候,接口应该定的越细越好,而不要把所有内容放在一个接口里
接口隔离原则,只需要找到跟你相关的东西

3、例子程序
http://pan.baidu.com/s/1jIExyIy

四、设计模式之Strategy

抽丝剥茧策略模式
C&C接口详细解析
(Comparable & Comparator)

1、排序口诀:
冒择路(插入)兮(希尔)快归堆
冒泡
选择
插入
希尔
快速
归并
堆排序

2、对int类型进行排序,写好了。又要求对Cat类型进行排序,再写一个。
如果又要求对Dog类型进行排序怎么办?更过分的如果排序功能要重用,对所有对象都能排序?

如何对不同的对象进行排序?
定义Comparable接口
里面有compateTo方法

如果实现了Comparable接口的那个类的对象,和其他对象做比较的时候,返回值大于0就是原对象大,
小于0就是被比较的对象大,等于0两个对象相等

3、Comparable接口作用
定义这个接口:
为了这个类能不能比较大小
为了我们写的算法能够重复使用

4、面向接口编程
每个类内部对这个接口的功能自己定义
在外部调用时,我们写好的排序方法、遍历方法,从今以后再也不用变了

我们现在猫比较大小是用height来比较,如果以后猫还可以用weight来比较?或用尾巴的长度来比较大小怎么办?
实现不了,因为实现了Comparable接口后只能写一种比较实现。

5、能够灵活的指定我们的对象谁大谁小
定义Comparator比较器接口
里面有compare方法,然后由具体实现了这个接口的类来定义这两个对象谁大谁小,通过传入不同的比较器可以灵活的做比较

两者结合起来,类实现Comparable接口,在实现compareTo方法里不写具体的比较逻辑
(否则只能写一种比较方法),而是交给(比较器)所使用的具体的不同的比较策略


6、
java.util.Arrays.sort  封装了一系列排序的方法,只要实现了Comparable接口就好了

7、策略模式
当我进行比较大小的时候,我定义一个策略的比较器,然后由具体的比较策略来决定到底谁大谁小

8、作业
封装一下商场的打折策略
封装一下坦克的打炮弹的策略

9、例子程序
http://pan.baidu.com/s/1nuFxS5F

五、动态代理-你不必知道我存在

1、动态代理的作用:
理解Spring的AOP

马士兵语录:
像这类的问题才是值得你研究的问题,为什么,因为这类的问题你研究完了一次之后这辈子他都不会产生变化

2、假设:
初步具备面向对象的设计思维
了解多态的概念
大致了解反射

3、
Tank类有个move方法,我想要计算move方法里面的执行时间,Tank类只有Class文件?
继承
1)创建Tank2类,继承Tank类,重写move方法,用继承来实现在原来方法前后加一些逻辑
聚合
2)创建Tank3类,继承moveable接口,里面有Tank类的对象,调用move方法
聚合有一个特点,代理对象与被代理对象实现同一个接口

聚合是一种静态代理,代理类是写死的,现在要写一个通用的代理类,它可以对任意的对象做代理,任何的方法都可以计算时间?
假设被代理的对象都实现了某个接口,代理的时候是根据接口来生成代理对象的(Spring也是这样)
PS:Spring也可以继承一个类,来代理,不推荐

4、如何创建代理类?
动态代理不用再看到这个代理类的名字了,你要的代理对象我直接给你产生

动态编译:
JDK6 Complier API
CGLib(直接生成二进制文件)
ASM(直接生成二进制文件)

1)动态编译生成二进制文件
2)加载二进制文件(load)到内存
3)反射获得类的构造方法和它的返回值,创建对象
4)反射遍历类的对象,获取Method列表,实现相应接口
5)调用构造方法
6)调用成员方法
7)销毁对象

5、在代理类内如何实现添加的逻辑?
现在对代理接口的实现方法是写死的,这个是不行的
当我在代理写这个方法的时候,方法执行的过程由我们来指定

创建代理对象的时候,传入一个接口,再传入一个(invocationHandler)处理器

猜测:
原来程序是一条线,现在我要在中间插入自己的逻辑,就像是在当中切一刀
用代理类代理原来的方法,在代理类外面增加自己的逻辑?
1)定义自己的处理器接口
2)定义好你想对哪个对象进行代理
3)定义好实现这个处理器接口的类
4)当实现处理器接口里方法的时候加自己的逻辑
5)对被代理对象调原来的方法

6、
Tank类,实现Moveable接口,它有个Move方法
InvocationHandler接口,内定义invoke方法
我写一个自己的代理逻辑处理类继承InvocationHandler接口
把代理对象保存到处理的逻辑类里面去
在代理逻辑处理类里面加自己的逻辑,调用被代理对象的方法
调完了之后,加后面的逻辑

好处:可以对任意的对象、任意的接口方法,实现任意的代理!!!
不用修改原来的实现的代码,就能够在原来的基础之上插入一些内容

7、aspect oriented programming
AOP:面向切面编程,不影响原来的逻辑,可插拔,可叠加

8、
中级程序员需要有j2ee + 设计方面的经验

参考资料:
http://www.cnblogs.com/xiaoluo501395377/p/3383130.html

六、设计模式之工厂系列

理解Spring的Bean工厂

1、只给司机一辆车
工厂自主生产自己的产品,而不是依赖new
原来是交给别人直接new,现在是通过我自己的定义方法返回给它

这里面蕴含两个模式:
单例模式,从始至终就只有一个Car实例
静态工厂模式,把getInstance称之为静态工厂方法

任何方法,只要它在里面控制了产生对象的逻辑,都可以称之为工厂相关的方法

如果建立一个静态容器里面全是Car,静态方法初始化,需要用的时候从里面拿一个出来,这个叫多例(JDBC的连接池)

2、任意定制交通工具的类型和生产过程
我们不仅可以产生新的交通工具,而且还可以控制新的交通工具的生产过程

用了简单工厂这种模式,我们不仅可以控制产生新的交通工具,而且可以控制产生新的交通工具的生产过程
如果new BroomFactory()放在配置文件里,那么代码改都不要改,光改配置文件就可以了

3、(抽象工厂)系列产品(车、武器、食品补给...)
1)
假设它手里控制的产品非常多,需要一系列产品的随时替换,这该怎么办呢?

要产生一个工厂的父类,定义一个抽象工厂类,各个工厂类继承这个抽象工厂,实现它定义的抽象方法,产生自己所需要的对象

好处在于:当你想整体的替换掉这一系列产品的时候,你只需要把一系列产品造出来,对应的工厂造出来,同时换到这个工厂就可以了
Java基础之《设计模式》_第2张图片

2)
换皮肤功能是不是很类似于抽象工厂

3)
抽象工厂和普通的工厂相比,哪方面是长处,哪方面是短处?
对于普通工厂,我们可以扩展产品,当产品系列扩充的时候
工厂类也会越来越多(一个产品一个工厂类,工厂泛滥)

抽象工厂可以生产多个产品系列,但是增加产品品种时要动抽象类
原来实现这个抽象类的工厂类都要加上新的方法

4、bean工厂
1)基于接口的类型任意定制
2)一定程度的生产过程定制(AOP)

spring的想法是写到配置文件里

5、如何学习spring:
1)下载spring-framework-3.2.18.RELEASE.zip
2)创建Java Project
3)Build Path - Add External Archives,把spring-framework-3.2.18.RELEASE\libs下的Jar包全加进去
4)找配置文件,打开spring文档,搜把它copy下来,放在src里面,new一个新的file:applicationContext.xml
5)applicationContext.xml里面定义的bean是具体Class对象的类型
 
 

这样的定义是不是很类似于v=com.bjsxt.spring.factory.Car
原来是我们到配置文件里自己读,现在是spring来帮我们读
6)BeanFactory是产生Java Bean的工厂,产生Java对象的工厂
这里是从xml文件读取,用BeanFactory的子类ClassPathXmlApplicationContext来获取配置
然后调用它的getBean()方法
7)运行时它还需要org/apache/commons/logging/LogFactory类,网上下载并引入
8)spring用起来,改配置文件就能生成不同的类,叫Bean容器、Bean工厂、或者叫面向接口编程
面向抽象编程,而不是面向具体,具体的这些东西请你写在配置文件里
9)spring入门例子程序
http://pan.baidu.com/s/1hsI8GkO

6、Java解析Xml之JDOM
https://www.ibm.com/developerworks/cn/xml/x-jdom/

关于文件的读取,建议不要用绝对路径,因为文件将来可能会挪到别的位置
永远建议把各种配置文件都写在class path里面


7、spring是一个bean容器
因为它会把配置文件里的所有bean信息全都保存在一个map里面

8、bean工厂&JDOM例子程序
http://pan.baidu.com/s/1nvHdblR

七、追美眉的技术

培养happy学习方式

马士兵语录:
你想吸引一个女孩,追美眉的最高境界,不是你死机白咧的去追她,而是让她来死机白咧的来追你
你要让她死机白咧的来追你,你不能成为一根黄瓜,为什么呀?黄瓜是百搭菜,怎么着吃都行,不过呢菜里没了它也没什么关系
所以这个叫没味,与其做黄瓜不如做芥末,你要有个性一定要有个性到极致

追美眉最核心的,锻炼好你自己的素质,让你对其他人有吸引力

1、
例程
Command模式
Bridge模式
State模式

探讨
Mediator
Facade
Adapter

2、bridge模式

马士兵语录:
做什么事情都要讲究道和术,要追美眉的原则性的问题应该是什么呢?在道这个层面上
那就是不追到手绝不罢休(开玩笑)

送别人东西的时候,最关键的不是说这个东西值多少钱,你送她只要她喜欢她高兴就够了

美眉喜欢的是花花公子的手段,而不是花花公子本人

1)Gift这个父类在往子类发展上,有两个方向的维度,这是bridge的核心
一种是具体的礼物,一种是类型上的划分,你会发现这两个维度会有交叉

桥接模式既支持在第一个维度的扩展,也支持在第二个维度的扩展

3、adapter模式
Java基础之《设计模式》_第3张图片
适配器模式:就是一个转换器
JDBC-ODBC bridge
java.io的设计模式?
  inputStreamReader

4、Commond模式
在最原始的那23种设计模式里,Commond模式主要实现unDo功能
现在是来了一个请求,我交给一个任务去处理,就是Commond模式

马士兵语录:
美眉说我好冷啊,你一定要知道好冷的意思是什么

5、State模式
一个类的动作是根据这个类的内部状态,它的不同而不同

马士兵语录:
工作上第一件事情是先把功能完成,然后再来考虑怎样重构

6、Mediator模式
双方都一个中介者交流,在系统某个模块的内部作为调停者来调停类和类之间的关系,或者对象和对象的关系

7、Facade模式
门面模式,SLF4J

八、其他

马士兵语录:
1)先写测试程序,再写实现 -- 极限编程
2)学东西一定要记住了,先学脉络再学细节
3)Java工作流 JBPM
4)越难的东西,越不容易搞定的东西,应该越有价值
5)要想学的happy,重点放在写项目上,写着写着成就感就出来了
6)应用驱动学习,用到什么了它就会驱动你去学什么
7)一个程序员将来的发展,技术并不是最重要的,你和人打交道是少不了的,写底层和机器打交道,和机器打交道对你的长远发展有什么意思呢。和人打交道,和客户打交道,和业务逻辑打交道(纯技术的人员没有什么前途)
8)你想吸引一个女孩,追美眉的最高境界,不是你死机白咧的去追她,而是让她来死机白咧的来追你
你要让她死机白咧的来追你,你不能成为一根黄瓜,为什么呀?黄瓜是百搭菜,怎么着吃都行,不过呢菜里没了它也没什么关系
所以这个叫没味,与其做黄瓜不如做芥末,你要有个性一定要有个性到极致
9)做什么事情都要讲究道和术,要追美眉的原则性的问题应该是什么呢?在道这个层面上
那就是不追到手绝不罢休(开玩笑)
送别人东西的时候,最关键的不是说这个东西值多少钱,你送她只要她喜欢她高兴就够了
美眉喜欢的是花花公子的手段,而不是花花公子本人
10)美眉说我好冷啊,你一定要知道好冷的意思是什么
11)工作上第一件事情是先把功能完成,然后再来考虑怎样重构
12)设计模式往往是在语义上的区分,而并不是语法上的区分

eclipse快捷键:
ctrl + 1:在没有的情况下,用eclipse创建类和方法
ctrl + shift + o:导入被引用的jar包

你可能感兴趣的:(JAVA基础)