浅析设计模式

摘要:
设计模式,是一套被反复使用、多数人知晓的、经过分类的、代码设计经验的总结。每一个设计模式系统地命名、解释和评价了面向对象系统中一个重要的和重复出现的设计。使用设计模式的目的:为了代码可重用性、让代码更容易被他人理解、保证代码可靠性。设计模式使代码编写真正工程化;设计模式是软件工程的基石脉络,如同大厦的结构一样。设计模式四个基本要素:模式名称;问题;解决方案;效果。

  一、什么是设计模式?

设计模式,是一套被反复使用、多数人知晓的、经过分类的、代码设计经验的总结。每一个设计模式系统地命名、解释和评价了面向对象系统中一个重要的和重复出现的设计。

使用设计模式的目的:为了代码可重用性、让代码更容易被他人理解、保证代码可靠性。 设计模式使代码编写真正工程化;设计模式是软件工程的基石脉络,如同大厦的结构一样。

Christopher Alexander对设计模式这样说:“每一个模式描述了一个在我们周围不断重复发生的问题,以及该问题的解决方案的核心。这样你就能一次又一次地使用该方案而不必做重复劳动。”

设计模式四个基本要素:

  • 模式名称;
  • 问题;
  • 解决方案;
  • 效果。

  二、对类的回顾

类和对象的三大特性:

  • 封装
  • 继承
  • 多态

关于特性,就不做赘述了。我们先要了解 接口 这个概念。什么是接口?

接口:一种特殊的类,声明了若干方法,要求继承该接口的类必须实现这些方法。

接口就是一种抽象的基类(父类),限制继承它的类必须实现接口中定义的某些方法。

接口的作用:限制继承接口的类的方法的名称及调用方式;隐藏了类的内部实现。

Python中关于接口的两种写法:

# 写法一:
class InterFace(object):
    def method(self,arg):
        raise NotImplementedError

# 写法二:
from abc import abstractmethod,ABCMeta

class InterFace(metaclass=ABCMeta):
    @abstractmethod
    def method(self,arg):
        pass

  三、设计模式的六大原则:

  • 开闭原则:一个软件实体如类、模块和函数应该对扩展开放,对修改关闭。即软件实体应尽量在不修改原有代码的情况下进行扩展。

  • 里氏(Liskov)替换原则:所有引用基类(父类)的地方必须能透明地使用其子类的对象
  • 依赖倒置原则:高层模块不应该依赖低层模块,二者都应该依赖其抽象;抽象不应该依赖细节;细节应该依赖抽象。换言之,要针对接口编程,而不是针对实现编程。
  • 接口隔离原则:使用多个专门的接口,而不使用单一的总接口,即客户端不应该依赖那些它不需要的接口。
  • 迪米特法则:一个软件实体应当尽可能少地与其他实体发生相互作用。
  • 单一职责原则:不要存在多于一个导致类变更的原因。通俗的说,即一个类只负责一项职责。

  四、设计模式的分类:

1、创建型模式:

  • 工厂方法模式(*)
  • 抽象工厂模式(*)
  • 创建者模式(*)
  • 原型模式
  • 单例模式(*)

2、结构型模式:

  • 适配器模式(*)
  • 桥模式
  • 组合模式(*)
  • 装饰模式
  • 外观模式
  • 享元模式
  • 代理模式(*)

3、行为型模式:

  • 解释器模式
  • 责任链模式(*)
  • 命令模式
  • 迭代器模式(*)
  • 中介者模式
  • 备忘录模式
  • 观察者模式
  • 状态模式
  • 策略模式 (*)
  • 访问者模式
  • 模板方法模式 (*)

  五、简单工厂模式

1、内容:不直接向客户端暴露对象创建的实现细节,而是通过一个工厂类来负责创建产品类的实例。

2、角色:

  • 工厂角色(Creator)
  • 抽象产品角色(Product)
  • 具体产品角色(Concrete Product)

3、优点:

  • 隐藏了对象创建的实现细节
  • 客户端不需要修改代码

4、缺点:

  • 违反了单一职责原则,将创建逻辑集中到一个工厂类里
  • 当添加新产品时,需要修改工厂类代码,违反了开闭原则

  六、工厂方法模式

1、内容:定义一个用于创建对象的接口(工厂接口),让子类决定实例化哪一个产品类。

