设计模式-读书笔记

只是看完书后,自己对设计模式的一些印象。

开闭原则:
对扩展开放,对修改封闭。

里氏替换原则:
子类在继承父类的时候,可以扩展父类的功能,但尽量不要重写父类的方法。
其实如果子类需要比较大量的重写父类的方法,可以考虑组合的方式。子类独立出来,不继承父类,而改成持有一个父类的对象,然后就可以写你需要的新方法又可以获得一些原本想要的父类方法,还不会影响到父类。

依赖倒置原则:
抽象不应该依赖细节,细节应该依赖抽象。
要面向接口编程(比较通用),不要面向实现编程。
优点:降低耦合度,提高系统的稳定性。

单一职责原则:
一个类,应该只有一种一起他发生变化的原因,如果还有其他因素,应该把它拆分成多个类。
优点:降低类的复杂度,提高可读性。

接口隔离原则:
把庞大,复杂的接口按照需求拆分成更多更小更具体的接口。
优点:降低耦合度。

迪米特法则(最少知识原则):
一个类对其他的类知道得越少越好,尽量只与朋友通信,不和陌生人通讯。

合成复用原则(组合/聚合复合原则):
在复用的时候,优先考虑组合,聚合等方式,其次才考虑继承。 这样做,复用旧类的时候,可以降低和新类的耦合度。

单例模式:
例子:管理里比较常用到。
把创建方式通过私有化隐藏起来,用户只能通过调用类提供的静态方法获取一个(有且只有一个)实例对象。

原型模式:
例子:clone
其实就是写一个clone方法,把已有对象复制一份出来。这里要注意的是需要选择拷贝的结果为“深拷贝”还是“浅拷贝“。

工厂方法模式:
写一个创建产品对象的工厂类,来满足”创建与使用分离“的特点。用户只需知道工厂名字即可创建产品,而不需要了解创建过程。

抽象工厂模式:
普通工厂方法的升级版,可以在一个工厂方法里面生产一个系列旗下的所有产品。 适用于系统中有多个产品族的地方。
缺点:当需要添加新产品,在抽象工厂加了新产品的抽象方法后,继承其工厂的所有子类都得实现其方法。

建造者模式:
用户根据自己的实际需求选择”建造者“(选材料),然后把选好的建造者交给”指挥者“组装。调用指挥者组装后,就可以获得你想要的最终”产品“。 通过继承建造者基类,编写不同的”建造者“类,就可以选择不同的材料,交给指挥者最终生产出不同的产品。
优点:建造者间相互独立,扩展新的建造者十分简单。
缺点:建造者必须遵守父类制定好的方法来实现,不然无法按照固定格式交给指挥者组装,所以使用范围比较固化。

代理模式:
建立一个中间层,既分离了调用者和目标(解耦),更可以对调用的方法进行一些扩展,例如增加一些统计方法之类的。
与适配器模式的区别:代理模式接口是一致的,只是不想直接把实现暴露给使用者,所以在中间加了一层代理。
与装饰模式的区别:代理模式目的是对客户隐藏对象的具体信息(控制对象访问),所以一般代理模式会在代理类创建对象实例。

适配器模式:
一个新的类需要调用到类库里的一些方法,可类库方法的老接口不兼容新的类,这时就可以加一层中间层(适配器),把旧的接口转为成新类能使用的接口。
优点:只是修改一下代码,就可以复用一些原来接口不兼容的类的代码。也可以把调用者和目标之间进行分离。
与代理模式的区别:因为新旧接口不一致导致没法使用而在中间加一层适配器。

桥接模式:
把你需要的东西一步一步的连起来(感觉有点像链表)。例如你要买一个包包,先选好牌子,然后下一步选包包的款色,再一下步选包包的颜色,把这些信息连起来就等于是你最喜欢的包包了。
优点:容易扩展。

