现在的位置: 首页 > 综合 > 正文

设计模式学习

2013年12月04日 ⁄ 综合 ⁄ 共 3516字 ⁄ 字号 评论关闭

1.目前使用的实际设计模式有:

工厂模式,门面模式(对外提供接口的时候)

 

2.设计模式分3大类:

创建(6种,3种工厂,原型Prototype,建造者Builder,单例Singleton

结构(7种)

行为(10种,Template,Memento,Observer,职责链,Command,State,Strategy,中介者Mediator,解释器Interpreter

Visitor

 

3.创建者模式里面经常使用是工厂模式,从04年接触设计模式到现在,平时在工作中只用到这个,无语了。

3.1工厂模式的形式和特定是把类的创建跟 类的使用分开,由工厂负责创建的过程,这样可以对外实现封装,同时

支持动态的扩展:要是有新的功能,只需要改工厂类即可,原有的调用代码不用改。

而创建的过程的复杂度不对外公布,这样就可以随需创建出各种各样的产品,或者一系列的产品。

 

3.2原型模式(prototype ):弄一个标准化的创建类,然后重载java.lang.Cloneable类的public Object clone()方法。

这样创建其它的类时可以这样创建:先创建一个标准类,然后拷贝一份得到一个全新的,跟原有标准类一模一样的类,

再根据需求把这个新的类稍微修改,改成需要的样子即可。

 

3.3建造者模式(builder):工厂模式的变形。

通常用在建造复杂的对象,需要一步一步的创建,如同找房子,先打地基,后砌墙,封顶,装门窗。

这样把每一步都封装成一个特定的方法,然后分别调用这些方法就可以了。至于这些方法里面是怎么弄的,外人不用管。

这样就实现了标准化,流水化的生产,当然这个模式的应用前提是流程是固定的。

 

3.4单例模式:保证独一无二的存在。

Singleton模式看起来简单,使用方法也很方便,但是用好不容易,需要对Java的类 线程 内存等概念有相当的了解。

 

4.结构模式(静态的):

一般就是把各个类包来包去的,以满足各种不同的客户,接口。

4.1门面模式:类似公司里统一的前台,或者是统一的客服号码。还有点类似于买基金,这样就不用跟几千只股票一个个去打交道,

让基金经理去帮你处理就可以了。这就是一个大包。

 

4.2 代理模式,一般用在权限过滤时。

类似于找个代理订机票,你找代理,代理再找真正的航空公司来订票。

代理的作用是加一个中间层,方便了用户,也可以进行一层过滤,他看你没钱可以不理你。

而代理都打扮成航空公司的样子(继承航空公司的接口),这你看起来还是跟航空公司打交道,这对你的操作实际没有影响。

这就是一个简包装,又像公司的经理助理,打扮得跟经理一样,而且帮你完成你需要经理完成的事情

 

4.3 Adapter(适配器)模式:跟代理模式类似。

这就是一个翻译,又像电源的适配器。这一般是在项目维护时使用,老代码已经有功能了,但是接口或者参数不满足新的要求,

就使用一个适配器类,它可以满足新的需求,然后它又可以跟旧的代码打交道。

跟代理模式不一样的是:它不一定跟装的跟旧代码一样(继承相同接口),只要它能够跟老代码打交道就可以了。

这又像你的管家,你刚接手公司,有些老的租户你不认识,让管家去跟它们打交道即可,管家可以穿的跟租户的不一样。

这也是一个简包装。

 

4.4 组合模式(Composite):用在递归处理组织机构时,例如总公司下有人力部,财务部,还有各个分公司,

分公司里面又有自己的人力部和财务部,分公司下面还有子公司,如此反复。

这就是一颗树的样子,主干上有分支,分支上有叶子或更小的分支。

为了可以能够代码复用,免得出一个分支开发一套代码。

那就这样:把主干跟分支打扮成一样(都继承相同的接口,都有add,remove,display,

分支的display方法递归调用其子分支的display方法,而叶子的display方法就显示自己

),这样客户端就可以使用一套代码来访问主干或任意一个分支或叶子。

一沙一世界,一树一菩提。

一生二,二生三,三生万物?

这是在处理递归的数据结构的方法。

 

4.5 Decorator(油漆工)模式:

跟代理模式类似,不过这样的作用是为了:客户端可以动态的增加某些功能,而且可以装饰很多层,就像穿衣服一样。

每件衣服都要跟人体结构类似,人可以穿一件衣服,再穿一件衣服,每件衣服还不用考虑其它的衣服,只要每件衣服的款式类似即可。

这样人和衣服要结构类似(都继承Component类,包含方法Operation() ),

人类有方法Operation();

装饰类既有方法Operation();还有方法setComponent();

装饰类里面的Operation()方法实际上会调用人类的Operation()方法,在调用前和调用后可以动态的加入一些动作。

这是个多重包装。

 

4.6桥Bridge模式

 

4.7Flyweight(享元),处理大量的小对象时使用,例如字处理软件里面,如果对每个字都使用一个对象的话那可能太多了,消耗内存。

在这种情况下,就可以抽取小对象的公共属性,然后只处理差异的属性就可以了。

就是先捏一个的原始模型,然后随着不同场合和环境,再产生各具特征的具体模型,很显然,在这里需要产生不同的新对象,所以Flyweight模式中常出现Factory模式.Flyweight的内部状态是用来共享的,Flyweight factory负责维护一个Flyweight pool(模式池)来存放内部状态的对象.

5.行为模式(动态)

5.1模板Template:定义一个操作中算法的骨架,将一些步骤的执行延迟到其子类中.

把公共的方法都抽取到父类中,而把独特的方法放在子类中。

使用范围:工作流

5.2备忘Memento:

memento是一个保存另外一个对象内部状态拷贝的对象.这样以后就可以将该对象恢复到原先保存的状态。

使用范围:快照形式。

5.3Observer观察者:

这是个1对多的关系,多个人观察一个对象的变化,当某个对象的状态发生变化时,会通知所有观察者,使他们可以自动更新自己。

使用场合:多个gg观察同一个mm时。

5.4 Responsibility(职责链):但接受到一个客户的请求时,如果可以处理就处理,否则沿着责任链一直往后传递

使用范围:工作流

5.5Command命令模式:

使用场所:swing的时间处理?好像不是。

将命令封装成在一个类中,然后用户(调用者)再对这个类进行操作,这就是Command模式,换句话说,本来用户(调用者)是直接调用这些命令的,如菜单上打开文档(调用者),就直接指向打开文档的代码,使用Command模式,就是在这两者之间增加一个中间者,将这种直接关系拗断,同时两者之间都隔离,基本没有关系了.

显然这样做的好处是符合封装的特性,降低耦合度,Command是将对行为进行封装的典型模式,Factory是将创建进行封装的模式,
这是设计模式一个"通病":好象喜欢将简单的问题复杂化, 喜欢在不同类中增加第三者,当然这样做有利于代码的健壮性 可维护性 还有复用性.

就是使用设计模式发现会产生很多好像是无用的代码(与业务无关)。

观察口才好的人你也会发现:他好像老在说废话,不着调,但聊天的效果很好,这是聪明人。

而不会说话的人必须有了事情才会说话,这是老实人。

 

5.6状态模式:

State模式在实际使用中比较多,适合"状态的切换".因为我们经常会使用If elseif else 进行状态切换, 如果针对状态的这样判断切换反复出现,我们就要联想到是否可以采取State模式了.

 

5.7

Strategy是属于设计模式中 对象行为型模式,主要是定义一系列的算法,把这些算法一个个封装成单独的类.

 

5.8

Mediator定义:
用一个中介对象来封装一系列关于对象交互行为.

为何使用Mediator?
各个对象之间的交互操作非常多;每个对象的行为操作都依赖彼此对方,修改一个对象的行为,同时会涉及到修改很多其他对象的行为,如果使用Mediator模式,可以使各个对象间的耦合松散,只需关心和 Mediator的关系,使多对多的关系变成了一对多的关系,可以降低系统的复杂性,提高可修改扩展性.

 

5.9

 

Interpreter定义:
定义语言的文法 ,并且建立一个解释器来解释该语言中的句子.

Interpreter似乎使用面不是很广,它描述了一个语言解释器是如何构成的,在实际应用中,我们可能很少去构造一个语言的文法.我们还是来简单的了解一下:

 

5.10

Visitor定义
作用于某个对象群中各个对象的操作. 它可以使你在不改变这些对象本身的情况下,定义作用于这些对象的新操作.

Java中,Visitor模式实际上是分离了collection结构中的元素和对这些元素进行操作的行为.

抱歉!评论已关闭.