设计模式
2019-08-29 12:02:24 46 举报
AI智能生成
设计模式
作者其他创作
大纲/内容
原则
单一
划分类的职责
里氏替换
所有引用基类的地方必须能透明地使用其子类的对象
父类能出现的地方子类就可以出现,而且替换为子类也不会产生任何错误或异常。
依赖倒置
高层模块不应该依赖底层模块,两者都应该依赖其抽象。
抽象不应该依赖细节
细节应该依赖抽象
面向接口编程
接口隔离原则
类间的依赖应该建立在最小的接口上
单一职责要求的是类和接口职责单一,注重的是职责,这是业务逻辑的划分,而接口隔离原则要求接口的方法尽量少。
迪米特法则
一个对象应该对其他对象有最少的了解
类间解耦
一个类应该对自己需要耦合或调用的类知道得最少
出现在成员变量、方法的输入输出参数中类成员朋友类,而出现方法内部的类不属于朋友类
错误:
方法体是类的行为,类竟然不知自己行为与其他类产生依赖关系,这是不允许,违反迪米特法则
开闭
软件实体应该对扩展开放,对修改关闭
创建型模式
单例
某个类只能生成一个实例,该类提供一个全局访问点供外部获取该实例,其拓展是有限多例模式
原型
将一个对象作为原型,通过对其进行复制而克隆出多个和原型类似的新实例。
工厂方法
定义一个用于创建产品的接口,由子类决定生产什么产品
抽象工厂
提供一个创建产品族的接口,其每个子类可以生产一系列相关的产品。
建造者
将一个复杂对象分解成多个相对简单的部分。然后根据不同需要分别创建它们,最后构建成复杂对象。
结构型模型
适配器
类的适配器模式
对象的适配模式
装饰模式
允许向一个对象添加新的功能,同时又不改变其结构。
作为现有类的一个包装
主要解决
一般的,我们为了扩展一个类经常使用继承的方式实现,由于继承为类引入静态特征,并随着扩展功能的增多,子类会很膨胀、
优点
装饰类和被装饰类可以独立发展,不会相互耦合,装饰模式是继承一个替代模式,装饰模式可以动态扩展一个实现类
缺点
多层装饰比较复杂
代理模型
一个类代表另一个类的功能,为其他对象提供一种代理以控制对这个对象的访问。
优点
职责清晰。高扩展性。智能化。
缺点
由于在客户端和真实主题之间增加了代理对象,因此有些类型的代理模式可能会造成请求处理速度变慢。
实现代理模式需要额外的工作,有些代理模式实现非常复杂。
外观模型
隐藏系统的复杂性,并像客户端提供了一个客户端可以访问系统的接口。向现有的系统添加一个接口,隐藏系统的复杂性。
优点:减少系统相互依赖。提高灵活性。提高了安全性。
缺点:不符合开闭原则,如果要改东西很麻烦,继承重写都不适合。
桥接模型
是用于把抽象化与实现化解耦,使二者可以独立变化。
解决:把这种多角度分类分离出来,让它们独立变化,减少它们之间耦合。
优点:
1.抽象和实现分离
2.优秀的扩展能力
3.实现细节对客户透明
缺点:
桥接模式的引入会增加系统的理解与设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计与编程
组合模型
用于把一组相似的对象当做一个单一的对象。组合模式依据树形结构组合对象,用来表示部分以及整体层次。这种类型设计模式属于结构型模式,它创建了对象组的树形结构。
优点:高层模块调用简单。节点自由增加。
缺点:在使用组合模式时,其叶子和树枝的声明都是实现类,而不是接口,违反了依赖倒置原则
享元模式
主要用于减少创建对象的数量,以减少内存占用和提高性能。减少对象数量从而改善应用所需的对象结构方式。
主要解决:
在有大量对象时,有可能造成内存溢出,我们把其中共同的部分抽象出来,如果有相同的业务请求,直接返回内存中已有的对象,避免重新创建。
优点
大大减少对象创建,降低系统的内存,使效率提高。
缺点
提高了系统的复杂度,需要分离出外部状态和内部状态,而且外部状态具有固有化的性质,不应该随着内部状态变化而变化,否则会造成系统的混乱。
过滤器模式/标准模式
这种模式允许开发人员使用不同的标准来过滤一组对象,通过逻辑运算以解耦方式把它们连接起来。
接口的适配器模式
作为两个不兼容的接口之间的桥梁
主要解决在软件系统中,常常要将一些“现存线性”放到新的环境,而新环境要求接口是现象不能满足的。
优点
可以让任何两个没有关联的类一起运行。提高类的复用。增加了类透明度。灵儿性好
缺点
过多地使用适配器,会让系统非常凌乱,不易整体进行把握。
由于JAVA至多继承一个类,所以至多只能适配一个适配类
行为型模型
策略模型
一个类的行为或其算法可以在运行时更改
目的
定义一系列算法,把它们一个个封装起来,并且使它们可相互替换。
主要解决
在有多种算法相似的情况下,使用if...else所带来的复杂和难以维护。
优点
算法可以自由切换
避免使用多重条件判断
扩展性好
缺点
策略类会增多
所有策略类都需要对外暴露
模板方法模型
一个抽象类公开定义了执行它的方法的方式/模板。
意图
定义一个操作中算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定的步骤。
主要解决
一些方法通用,却在每一个子类都重新写了这方法。
优点
1.封装不变部分,扩展可变部分
2.提取公共代码,便于维护。
3.行为由父类控制,子类实现
缺点
每一个不同的实现都需要一个子类来实现,导致类的个数增加,使得系统更加庞大。
观察者模式
当对象间存在一对多关系时,则使用观察模式。比如,当一个对象被修改时,则会自动通知它的依赖对象。观察者模式属于行为型模式。
优点
1.观察者和被观察者是抽象耦合的。2.建立一套触发机制。
缺点
1、如果一个被观察者对象有很多的直接和间接的观察者的话,将所有的观察者都通知到会花费很多时间。 2、如果在观察者和观察目标之间有循环依赖的话,观察目标会触发它们之间进行循环调用,可能导致系统崩溃。 3、观察者模式没有相应的机制让观察者知道所观察的目标对象是怎么发生变化的,而仅仅只是知道观察目标发生了变化。
迭代子模式
责任链模式
为请求创建一个接收对象的链,对请求的发送者和接收者进行解耦
意图:
避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止、
应用
1、红楼梦中的"击鼓传花"。 2、JS 中的事件冒泡。 3、JAVA WEB 中 Apache Tomcat 对 Encoding 的处理,Struts2 的拦截器,jsp servlet 的 Filter。
优点
1.降低耦合度。它将请求的发送者和接收者解耦
2.简化对象。使得对象不需知道链的结构
3.增强给对象指派职责的灵活性。通过改变链内的成员或者调动它们的次序,允许动态地新增或者删除责任
4.增加新的请求处理类很方便
5.如果一个对象不能处理该请求,那么它会把相应请求传给下一个接收者,依此类推
缺点
不能保证请求一定被接收
系统性能将受到一定影响,而且在进行代码调试时不太方便,可能会造成循环调用
可能不容易观察运行时的特征,
命令模式
备忘录模式
状态模式
访问者模式
中介者模式
解释器模式
0 条评论
下一页