设计模式:讲在设计模式之前

一、什么是设计模式

1、设计模式的定义

2、注意事项

设计模式就是底层实现起来麻烦,上层调用简单

设计模式就是“有一个套路 ,分几个类,几个方法,几个属性”

3、为什么要有设计模式

在面向对象之前用的面向过程,小软件,需求不断增加,代码量爆增,大家的代码合并不了,几百万几千万的项目都不能交付,爆发了软件危机,才有了软件工程,设计模式,面向对象

二、讲在设计模式之前

1、封装

 1、对象的行为对于外部世界来说就是不可见的,或者说对象的状态信息是私密的

 2、客户端不能通过直接操作来改变对象的内部状态。相反,客户端需要通过发送消息来请求对象改变其内部状态。对象可以根据请求的类型,通过特定的成员函数(例get和set)改变他们的内部状态,

  以做出相应的响应

 3、在python中,封装(数据和方法的隐藏)的概念不是隐式的,因为它没有提供封装所需的关键字,诸如public、private和protected(在诸如c++或java之类的语言汇总,都提供了这些关键字)

  当然,如果在变量或函数名 前加上前缀_,就可以将其可访问性变为私有

4、私有属性很重要

2、继承

多态的两种类型

对象根据输入参数提供方法的不同实现

不同类型的对象可以使用相同的接口

对于python来说,多态是该语言的内置功能,例如操作符"+"可以应用于两个整数以进行加法运算,也可以应用于字符串来连接它们。在下面的示例中,字符串、元祖或列表都可以通过证书索引进行访问

它为我们展示了python内置类型的多态

B是一种特殊的A才会用继承

3、多态

Python是一种多态语言,程序员不用考虑多态

4、接口

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

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

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

1、用接口专业代码

from abc import abstractmethod, ABCMeta

#抽象
class Payment(metaclass=ABCMeta):
    @abstractmethod
    def pay(self, money):
        raise NotImplementedError

#底层
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)


#高层
payment = Alipay
payment.pay(100)

 2、新人代码

class WeiXinZhiFu:
    def huaqian(self, money):
        print("微信支付%s元"%money)

class WangYinzhiFu:
    def huaqian(self, money):
        print("网银支付%s元"%money)

5、组合

它是一种将对象或类组合成更复杂的数据结构或软件实现的方法

在组合中,一个对象可用于条用其他模块中的成员函数,这样一来,无序通过集成就可以实现基本功能的跨模块作用

四、设计模式6大原则

1、开闭原则

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

白话:加功能可以很方便的加,改代码尽量不要改?

python中的装饰器就用的是开闭原则

2、里氏(Liskov)替换原则

所有引用基类(父类)的地方必须能透明地使用其子类的对象。

传父类ok,之类也应该不会报错有问题,也就是之类不能覆盖父类

尤其在“替换父类代码的时候”

3、依赖倒置原则

高层模块不应该依赖低层模块,二者都应该依赖其抽象;抽象不应该依赖细节;细节应该依赖抽象。换言之,要针对接口编程,而不是针对实现编程

高层和底层不直接依赖,高层依赖底层 底层和高层不是一个人写的,底层修改,高层也要修改,抽象就是接口编程

1、用接口专业代码

from abc import abstractmethod, ABCMeta

#抽象接口
class Payment(metaclass=ABCMeta):
    @abstractmethod
    def pay(self, money):
        raise NotImplementedError

#底层
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)

返回的参数

 2、新人代码

class WeiXinZhiFu:
    def huaqian(self, money):
        print("微信支付%s元"%money)

class WangYinzhiFu:
    def huaqian(self, money):
        print("网银支付%s元"%money)

4、接口隔离原则

使用多个专门的接口,而不使用单一的总接口,即客户端不应该依赖那些它不需要的接口。

就是不要乱继承:只有B是一种特殊的A才会用继承

5、迪米特法则

一个软件实体应当尽可能少地与其他实体发生相互作用

解偶

6、单一职责原则

不要存在多于一个导致类变更的原因。通俗的说,即一个类只负责一项职责。

一个类只干一样的活

7、合成复用原则

1、类适配器 用的是继承

class WeChatPay(Payment, WeiXinZhiFu):
    def pay(self, money):
        self.huaqian(money)

2、对象适配器------用的是组合

class PayAdapter(Payment):
    def __init__(self, payment):
        self.payment = payment

    def pay(self, money):
        if hasattr(self, "pay"):
            return self.payment.pay(money)
        else:
            return self.payment.huaqian(money)
原文地址:https://www.cnblogs.com/luoahong/p/9732898.html