初识设计模式——设计模式的六大原则

单一职责原则(Single Responsibility Principle, SRP)

定义:

就一个类而言,应该仅有一个引起它变化的原因

解释:

如果一个类承担的职责过多,就等于把这些职责耦合在一起,一个职责的变化可能会削弱或抑制这个类完成其他职责的能力,当变化发生时,设计会遭到意想不到的破坏。

开放-关闭原则(Open-Closed Principle, OCP)

定义:

对于扩展是开放的,对于修改是封闭的。

解释:

对一个已完成的类,如果需要修改或增加其中的功能,最好使用继承的方式对其扩展,尽量不要改动类的本身。

里氏代换原则(LSP)

定义:

子类型必须能够替换掉他们的父类型。

解释:

当只有子类可以替换掉父类,软件的单位功能不会受到影响时,父类才能真正被复用,而子类可以在父类的基础上增加新的行为。

依赖倒转原则(DIP)

定义:

  1. 高层模块不应该依赖底层模块。两个应该依赖抽象
  2. 抽象不应该依赖细节,细节应该依赖抽象

解释:

举例说明:设计一个类,其主要的功能就是链接数据库,并对数据库进行增删改查等相关操作。如果我们把这个类只写成链接Mysql的类,那在使用过程中如果需要链接SQLserver,我们就需要在增加一个类。这就是高层(调用类的代码)依赖底层(链接数据库的类)。所以在Thinkphp或者Yii中一般都建立一个抽象的类或接口,所有的子类是实现链接或调用不同数据库的类,在高层代码中,通过不同的设计模式调用即可,无需修改大量代码。(这个完全是自己的理解,可能不正确)

迪米特原则(最少知识原则 LOD)

定义:

如果两个类不必彼此直接通信,那么两个类就不应当发生直接的相互作用。如果其中一个类需要调用另一个类的某一个方法的话,可以通过第三者转发这个调用。

解释:

还是举例说明

在Thinkphp中封装了一个微信的类库,在里面需要缓存access_token,如果直接使用Thinkphp中Cache的类库,那么这个类在Yii框架中使用时就要修改这个代码的组件、命名空间、类库名称及方法,这只是一个,还有其他很多很多。所以这时候建立一个第三方的类库,在这个里面封装了与其他组件沟通的桥梁,如果需要迁移类库,我们只需要修改这个第三方类库即可。

代码示例:

public static function cache($name, $value = null)
    {
        $name = 'wechat_'.$name;
        if (empty($value)) {
            return Cache::get($name);
        }
        if (is_array($value)) {
            $value = json_encode($value, JSON_UNESCAPED_UNICODE);
        }
        return Cache::set($name, $value);
    }

第一张图中Base类中存在方法getAccessToken(),其中调用Proxy::cache()方法,Proxy::cache()中调用Thinkphp自带的Cache类库,如果应用场景变为Yii2扩建,我们只需要修改Proxy::cache()中的代码就可以,无需改变Base中的代码。

合成、聚合原则(CARP)

定义:

尽量使用合成、聚合,尽量不要使用类的继承。

解释:

优先使用类的合成/聚合将有助于你保持每个类被封装,并被集中到单个任务上。这样类和类继承的层次会保持在最小规模上,并且不太可能增长成为不可控制的庞然大物。

这里需要着重说明一下,在其他的资料中发现这个原则不在6大原则之内,而剩余的另一大原则为【接口隔离原则】(ISP),个人理解感觉这两个原则很像,所以附加接口隔离原则的介绍网址,我这里就将这两个原则合并为一个原则了,感觉书上的说法比较笼统而已,因为合成/聚合确实在代码中不常见,而且不知道怎么实现。

下一篇

初识设计模式——简单工厂模式、策略模式及两者的结合使用

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值