Blog ~Version 3.0 设计概要(设计模式篇)

2018-11-23 16:17:41 作品与设计 2700 0

项目地址

https://github.com/HaleyLeoZhang/blog_v3

为什么要用设计模式

为了实现 高内聚,低耦合 、易维护、易扩展的工业级代码

设计模式

以下将从 定义场景解读 这几个方面来讲解

策略模式

主要目的是为了实现面向对象中的 多态 ,即 一个接口实现多种逻辑

定义

策略模式作为一种软件设计模式,指对象有某个行为,但是在不同的场景中,该行为有不同的实现算法
比如每个人都要“交个人所得税”,但是“在美国交个人所得税”和“在中国交个人所得税”就有不同的算税方法

场景

用户第三方登录

分为两个动作

  • 生成跳转到第三方的链接
  • 回调时,通过 access_token 获取我们用户信息
适用场景

几个类的主要逻辑相同,只在部分逻辑的算法和行为上稍有区别的情况

关注点

策略是行为型模式,它的作用是让一个对象在许多行为中选择一种行为;

解读

Service 层,统一输入输出(外部关注点,抽取的是同一接口的不同实现)
app/Services/OAuth2/BaseOAuth2Service.php图 001

图 001

示例,实现 Github 用户信息接入
app/Services/OAuth2/GithubOAuth2Service.php图 002

图 002

其对应 ApiService 的实现
app/Services/OAuth2/Github/ApiService.php图 003

图 003

同理,扩展其他Oauth2方式的QQ、Sina用户接入
对外只用实现 get_third_login_url 、get_third_user_info 这俩方法即可
在仓储里面 只用通过外部传入 表明第三方类型的参数,实例化不同的类即可
app/Bussiness/OAuth2/Logic/ActionOAuth2Logic.php图 004

图 004

走读顺序

app/Http/Controllers/Common/OAuth2Controller.php
app/Bussiness/OAuth2/OAuth2Bussiness.php
app/Bussiness/OAuth2/Logic/ActionOAuth2Logic.php
app/Services/OAuth2/BaseOAuth2Service.php
app/Services/OAuth2/GithubOAuth2Service.php
app/Services/OAuth2/Github/ApiService.php

与工厂类模式的关系

先说说普通工厂模式

可以根据类型创建不同的策略对象
以此实现面向对象中的 多继承

如何与之结合

使用 策略 模式,我们统一定义了不同场景下需要统一实现的业务功能接口
也就是说,现在我们实现的 GithubSinaQQ 第三方登录服务的流程是统一的
一旦确定用户是哪个服务,我们直接调对应服务就行了
所以我们在获取用户服务功能类的时候
返回不同的类就可以了(见app/Bussiness/OAuth2/Logic/ActionOAuth2Logic.php)
这就是 简单工厂 = 普通工厂 + 策略

装饰器模式

定义

定义了一系列算法,并将每个算法封装起来,使他们可以相互替换,且算法的变化不会影响到使用算法的客户
需要设计一个接口,为一系列实现类提供统一的方法,多个实现类实现该接口,设计一个抽象类(可有可无,属于辅助类),提供辅助函数

场景

加密函数:对称、非对称加解密

适用场景

功能有重叠的部分,但是各自功能可以扩展开来

关注点

这些新加的代码装饰了原有类的 核心职责或主要行为

解读

等待更新

单例模式

注:若无特殊说明,文章均为云天河原创,请尊重作者劳动成果,转载前请一定要注明出处