Design Pattern


OO Design 原则:

一. 多用组合,少用继承
二. 针对接口编程
三. 交互对象间应该努力使用松耦合设计
四. 一个类应该对扩展开放,对修改关闭。
五. 依赖抽象类,不要依赖具体类。
六. 依赖倒置原则:a. 遍历不能持有具体类的引用 b. 不要让类派生自具体类 c.不要覆盖基类实现的方法
七. 最少知识原则。 尽量减少类之间的交互。类之间的交互会产生类间的相互依赖,一个类的改变会影响其他类,因此,要使用这一原则。
八. 高层组件会在需要的时候调用低层组件,低层组件不要调用高层组件
九. 一个类只有一个引起变化的原因。类要有单一责任。


1. 策略模式


将策略调用者与策略实现解耦。


2. 观察者模式


定义了一对多的关系,多个观察者侦听一个subject。当一个subject变化的时候,需要通知所有观察者。做到了变化引起方与变化响应方的解耦。

3. 装饰者模式

装饰者模式可以让一个object按照需要动态的加入扩展功能,而不是使用继承。

装饰者与被装饰者都有共同的基类,并且实现相同的操作函数。装饰者的目的是使用被装饰者的操作函数的同时,附加自己的操作到操作函数。从而实现附加功能。

装饰者在初始化的时候会使用被装饰者作为输入参数,从而能够在自己的函数中调用被装饰者的操作函数。一个装饰者可以成为下一个装饰者的被装饰对象,因为装饰者与被装饰者有相同的基类。


4. 简单工厂模式和抽象工厂模式

简单工厂模式使类实例的创建与使用解耦,工厂类实现了各种产品的创建细节。 用户使用产品ID来使工厂创建需要的产品。产品使用者只需要知道创建的产品基类的引用即可,不用知道具体产品子类。


 更进一步,工厂类本身也可以做成接口类。这样使得产生产品的工厂本身也可以变得可以替换,从而使不同的工厂用来作为产品的产生。这就是抽象工厂类。


工厂模式实现了依赖倒置:

如果不使用工厂模式,产品使用者将会依赖于具体的产品。例如pizzaStore会依赖于具体pizza类并且调用各种pizza类的方法。现在使pizzaStore这个产品使用者只依赖与抽象类pizza,这样使得使用者与产品解耦。


5. 命令模式

命令请求着创建命令,并且设定命令接受者,命令中具体定义了接受者应该采用的动作和方法,及命令接受者如何响应。

命令被发送给命令的触发者invoker,invoker 不知道命令的内容以及接受者,invoker会调用命令的接口去触发命令在接受方执行。

这样做到了命令的接受者和命令的触发者的解耦。


6. 适配器模式

Class B 实现了Class A 需要的功能,但是不符合A要求的接口。引入adaptor 类对B的接口进行改造,从而符合A的要求。


外观模式是特殊的adaptor 模式,外观模式隐藏了一个或者多个类的具体工作,而只暴露出简单的几个接口函数供使用。


7. 模板方法模式

模板方法模式定义了一个算法的流程,并且提供了钩子函数。子类继承自模板方法类,可以使用自己的动作替代钩子函数,从而扩展功能。本模式经常出现于架构中。

他与策略模式有相似之处,但是,本模式使用继承实现算法的部分修改。策略模式使用组合完成算法的整体替换。

本策略遵从原则:低层类不要调用高层类,高层类需要的时候会调用低层类。


8. 迭代器模式

本模式将容器与遍历容器的方法解耦。容器只需要关心成员的组成与存贮。遍历交由迭代器实现。迭代器可以通过容器创建。使用者使用迭代器遍历容器中的元素。实现了一个类只实现一个职责。


9. 组合模式

当有多个对象集合,切比起有整体和部分的关系的时候,组合模式可以提供一致的方式,让你处理这些对象及其集合。

就个人来说,组合模式使一种数据结构。他所解决的问题是如何用对外表现一致的接口来管理和操作多个对象以及这些对象的集合。每一个对象都继承自component 类,对象可以是存储数据的,也可以是更复杂的对象的集合,例如list,vector等等结构,他们被一个树形结构管理起来。非叶子节点是composite 类实例,他又可以管理使用其他composite或者leaf对象,因为他们都有共同的基类。


10. 状态模式

如果对象内部有多个状态,且会在不同状态之间切换,为了隐藏具体状态的操作,可以使用状态模式。

状态模式中context含有多个不同状态的实例,而每个状态都从父类state继承而来。state具有所有允许context调用的method。context 不需要知道每个state的具体内容,只需要在相应用户动作的相关method中调用state的接口。在state实例运行过程中,state都应该具有context的句柄,以便在状态state1需要改变到state2的时候,将state2的实例(存贮于context中)替换当前工作的state。这样就实现了state的迁移。当context的动作再次被触发的时候,context调用的将是新状态state2的实现。




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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值