设计模式-简介
Posted daofaziran
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式-简介相关的知识,希望对你有一定的参考价值。
简介
Christopher Alexander:“每一个模式描述了一个在我们周围不断重复发生的问题,以及该问题的解决方案的核心。这样你就能一次又一次地使用该方案而不必做重复劳动。”
每一个设计模式系统地命名、解释和评价了面向对象系统中一个重要的和重复出现的设计。
相关书籍:
GoF(Gang of Four)
设计模式四个基本要素
模式名称
问题
解决方案
效果
对象/类
# 封装: """ 区分了类内部和外部 私有的 双下划线开始的变量,不希望有所变动 """ # 继承 """ 复用代码: 继承, 组合(self.age=A.age,B用到了A类里的某些功能) """ # 多态: """ 语言已经体现多态了,不用考虑对象的类型,会自己找 """
多态实例
class User: def show_info(self): print("欢迎你,xx普通用户") class VIPUser(User): def show_info(self): print("欢迎你,xxVIP用户") def func(user): # 不指定user是什么类型的,python会自己去找,其他语言必须定义好 user.show_info() # 多态会通过现象看本质,找的是User的方法 a = User() func(a)
接口
一种特殊的类,声明了若干方法,要求继承该接口的类必须实现这些方法。 # 作用: 限制继承接口的类的方法的名称及调用方式;隐藏了类的内部实现。 接口就是一种抽象的基类(父类),限制继承它的类必须实现接口中定义的某些方法
接口的两种写法
from abc import abstractmethod, ABCMeta class Interface(metaclass=ABCMeta): # 推荐 @abstractmethod def method(self, arg): pass
class Interface: # 不调用method不会报错 def method(self, arg): raise NotImplementedError
接口实例
#!/usr/bin/env python # -*- coding:utf-8 -*- # 当父类必须是子类对象的时候,把父类定义成抽象类,子类是具体 from abc import abstractmethod, ABCMeta # abstract class 抽象类 class Payment(metaclass=ABCMeta): # 这个类是接口,下面的类按照这个类定义的方法的形式去实现(参数一致) @abstractmethod # 加上这个方法后,就变成抽象类,不能进行实例化 def pay(self, money): # 抽象方法不用实现,子类会去实现 pass class Alipay(Payment): def pay(self, money): print("支付宝支付%s元" % money) class ApplePay(Payment): def pay(self, money): print("苹果支付%s元" % money) class WechatPay(Payment): def pay(self, money): print("微信支付%s元" % money) # 高层 # def pay_money(payment, money): # payment.pay(money) a=Alipay() a.pay(10)
六大原则
# 开闭原则: 一个软件实体如类、模块和函数应该对扩展开放,对修改关闭。 即软件实体应尽量在不修改原有代码的情况下进行扩展。 # 里氏(Liskov)替换原则: 所有引用基类(父类)的地方必须能透明地使用其子类的对象。 # 依赖倒置原则:# 可以看接口实例 高层模块不应该依赖低层模块,二者都应该依赖其抽象(接口);抽象不应该依赖细节;细 节应该依赖抽象。 换言之,要针对接口编程,而不是针对实现编程。 # 接口隔离原则: 使用多个专门的接口,而不使用单一的总接口,即客户端不应该依赖那些它不需要的接口。 # 迪米特法则:# 解耦,耦合尽可能小 一个软件实体应当尽可能少地与其他实体发生相互作用。 # 单一职责原则: 不要存在多于一个导致类变更的原因。通俗的说,即一个类只负责一项职责。
里氏替换原则实例
class User: # 可以不是抽象类 def show_info(self): print("欢迎你,xx普通用户") class VIPUser(User): def show_info(self): print("欢迎你,xxVIP用户") def func(user): user.show_info()
设计模式分类
# 创建型模式: 工厂方法模式 ***** 抽象工厂模式 ** 创建者模式 ** 原型模式 单例模式 ****** # 结构型模式 适配器模式 ** 桥模式 组合模式 ** 装饰模式 外观模式 享元模式 代理模式 ** # 行为型模式 解释器模式 # 做编译器,如写一个python 责任链模式 ** 命令模式 # 把一个命令分装成一个类,写一个word,桌面 迭代器模式 中介者模式 备忘录模式 观察者模式 ** 状态模式 策略模式 ** 访问者模式 模板方法模式 **
11
以上是关于设计模式-简介的主要内容,如果未能解决你的问题,请参考以下文章
SpringCloud系列十一:SpringCloudStream(SpringCloudStream 简介创建消息生产者创建消息消费者自定义消息通道分组与持久化设置 RoutingKey)(代码片段
C#-WebForm-★内置对象简介★Request-获取请求对象Response相应请求对象Session全局变量(私有)Cookie全局变量(私有)Application全局公共变量Vi(代码片段