zoukankan      html  css  js  c++  java
  • 设计模式

    a. 面向对象

    面向对象的三大特性
    	- 封装
    		1. 把数据和函数包装在类里
    		2. 类的边界限制了一些外界的访问
    	- 继承
    	- 多态
    
    接口
    	- 一种特殊的类,声明了若干方法,要求继承该接口的类必须实现这些方法。
    	- 接口就是一种抽象的基类(父类),限制继承它的类必须实现接口中定义的某些方法。
    	- 作用: 限制继承接口的类的方法的名称及调用方式;隐藏了类的内部实现。
    

    b. 设计模式

    设计模式的六大原则
    
    	- 开闭原则:
    		- 开发封闭原则 一个软件实体如类,模块和函数应该对扩展开放,对修改关闭。即软件实体应尽量在不修改原有代码的情况下进行扩展。
    	- 里氏(Liskov)替换原则:
    		- 所有引用基类(父类)的地方必须透明地使用其子类的对象。
    	- 依赖倒置原则:
    		- 高层模块不应该依赖底层模块,二者都应该依赖其抽象; 抽象不应该依赖细节; 细节应该依赖抽象。换言之,要针对接口编程,而不是针对实现编程。
    	- 接口隔离原则:
    		- 使用多个专门的接口,而不使用单一的总接口,即客户端不应该依赖那些它不需要的接口。
    	- 迪米特法则:
    		- 一个软件实体应当尽可能少迪与其他实体发生相互作用。
    	- 单一职责原则:
    		- 不要存在多于一个导致类变更的原因。通俗的说,即一个类只负责一项职责。
    
    设计模式分类
    
    	- 创建型模式:
    		- 工厂方法模式
    		- 抽象工厂模式
    		- 创建者模式
    		- 单例模式
    	- 结构型模式
    		- 适配器模式
    		- 桥模式
    		- 组合模式
    		- 装饰模式
    		- 外观模式
    		- 享元模式
    		- 代理模式
    	- 行为型模式
    		- 解释器模式
    		- 责任链模式
    		- 命令模式
    		- 迭代器模式
    		- 中介者模式
    		- 备忘录模式
    		- 观察者模式
    		- 状态模式
    		- 策略模式
    		- 访问者模式
    		- 模版方法模式

    创建型模式

    a. 单例模式

    单例模式
    	- 保证一个类只有一个实例,并提供一个访问它的全局访问点
    	- 使用场景
    		- 当类只能有一个实例而且客户可以从一个总所周知的访问点访问它时
    	- 优点
    		- 对唯一实例的受控访问
    		- 单例想当一全局变量,但防止了命名空间被污染
    第一种:模块导入,不管导入多少次,只执行一次
        #mysingleton.py
        class My_Singleton(object):
            def foo(self):
                pass
        my_singleton = My_singleton()
                
        #******.py
        from mysingleton import my_singleton
        my_singleton.foo()
    
    
    
    
    第二种:使用__new__
            
        class Singleton(object):
            _instance = None
            def __new__(cls,*args,**kw):
                if not cls._instance:
                    cls._instance = super(Singleton,cls).__new__(cls,*args,**kw) 
                return cls._instance
    
        class MyClass(Singleton):
            a = 1
        one = MyClass()
    
    
    
    第三种:使用装饰器
        from functools inport wraps
            def singleton(cls):
                instances = {}
                @wraps(cls)
                def getinstance(*args,**kw):
                    if cls not in instances:
                        instances[cls] = cls(*args,**kw)
                    return instances[cls]
        @singleton
        Class MyClass(object):
            a = 1
    
    
    
    第四种:使用metclass    
        Class Singleton(type):
            _instances = {}
            def __call__(cls,*args,**kwargs):
                if cls not in cls._instances:
                    cls._instances[cls] = super(Singleton,cls).__call__(*args,**kwargs)
                return cls._instances[cls]
        class MyClass(metaclass=Singleton):   #python3
            a = 1
        class MyClass(object):  #python2
            __metaclass__ = Singleton
            a = 1
    View Code

    b. 简单工厂模式

    # coding : utf-8
    # create by ztypl on 2017/5/24
    
    from abc import abstractmethod, ABCMeta
    
    class Payment(metaclass=ABCMeta):
        @abstractmethod
        def pay(self, money):
            pass
    
    class Alipay(Payment):
        def __init__(self, enable_yuebao=False):
            self.enable_yuebao = enable_yuebao
    
        def pay(self, money):
            if self.enable_yuebao:
                print("余额宝支付%s元" % money)
            else:
                print("支付宝支付%s元" % money)
    
    
    class ApplePay(Payment):
        def pay(self, money):
            print("苹果支付%s元" % money)
    
    
    class PaymentFactory:
        def create_payment(self, method):
            if method == "alipay":
                return Alipay()
            elif method == "applepay":
                return ApplePay()
            elif method == "yuebao":
                return Alipay(enable_yuebao=True)
            else:
                raise NameError(method)
    
    f = PaymentFactory()
    p = f.create_payment("alipay")
    p.pay(100)
    View Code

    c. 工厂方法模式

    # coding : utf-8
    # create by ztypl on 2017/5/25
    
    from abc import abstractmethod, ABCMeta
    
    
    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 PaymentFactory(metaclass=ABCMeta):
        @abstractmethod
        def create_payment(self):
            pass
    
    
    class AlipayFactory(PaymentFactory):
        def create_payment(self):
            return Alipay()
    
    class ApplePayFactory(PaymentFactory):
        def create_payment(self):
            return ApplePay()
    
    
    
    
    # 用户输入
    # 支付宝,120
    
    af = AlipayFactory()
    ali = af.create_payment()
    ali.pay(120)
    View Code

    d. 抽象工厂模式

    # coding : utf-8
    # create by ztypl on 2017/5/25
    
    from abc import abstractmethod, ABCMeta
    
    # ------抽象产品------
    class PhoneShell(metaclass=ABCMeta):
        @abstractmethod
        def show_shell(self):
            pass
    
    class CPU(metaclass=ABCMeta):
        @abstractmethod
        def show_cpu(self):
            pass
    
    class OS(metaclass=ABCMeta):
        @abstractmethod
        def show_os(self):
            pass
    
    
    # ------抽象工厂------
    
    class PhoneFactory(metaclass=ABCMeta):
        @abstractmethod
        def make_shell(self):
            pass
    
        @abstractmethod
        def make_cpu(self):
            pass
    
        @abstractmethod
        def make_os(self):
            pass
    
    
    # ------具体产品------
    
    
    class SmallShell(PhoneShell):
        def show_shell(self):
            print("普通手机小手机壳")
    
    class BigShell(PhoneShell):
        def show_shell(self):
            print("普通手机大手机壳")
    
    class AppleShell(PhoneShell):
        def show_shell(self):
            print("苹果手机壳")
    
    
    class SnapDragonCPU(CPU):
        def show_cpu(self):
            print("骁龙CPU")
    
    
    class MediaTekCPU(CPU):
        def show_cpu(self):
            print("联发科CPU")
    
    
    class AppleCPU(CPU):
        def show_cpu(self):
            print("苹果CPU")
    
    
    class Android(OS):
        def show_os(self):
            print("Android系统")
    
    
    class IOS(OS):
        def show_os(self):
            print("iOS系统")
    
    
    # ------具体工厂------
    
    class MiFactory(PhoneFactory):
        def make_cpu(self):
            return SnapDragonCPU()
    
        def make_os(self):
            return Android()
    
        def make_shell(self):
            return BigShell()
    
    
    class HuaweiFactory(PhoneFactory):
        def make_cpu(self):
            return MediaTekCPU()
    
        def make_os(self):
            return Android()
    
        def make_shell(self):
            return SmallShell()
    
    
    class IPhoneFactory(PhoneFactory):
        def make_cpu(self):
            return AppleCPU()
    
        def make_os(self):
            return IOS()
    
        def make_shell(self):
            return AppleShell()
    
    
    # ------客户端------
    
    
    class Phone:
        def __init__(self, cpu, os, shell):
            self.cpu = cpu
            self.os = os
            self.shell = shell
    
        def show_info(self):
            print("手机信息:")
            self.cpu.show_cpu()
            self.os.show_os()
            self.shell.show_shell()
    
    
    def make_phone(factory):
        cpu = factory.make_cpu()
        os = factory.make_os()
        shell = factory.make_shell()
        return Phone(cpu, os, shell)
    
    
    
    p1 = make_phone(HuaweiFactory())
    p1.show_info()
    View Code

    e. 建造者模式

      

     

      

  • 相关阅读:
    命令行net time同步时间(内网)
    清理树莓派系统垃圾
    树莓派常用功能的安装和使用
    树莓派的媒体播放软件omxplayer
    树莓派安装FTP服务器
    Raspbian 中国软件源
    树莓派挂载和卸载U盘或移动硬盘
    树莓派上搭建NAS
    Aria2+yaaw+Chrome插件BaiduExporter实现百度网盘下载
    树莓派做下载机+Web服务器(Aria2下载+yaaw做UI+nginx)
  • 原文地址:https://www.cnblogs.com/golangav/p/7593223.html
Copyright © 2011-2022 走看看