2、角色:

  • 抽象工厂角色(Creator)
  • 具体工厂角色(Concrete Creator)
  • 抽象产品角色(Product)
  • 具体产品角色(Concrete Product)

工厂方法模式相比简单工厂模式将每个具体产品都对应了一个具体工厂。

3、使用场景:

  • 需要生产多种、大量复杂对象的时候
  • 需要降低耦合度的时候
  • 当系统中的产品种类需要经常扩展的时候

4、优点:

  • 每个具体产品都对应一个具体工厂类,不需要修改工厂类代码
  • 隐藏了对象创建的实现细节

5、缺点:

  • 每增加一个具体产品类,就必须增加一个相应的具体工厂类

  七、抽象工厂模式

1、内容:定义一个工厂类接口,让工厂子类来创建一系列相关或相互依赖的对象。

例:生产一部手机,需要手机壳、CPU、操作系统三类对象进行组装,其中每类对象都有不同的种类。对每个具体工厂,分别生产一部手机所需要的三个对象。

2、角色:

  • 抽象工厂角色(Creator)
  • 具体工厂角色(Concrete Creator)
  • 抽象产品角色(Product)
  • 具体产品角色(Concrete Product)
  • 客户端(Client)

相比工厂方法模式,抽象工厂模式中的每个具体工厂都生产一套产品。

3、适用场景:

  • 系统要独立于产品的创建与组合时
  • 强调一系列相关的产品对象的设计以便进行联合使用时
  • 提供一个产品类库,想隐藏产品的具体实现时

4、优点:

  • 将客户端与类的具体实现相分离
  • 每个工厂创建了一个完整的产品系列,使得易于交换产品系列
  • 有利于产品的一致性(即产品之间的约束关系)

5、缺点:

  • 难以支持新种类的(抽象)产品

  八、建造者模式

未完待续……

免责声明:文章转载自《浅析设计模式》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇windows10 Anaconda3安装教程Solaris下设置nfs与nfs挂载下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

微信退款流程,以及在过程中遇见的错误和解决方式(php 语言)

官方下载demo  1:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=11_1    开发步骤  :    https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=7_3    退款结果通知:https://pay.weixin.q...

Python接口测试入门

接口测试基础篇用几个简单的案例,带你轻松了解接口测试 首先了解一下接口测试的重要性: 接口测试有什么要求呢? 首先需要清晰的接口文档,标准如下: 接口名称 接口类型 输入参数 每个参数名; 每个参数类型; 每个参数业务含义; 每个是否可空; 每个字段长度(可选,一般需要提供,有严格要求的字段需特别注明); 输出参数 状态码; 提示信息; 每个参...

java8函数式接口(Functional Interface)

介绍 函数式接口(Functional Interface)就是一个有且仅有一个抽象方法,但是可以有多个非抽象方法的接口。 函数式接口可以被隐式转换为 lambda 表达式(箭头函数)。 函数式接口代表的一种契约, 一种对某个特定函数类型的契约。Lambda表达式不能脱离上下文而存在,它必须要有一个明确的目标类型(interface),而这个目标类型就是...

postman测试wsdl类型接口

1IP地址来源搜索 WEB 服务 接口信息http://www.webxml.com.cn/WebServices/WeatherWebService.asmx?wsdl 2 设置接口调用地址 3 设置请求方式为post 4打开body编辑器,设置body类型“text/xml” 5设置请求体 6发送请求...

postman之动态参数获取

   接口测试中,经常用到上下游接口的依赖关系,下游接口的请求依赖上游接口的响应报文作为入参。 这样就是需要我们捕捉上游接口的响应内容,存储起来作为下游接口请求的入参。   这里举两个例子获取冬天参数,分别是xml和json格式的请求 xml传参格式 1、上游接口是获取省份信息、下游接口是通过省份获取城市信息 我们需要在接口请求的test页签下,捕捉上游接...

微信小程序开发四:接口

4.1 网络 发起请求wx.request接口,用于发起 HTTPS 请求。一个微信小程序,同时只能有5个网络请求连接。上传下载wx.uploadFile接口,用于将本地资源上传到开发者服务器。如页面通过 wx.chooseImage 等接口获取到一个本地资源的临时文件路径后,可通过此接口将本地资源上传到指定服务器。客户端发起一个 HTTPS POST...