设计模式快速学习(一)
UML类图
简单工厂模式
1.1类图
策略模式
2.1策略模式结构图
2.2策略模式解析
策略模式时一种定义一系列算法的方法,从概念上看,所有这些算法完成的算法都是相同的工作,只是实现不同,他们可以以相同的方式调用所有的算法,减少了各种算法类与使用算法类之间的耦合。
策略模式的Strategy类层次为Context定义了一些列可供重用的算法或行为。继承有助于吸取出这些算法中的公共功能。
策略模式的有点时简化了单元测试,因为每个算法都有自己的类,可以通过自己的接口单独测试。
当不同的行为堆砌在一个类中时,就很难避免使用条件语句来选择合适的行为。将这些行为封装在一个个单独的Strategy类中,可以在使用这些行为的类中消除条件语句。
策略模式是哟过来封装算法的,但是在时间中,我们发现可以用它来封装几乎任何的类型规则,只要在分析过程中挺好需要在不同时间应用不同的业务规则,就可以考虑策略模式处理这种变化的可能性。
单一职责原则
3.1What?
单一职责原则就是一个类而言,应该仅有一个引起它变化的原因。
3.2why?
如果一个类承担的职责过多,就等于把这些职责耦合在一个,一个职责的变化可能会消弱或者抑制这个类完成其他的职责的能力。这种欧冠耦合会导致脆弱的设计,当变化发生时,设计就会遭受到意想不到的破坏。
软件设计真正要做的许多内容,就是发现职责并把那些职责相互分离。如果你能够想到多于一个动机去改变一个类,那么这个类就多余一个的职责。
开放封闭原则
4.1what?
开放-封闭原则,就是说软件实体(类、模块、函数等等)应该是可以扩展,但是不可以修改的。
4.2why?
这个原则其实就是两个特征,一个是说“对于亏咱是开放的”,另一个是说“对于更改是封闭的”。
怎样的设计才能面对需求的改变却可以保持相对稳定,从而使得系统可以在一个版本后保持不断推出新的版本呢?开放-封闭原则给了我们答案。
无论模块是多么“封闭”,都会存在一些无法对之封闭的变化。既然不可能完全封闭,设计人员必须对于他设计的模块应该对哪种变化封闭做出选择。他必须先猜测出最可能发生的变化种类,然后构造抽象对象来隔离他们的变化。
面对需求,对程序的改动是通过增加代码进行的,而不是改动现有的代码。
开放-封闭原则是面向对象设计的核心所在。遵循这个原则可以带来面向对象所声称的巨大好处,也就是可维护、可扩展、可复用、灵活性好。开发人员应该对程序中呈现出频繁变化的那写部分做出抽象,然而,对应用程序中的每个部分都刻意地进行抽象也不是一个好主意。拒绝不成熟的抽象和抽象本身一样重要。
依赖倒转原则
5.1what?
依赖倒转原则:
A. 高层模块不应依赖底层模块。这两个都应该依赖抽象。
B. 抽象以应该依赖细节。细节应该依赖抽象。
5.2why?
针对接口编程,不要对实现编程。
依赖倒转其实可以说是面向对象设计的标志,用那种语言来编程并不重要,如果编写时考虑的都是如何针对抽象编程而不是针对细节编程,即程序中所有依赖都终止于抽象类或者接口,那就是面向对象的设计,反之就是过程化的设计了。
里氏替换原则
5.1what?
里氏替换原则:子类必须能替换掉他们的父类。
5.2why?
一个软件尸体如果使用的是一个父类的话,那么一定适用于其之类。二且它察觉不出父类对象和子类对象的区别。
也就是说,在软甲那里面,父类都替换成它子类,程序的行为没有变化。
只有当子类可以替换掉父类,软件的单位功能不受影响时,父类才能真正被服用,二子类也能在父类的基础上增加新的行为。
装饰模式
6.1装饰模式结构图
6.2装饰模式解析
装饰模式:动态地给一个对象填加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活。
装饰模式是为已有功能动态地添加更多更能的一种方式。当系统需要新的功能的时候,时向就的类中添加新的代码。这些新加的代码通常装饰了原有类的核心职责或者主要行为。在主要中家兔新的字段,新的方法和新的逻辑。从而增加了主类的复杂度。而这些新加入的东西仅仅是为了满足一些只在某种特定情况下才会执行的类中,并让这个类包装他所需要装饰的对象,因此,当需要执行特殊的行为时,客户代码就可以运行时根据需要有选择地,按顺序地使用装饰功能包装对象了。
把类中装饰功能从类中搬移出去,这样就可以简化原有的类。有效地把核心职责和装饰功能区分开了而且可以去除相关类中重复的装饰逻辑。
代理模式
7.1代理模式结构图
7.2代理模式解析
远程代理,也就是为一个对象在不同的地址空间提供局部代表。这样可以吟唱一个对下个存在于不同地址空间的事实。
虚拟代理,是根据需要创建开销很大的对象。通过它来存放实力化需要很长时间的真实对象。
安全代理,使用控制真是的访问对象访问时的权限。智能指引,时值当调用真实的对象时,代理处理另外一些事情。
工厂方法模式
8.1工厂方法模式结构图
8.2工厂方法解析
工厂方法模式实现时,客户端需要决定实例化哪一个工厂来实现运算类,选择判断的问题还是存在的,也就是说,工厂方法把简单工厂的内部逻辑转移到了客户端代码来进行。你想要加功能,本来时要该工厂的,现在需要修改客户端。