1.将软件与设计模式比拟为城市与建筑模式,那么在面向对象的解决方案里,我们将对象和接口看成墙壁和门窗,模式的核心在于提供了相关问题的解决方案。
在软件设计中可能会遇到很多类似的问题,在每次遇到类似问题时我们不必全都新想办法来解决,而可以复用之前解决类似问题的方案,解决问题多之后就会有针对特定问题有特定(相对固定)的方式方法来解决,这相对固定的方式方法就是设计模式,其也算是经验总结。
开篇有两种在设计模式书籍里面很重要的表格和关系图,分别描述了各设计模式设计支持的可变方面以及各个设计模式之间的关系,具体如下:
2.一般来讲,模式有四个基本要素:模式名称(pattern name),问题(problem),解决方案(solution),效果(consequences)。
3.设计模式确定了所包含的类和实例,他们的角色,协作方式以及职责分配。
4.经典的MVC模式主要用到了Observer,Composite和Strategy三种设计模式。
MVC包括三类对象,模型Model是应用对象,视图View是它在屏幕上的表示,控制器Controller定义用户界面对用户输入的响应方式
5.一般容易导致软件重新设计的原因,在软件设计初期就应该注意在这些情况下采用一些设计模式来使得软件松耦合,能够较为容易的进行修改和扩展,总之让软件更加灵活,后期维护和扩充起来比较方便。
1) 通过显示地指定一个类来创建对象。
Abstract Factory,Factory Method, Prototype
2) 对特殊操作的依赖
Chain of Responsibility,Command
3) 对硬件和软件平台的依赖
Abstract Factory, Bridge
4) 对对象表示或实现的依赖
Abstract Factory, Bridge, Memento,Proxy
5) 算法依赖
Builder,Iterator,Strategy,Template Method,Visitor
6) 紧耦合
Abstract Factory, Command, Facade, Mediator,Observer,Chain of Responsibility
7) 通过生成子类来扩充功能
Bridge, Chain of Responsibility,Composite,Decorator,Observer,Strategy
8) 不能方便的对类进行修改
Adapter,Decorator,Visitor
Singleton, 单例模式可以保证在系统中仅有一个该“产品”的实例,其它对象可以迅速的访问它而不需要求助与全局变量或者函数。单例模式同样使得“产品”易于扩展或替换,且不需要修改已有的代码。保证一个类仅有一个实例,并提供一个访问它的全局访问点。
一个很好的能够让一个类只有一个实例并且这个实例易于被访问的方法是让类自身负责保存它的唯一实例,这个类可以保证没有其它实例可以被创建(通过截取创建新对象的请求),并且它可以提供一个访问该实例的方法,这就是Singleton模式。
既然要控制从外部直接实例化该类的对象,就需要在类的构造器上控制实例化权限,通过private,protected修饰限制外部的实例化请求。
创建型设计模式间的区别:
1) Abstract Factory与Builder都可以创建复杂对象,主要区别是Builder模式着重于一步步构造一个复杂对象,而Abstract Factory着重于多个系列的产品对象(简单的或者复杂的)。Builder在最后的一步返回产品对象,而Abstract Factory则是立即返回的。Composite通常是用Builder生成的。
2) Abstract Factory经常使用工厂方法来实现,工厂方法通常在Template Method中被调用。
行为模式之间的区别与联系
1) 职责链常与Composite一起使用,这种情况下,一个构件的父构件可作为它的后继。
2) Composite模式可被用来实现宏命令。Memento模式可用来保持某个状态,命令用这一状态来取消它的效果。在被放入历史列表前必须被拷贝的命令起到一种原型的作用。
3) 抽象语法树是一个复合模式(Composite)的实例;FlyWeight模式说明了如何在抽象语法树中共享终结符;解释器可用一个迭代器(Iterator)遍历该抽象语法书结构;Visitor可用来在一个类中维护抽象语法树中的各节点的行为。
4) 迭代器常被应用到像复合(Composite)这样的递归结构上;多态迭代器靠Factory Method来实例化适当的迭代器子类;Memento常与迭代器模式一起使用,迭代器可使用一个Memento对象来捕获一个迭代的状态。迭代器在其内部存储memento.
5) Facade与中介者的不同之处在于它是对一个对象子系统进行抽象,从而提供了一个更为方便的接口。它的协议是单向的,即Facade对象对这个子系统类提出请求,但反之则不行。相反,Mediator提供了各Collegue对象不支持或者不能支持的协作行为,而且协议是多向的。
6) 命令模式可使用备忘录(Memento)来为可撤消的操作维护状态;备忘录可用于迭代模式。
7) 通过封装复杂的更新语义,ChangeManager充当目标和观察者之间的中介者(Mediator模式)。ChangeManager可以使用Singleton模式来保证它是唯一的并且是可全局访问的。
8) 状态对象(State)通常是Singleton的。FlyWeight模式解释了何时以及怎样共享状态对象。
9) Strategy对象经常是很好的轻量级对象(flyWeight)
10) Factory Method模式常被模板方法调用。模板方法使用继承来改变算法的一部分。Strategy使用委托来改变整个算法。
11) 访问者可以用于对一个由Composite模式定义的对象结构进行操作。访问者可以用于解释。
12) 一个Strategy对象封装一个算法。一个State对象封装一个与状态相关的行为。一个Mediator对象封装对象间的协议。一个Iterator对象封装访问和遍历一个聚集对象中的各个构件的方法
一、设计模式的分类
总体来说设计模式分为三大类:
创建型模式共五种:单例模式、工厂方法模式、抽象工厂模式、建造者模式、原型模式。
结构型模式共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。
行为型模式共十一种:策略模式、模板方法模式、观察者模式、迭代器模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。
其实还有两类:并发型模式和线程池模式。用一个图片来整体描述一下:
二、设计模式的六大原则
总原则:开闭原则(Open Close Principle)
开闭原则就是说对扩展开放,对修改关闭。在程序需要进行拓展的时候,不能去修改原有的代码,而是要扩展原有代码,实现一个热插拔的效果。所以一句话概括就是:为了使程序的扩展性好,易于维护和升级。想要达到这样的效果,我们需要使用接口和抽象类等,后面的具体设计中我们会提到这点。
1、单一职责原则
不要存在多于一个导致类变更的原因,也就是说每个类应该实现单一的职责,如若不然,就应该把类拆分。
2、里氏替换原则(Liskov Substitution Principle)
里氏代换原则(Liskov Substitution Principle LSP)面向对象设计的基本原则之一。 里氏代换原则中说,任何基类可以出现的地方,子类一定可以出现。 LSP是继承复用的基石,只有当衍生类可以替换掉基类,软件单位的功能不受到影响时,基类才能真正被复用,而衍生类也能够在基类的基础上增加新的行为。里氏代换原则是对“开-闭”原则的补充。实现“开-闭”原则的关键步骤就是抽象化。而基类与子类的继承关系就是抽象化的具体实现,所以里氏代换原则是对实现抽象化的具体步骤的规范。
里氏替换原则中,子类对父类的方法尽量不要重写和重载。因为父类代表了定义好的结构,通过这个规范的接口与外界交互,子类不应该随便破坏它。
3、依赖倒置原则(Dependence Inversion Principle)
这个是开闭原则的基础,具体内容:面向接口编程,依赖于抽象而不依赖于具体。写代码时用到具体类时,不与具体类交互,而与具体类的上层接口交互。
4、接口隔离原则(Interface Segregation Principle)
这个原则的意思是:每个接口中不存在子类用不到却必须实现的方法,如果不然,就要将接口拆分。使用多个隔离的接口,比使用单个接口(多个接口方法集合到一个的接口)要好。
5、迪米特法则(最少知道原则)(Demeter Principle)
就是说:一个类对自己依赖的类知道的越少越好。也就是说无论被依赖的类多么复杂,都应该将逻辑封装在方法的内部,通过public方法提供给外部。这样当被依赖的类变化时,才能最小的影响该类。
最少知道原则的另一个表达方式是:只与直接的朋友通信。类之间只要有耦合关系,就叫朋友关系。耦合分为依赖、关联、聚合、组合等。我们称出现为成员变量、方法参数、方法返回值中的类为直接朋友。局部变量、临时变量则不是直接的朋友。我们要求陌生的类不要作为局部变量出现在类中。
6、合成复用原则(Composite Reuse Principle)
原则是尽量首先使用合成/聚合的方式,而不是使用继
三、关系模式(11种)
先来张图,看看这11中模式的关系:
第一类:通过父类与子类的关系进行实现。
第二类:两个类之间。
第三类:类的状态。
第四类:通过中间类
四、为什么23种设计模式里面没有MVC?
MVC的是为了把数据(Model)和视图(View)分离开来,然后用控制器(Controller)来粘合M和V之间的关系。
MVC是观察者模式(Observer), 策略模式(Strategy)和组合模式(Composite)三个设计模式的演变.
软件工程中有23种经典设计模式,一般将之分为3类:创建型、结构型、行为型。创建型还比较好理解,但是结构型和行为型的划分则有些疑惑。
结构型包含:Proxy、Adapter、Decorator、Bridge、Composite、Facade、Flyweight。
行为型包含:Iterator、Observer、Strategy、Template Method 、Command、Mediator、Memento、InterpreterState、ChainofResponsibility、Visitor。
学习之余,休息一下,关注