装饰模式:
装饰类会持有目标对象,并不改变对象原有结构的情况下,动态的给该对象增加一些职能。
与代理模式的区别:装饰模式更多的是为了给对象添加更多的职能,所以一般都会把原始对象从外部传入到装饰模式中再加以利用。

外观模式:
一个外观模式类,完成了对多个复杂的子系统的封装,用户不用关心内部子系统的具体细节。
优点:降低子系统和用户间的耦合,减少子系统修改对用户带来的影响。

享元模式:
例子:线程池。
优点:共享对象,大幅降低对象的数量。

组合模式:
例子:软件里面的组件。
透明模式:把加减叶子等方法放到抽象基类声明。
透明模式:把加减叶子等方法放到树枝节点各自声明。
优点:使用者无需关心是单个叶子还是整个树状结构。

模板方法模式:
把一个固定的流程定义在抽象基类,并且实现了流程中一些固定不变的步骤,一些可变的步骤放到子类中实现。
优点:封装了不变的部分,开放了扩展的部分。行为流程由父类控制。

策略模式:
一个策略抽象父类,多个不同策略的子类。 一个实施类负者承上启下。 使用者只需选择适合自己的策略放到实施类上即可。
优点:新增策略不用修改整套策略系统,只需新增一个子类即可。
缺点:如果策略过多,子类也会变得非常之多。

命令模式:
通过加入命令,使调用者和执行者解耦

责任链模式:
通过链的结构,来处理请求者的请求,从链头开始一直往后传递,直到有权限处理请求者的请求(或者到链尾)
优点:请求者无需知道谁负责处理,只需把请求放到责任链里面来(低耦合)。而且有新的功能可以直接加到责任链中(易扩展)。链的每一环只处理自己责任内的内容(单一职责)。

状态模式:
例子:处理行为逻辑时经常用到的状态机。
优点:不同的状态,独立一个继承状态基类的子类出来完成对应的功能。(单一职责原则)。当有新的状态出现时,只需写一个新的子类,并且修改于其相关联的子类的跳转状态即可(便于程序的扩展)。

观察者模式:
例子:消息分发机制。
优点:解耦!!! “观察者”只需要加入到自己需要观察的“目标”队列中。当“目标”有任何变化时,就会通知给所有在队列中的“观察者”。
缺点:实际情况是,很多地方都有可能导致“目标”的改变,当“观察者”执行行为逻辑时,很难找到是哪个地方导致“目标”改变的。
与其他模式的区别:只有目标变化,才会广播给目标队列中的观察者。

中介者模式(调停者模式):
例子:QQ群聊、微信群聊。
中介收集用户发出的声音,然后再广播给其他所有有需求的用户。
优点:解耦!!!把原本对象需要1对多的关联,变成了1对1的关联,发声的对象只需要关联中介者,剩下的就可以交给中介者来处理了。
与其他模式的区别:任何一个成员的发声都通过中介来广播给其他成员听。

迭代器模式:
例子:STL里面大部分的容器,如map、vector、set等
不暴露对象内部情况的前提下,提供一种遍历聚合的方式。

访问者模式:
使用条件:需要访问的对象的数据结构非常稳定!
不同的访问者,根据自己实际需求,通过获取目标对象的部分数据,来组装出自己想要的结果。
优点:增加访问者,只需增加新的访问者类即可(扩展性好)。每个访问者其实都是对于目标数据结构的一种操作集合,功能比较单一(单一职责原则)。
缺点:目标对象的数据对访问者公开(违反迪米特原则)。一旦目标对象数据结构需要修改,则其关联的多个访问者都得修改。

备忘录模式(快照模式):
例子:各种编辑器上面的undo redo。
发起者创建备忘录,然后把备忘录存放到管理类中,管理类就可以存放发起者各种状态的记录,并根据需求把发起者还原到某个时间节点的状态上。(有点类似SVN的功能)

解释器模式:
例子:正则表达式,判断账号是否是邮箱
按照需求定义一定的规则后,就可以利用定义的规则去解释、翻译目标语句。
缺点:解释比较复杂的语句,效率非常低下。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值