设计模式

Posted zhuxineli

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式相关的知识,希望对你有一定的参考价值。

类与类之间的6中关系:
1 继承
2 实现关系(implementation)。
主要说明接口(包括抽象类)和实现类的关系。接口(包括抽象类)是方法(没有主题,只有定义)的集合,类实现了其中所有的方法。
3 组合关系(composition)。整体与部分的关系,但整体与部分不能分离。有一致的生存周期,是同生共死的关系。比如人的头部和身体的关系,没想到太实际的代码中的例子
4 聚合关系(aggregation)。整体和部分的关系,整体与部分可以分离。
5 关联关系(assocation)
6 依赖关系(dependence)
1 单例模式 顾名思义:一个实例化对象。目的:节省内存,从始至终只操作一个实例。
https://github.com/zhuxinlei/design-pattern/blob/master/singleTon.php 比较简单,不做详细介绍

2 工厂模式 又分为:简单工厂 、工厂方法、 抽象工厂。
核心: 实现了创建者和调用者的分离
简单工厂:用于创建同一级别的产品(对于创建新的产品需要修改原有的代码,不符合开闭原则,所以才衍生出工厂方法模式,但在实际应用中还是用简单工厂多余工厂方法模式)
https://github.com/zhuxinlei/design-pattern/blob/master/simpleFactory.php 这是关于简单工厂的示例代码
https://github.com/zhuxinlei/design-pattern/blob/master/factoryMethod.php 这是关于工厂方法的示例代码
可以看出,唯一区别就在于是否在新需要创建一个实例的时候是否还用得着修改原来的代码,但我觉得好像没有必要,如果将简单工厂稍作修改似乎可以完美解决这个问题,就是在实例化类的时候,直接实例化传进来的参数名不就可以了吗?
项目中的实际应用:数据库和缓存的切换,假设平时你使用的是memcahe缓存,因为业务扩展需要切换成redis,此时我们仅需要告诉工厂类,我现在想使用redis了,你给我返回redis的实例吧,其他不需要我们操心,至于其中的操作方法为了保持和memcache实例的一致让他和memcache的类继承同一个缓存接口就可以。替代了我们面向过程编程中什么事都需要自己干,想切换redis的话还需要自己重新实例化对象来调用,让程序更加规范。

3 适配器模式 适配器就是一种适配中间件,它存在于不匹配的二者之间,用于连接二者,将不匹配变得匹配,简单点理解就是平常所见的转接头,转换器之类的存在。
https://github.com/zhuxinlei/design-pattern/blob/master/noAdapter.php 没有适配器的模样
https://github.com/zhuxinlei/design-pattern/blob/master/adapter.php 适配器类
https://github.com/zhuxinlei/design-pattern/blob/master/adapterFactory.php 工厂模式结合适配器模式的类

4 观察者模式 又称发布-订阅模式,定义一个观察者和多个被观察者的一对多的关系,当被观察者状态发生变化的时候,多个观察者都能收到通知
实例讲解:用户下订单之后,需要给用户发送短信、插入相关统计表、记录日志等等操作。普通状态下都在一个方法中写完了,但是如果这时候我们想添加一个给用户发邮件的功能,或者删除记录日志的功能,如果业务逻辑很复杂的情况下(我遇到过相关代码600行的方法),这将是非常非常麻烦的,真的是连看业务逻辑的勇气都没有。但如果我们使用观察者模式,相关2行代码就可以完成调度,实现程序的解耦。
https://github.com/zhuxinlei/design-pattern/blob/master/observe/noObserve.php 没有使用观察者的代码
https://github.com/zhuxinlei/design-pattern/blob/master/observe/observe.php 使用观察者的代码

5 策略模式 定义了一族相同类型的算法,算法之间独立封装,并且可以互换代替。这些算法是同一类型问题的多种处理方式,他们具体行为有差别。每一个算法、或说每一种处理方式称为一个策略。在应用中,就可以根据环境的不同,选择不同的策略来处理问题。
举一个输出数组格式的例子,数组输出有三种格式,分别是json、序列号和原生数组形式输出。
https://github.com/zhuxinlei/design-pattern/blob/master/strategy/nostrategy.php 没有使用策略模式的方法
https://github.com/zhuxinlei/design-pattern/blob/master/strategy/strategy.php 使用策略模式

以上是关于设计模式的主要内容,如果未能解决你的问题,请参考以下文章

Spring依赖注入和NEW的差别

简单工厂模式和策略模式的差别

设计模式之桥梁模式和策略模式的差别

设计模式之原型模式(创建型)

javascript高级程序设计--浅析undefined与null的差别

从状态模式看“大神”和“菜鸟”的差别