设计模式-简介

时间:2022-07-29 20:46:13

简介

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