zoukankan      html  css  js  c++  java
  • 设计模式:讲在设计模式之前

    一、什么是设计模式

    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)
  • 相关阅读:
    Git for Windows安装教程
    MySQL 操作已存在的表(ALTER TABLE)
    Xiuno 简约白色主题
    PHP 文件上传操作类
    Leetcode 5. 最长回文子串
    Hexo开篇
    Laravel 模型关联——连带删除
    Layui表单赋初值之 checkbox
    Layui提交表单时验证必选的多选框是否有选中
    自定义 checkbox 和 radio
  • 原文地址:https://www.cnblogs.com/luoahong/p/9732898.html
Copyright © 2011-2022 走看看