设计模式
设计模式:对软件设计中普遍存在的各种问题,所提出的解决方案。每一个设计模式系统地命名、解释和评价了面向对象系统中一个重要的和重复出现的设计。“四人帮”:ErichGamma,RichardHelm,RalphJohnson,JohnVlissides《设计模式:可复用面向对象软件的基础》面向对象的三大特性:封装继承多态接口:若干抽象方法的集合。作用︰限制实现接口的类必须按照接口给定的调用方式实现这些方法;对高层模块隐藏了类的内部实现。fromabcimportABCMeta,abstractmethod#接口classPayment:#abstractclass@abstractmethoddefpay:passclassAlipay:defpay:printclassWechatPay:defpay:printp=WechatPayp.pay
知识点二:面对对象设计原则
面对对象设计SOLID原则开放封闭原则:一个软件实体如类、模块和函数应该对扩展开放,对修改关闭。即软件实体应尽量在不修改原有代码的情况下进行扩展。里氏替换原则:所有引用父类的地方必须能透明地使用其子类的对象。依赖倒置原则:高层模块不应该依赖低层模块,二者都应该依赖其抽象;抽象不应该依赖细节;细节应该依赖抽象。换言之,要针对接编程,而不是针对实现编程。接口隔离原则:使用多个专门的接口,而不使用单—的总接口,即客户端不应该依赖那些它不需要的接口。单一职责原则:不要存在多于一个导致类变更的原因。通俗的说,即一个类只负责一项职责。代码实现#-*-coding:utf-8-*-fromabcimportABCMeta,abstractmethodclassLandAnimal:@abstractmethoddefwalk:passclassWaterAnimal:@abstractmethoddefswim:passclassSkyAnimal:@abstractmethoddeffly:passclassTiger:defwalk:printclassFrog:pass设计模式分类创建型模式︰工厂方法模式、抽象工厂模式、创建者模式、原型模式、单例模式结构型模式︰适配器模式、桥模式、组合模式、装饰模式、外观模式、享元模式、代理模式行为型模式︰解释器模式、责任链模式、命令模式、迭代器模式、中介者模式、备忘录模式、观察者模式、状态模式、策略模式、访问者模式、模板方法模式
知识点三:创造型模式
简单工厂模式
内容:不直接向客户端暴露对象创建的实现细节,而是通过一个工厂类来负责创建产品类的实例。角色:工厂角色抽象产品角色具体产品角色简单工厂模式优缺点优点:隐藏了对象创建的实现细节客户端不需要修改代码缺点∶违反了单一职责原则,将创建逻辑几种到一个工厂类里当添加新产品时,需要修改工厂类代码,违反了开闭原则代码实现#-*-coding:utf-8-*-fromabcimportABCMeta,abstractmethod#接口classPayment:#abstractclass@abstractmethoddefpay:passclassAlipay:def__init__:self.use_huabei=use_huabeidefpay:ifself.use_huabei:printelse:printclassWechatPay:defpay:printclassPaymentFactory:defcreate_payment:ifmethod=="alipay":returnAlipayelifmethod=="wechat":returnWechatPayelifmethod=="huabei":returnAlipayelse:raiseTypeError#clientpf=PaymentFactoryp=pf.create_paymentp.pay
工厂方法模式
内容:定义一个用于创建对象的接口,让子类决定实例化哪一个产品类。角色:抽象工厂角色具体工厂角色抽象产品角色具体产品角色简单工厂模式优缺点优点︰每个具体产品都对应一个具体工厂类,不需要修改工厂类代码隐藏了对象创建的实现细节缺点︰每增加一个具体产品类,就必须增加一个相应的具体工厂类代码实现#-*-coding:utf-8-*-fromabcimportABCMeta,abstractmethod#接口classPayment:#abstractclass@abstractmethoddefpay:passclassAlipay:def__init__:self.use_huabei=use_huabeidefpay:ifself.use_huabei:printelse:printclassWechatPay:defpay:printclassBankPay:defpay:printclassPaymentFactory:@abstractmethoddefcreate_payment:passclassAlipayFactory:defcreate_payment:returnAlipayclassWechatPayFactory:defcreate_payment:returnWechatPayclassHuabeiFactory:defcreate_payment:returnAlipayclassBankPayFactory:defcreate_payment:returnBankPay#clientpf=HuabeiFactoryp=pf.create_paymentp.pay
抽象工厂模式
内容:定义一个工厂类接口,让工厂子类来创建一系列相关或相互依赖的对象。例:生产―部手机,需要手机壳、CPU、操作系统、类对象进行组装,其中每类对象都有不同的种类。对每个具体工厂,分别生产一部手机所需要的三个对象。相比工厂方法模式,抽象工厂模式中的每个具体工厂都生产—套产品。抽象工厂模式角色抽象工厂角色具体工厂角色抽象产品角色具体产品角色客户端抽象工厂模式优缺点优点:将客户端与类的具体实现相分离每个工厂创建了一个完整的产品系列,使得易于交换产品系列有利于产品的一致性缺点∶难以支持新种类的产品代码实现#-*-coding:utf-8-*-fromabcimportabstractmethod,ABCMeta#----------抽象产品----------classPhoneShell:@abstractmethoddefshow_shell:passclassCPU:@abstractmethoddefshow_cpu:passclassOS:@abstractmethoddefshow_os:pass#----------抽象工厂----------classPhoneFactory:@abstractmethoddefmake_shell:pass@abstractmethoddefmake_cpu:pass@abstractmethoddefmake_os:pass#----------具体产品----------classSmallShell:defshow_shell:printclassBigShell:defshow_shell:printclassAppleShell:defshow_shell:printclassSnapDragonCPU:defshow_cpu:printclassMediaTekCPU:defshow_cpu:printclassAppleCPU:defshow_cpu:printclassAndroid:defshow_os:printclassIOS:defshow_os:print#----------具体工厂----------classMiFactory:defmake_cpu:returnSnapDragonCPUdefmake_os:returnAndroiddefmake_shell:returnBigShellclassHuaweiFactory:defmake_cpu:returnMediaTekCPUdefmake_os:returnAndroiddefmake_shell:returnSmallShellclassIPhoneFactory:defmake_cpu:returnAppleCPUdefmake_os:returnIOSdefmake_shell:returnAppleShell#----------客户端----------classPhone:def__init__:self.cpu=cpuself.os=osself.shell=shelldefshow_info:printself.cpu.show_cpuself.os.show_osself.shell.show_shelldefmake_phone:cpu=factory.make_cpuos=factory.make_osshell=factory.make_shellreturnPhonep1=make_phone)pshow_info
建造者模式
内容:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。角色∶抽象建造者具体建造者指挥者产品解释:建造者模式与抽象工厂模式相似,也用来创建复杂对象。主要区别是建造者模式着重一步步构造一个复杂对象,而抽象工厂模式着重于多个系列的产品对象。优点︰隐藏了一个产品的内部结构和装配过程将构造代码与表示代码分开可以对构造过程进行更精细的控制代码#-*-coding:utf-8-*-fromabcimportABCMeta,abstractmethodclassPlayer:def__init__:self.face=faceself.body=bodyself.arm=armself.leg=legdef__str__:return"%s,%s,%s,%s"%classPlayerBuilder:@abstractmethoddefbuild_face:passdefbuild_body:passdefbuild_arm:passdefbuild_leg:passclassSexyGirlBuilder:def__init__:self.player=Playerdefbuild_face:self.player.face="漂亮脸蛋"defbuild_body:self.player.body="苗条"defbuild_arm:self.player.arm="漂亮胳膊"defbuild_leg:self.player.leg="大长腿"classMonster:def__init__:self.player=Playerdefbuild_face:self.player.face="怪兽脸"defbuild_body:self.player.body="怪兽身材"defbuild_arm:self.player.arm="长毛的胳膊"defbuild_leg:self.player.leg="长毛的腿"classPlayerDirector:#控制组装顺序defbuild_player:builder.build_bodybuilder.build_facebuilder.build_armbuilder.build_legreturnbuilder.player#clientbuilder=SexyGirlBuilderdirector=PlayerDirectorp=director.build_playerprint
单例模式
内容:保证一个类只有一个实例,并提供一个访问它的全局访问点。角色:单例优点︰对唯一实例的受控访问单例相当于全局变量,但防止了命名空间被污染代码:classSingleton:def__new__:ifnothasattr:cls._instance=super.__new__returncls._instanceclassMyClass:def__init__:self.a=aa=MyClassb=MyClassprintprintprint,id)创建型模式小结:抽象工厂模式和建造者模式相比于简单工厂模式和工厂方法模式而言更灵活也更复杂。通常情况下、设计以简单工厂模式或工厂方法模式开始,当你发现设计需要更大的灵活性时,则像更复杂的设计模式演化。
知识点四:结构型模式
适配器模式
桥模式
内容:将一个事物的两个维度分离,使其都可以独立地变化。角色:抽象细化抽象实现者具体实现者应用场景:当事物有两个维度上的表现,两个维度都可能扩展时。优点︰抽象和实现相分离优秀的扩展能力代码#-*-coding:utf-8-*-fromabcimportABCMeta,abstractmethodclassShape:def__init__:self.color=color@abstractmethoddefdraw:passclassColor:@abstractmethoddefpaint:passclassRectangle:name="长方形"defdraw:#长方形逻辑self.color.paintclassCircle:name="圆形"defdraw:#圆形逻辑self.color.paintclassLine:name="直线"defdraw:#直线逻辑self.color.paintclassRed:defpaint:printclassGreen:defpaint:printshape=Rectangle)shape.drawshape2=Circle)shapedrawshape3=Line)shapedraw
组合模式
外观模式
内容:为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。角色:外观(facade)子系统类优点:减少系统相互依赖提高了灵活性提高了安全性代码#-*-coding:utf-8-*-classCPU:defrun:printdefstop:printclassDisk:defrun:printdefstop:printclassMemory:defrun:printdefstop:printclassComputer:def__init__:self.cpu=CPUself.disk=Diskself.memory=Memorydefrun:self.cpu.runself.disk.runself.memory.rundefstop:self.cpu.stopself.disk.stopself.memory.stop#Clientcomputer=Computercomputer.runcomputer.stop
代理模式
内容:为其他对象提供—种代理以控制对这个对象的访问。应用场景:远程代理︰为远程的对象提供代理虚代理:根据需要创建很大的对象保护代理:控制对原始对象的访问,用于对象有不同访问权限时角色:抽象实体实体代理优点︰远程代理:可以隐藏对象位于远程地址空间的事实虚代理:可以进行优化,例如根据要求创建对象保护代理:允许在访问一个对象时有一些附加的内务处理
知识点五:行为型模式
责任链模式
内容:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。角色:抽象处理者具体处理者客户端适用场景:有多个对象可以处理一个请求,哪个对象处理由运行时决定在不明确接收者的情况下,向多个对象中的一个提交一个请求优点:降低耦合度:一个对象无需知道是其他哪一个对象处理其请求代码:#-*-coding:utf-8-*-fromabcimportABCMeta,abstractmethodclassHandler:@abstractmethoddefhandle_leave:passclassGeneralManager:defhandle_leave:ifday<=10:printelse:printclassDepartmentManager:def__init__:self.next=GeneralManagerdefhandle_leave:ifday<=5:printelse:printself.next.handle_leaveclassProjectDirector:def__init__:self.next=DepartmentManagerdefhandle_leave:ifday<=3:printelse:printself.next.handle_leave#Clientday=12h=ProjectDirectorh.handle_leave
观察者模式
策略模式
内容:定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。角色:抽象策略具体策略上下文优缺点优点︰定义了一系列可重用的算法和行为消除了一些条件语句可以提供相同行为的不同实现缺点∶客户必须了解不同的策略代码:#-*-coding:utf-8-*-fromabcimportABCMeta,abstractmethodclassStrategy:@abstractmethoddefexecute:passclassFastStrategy:defexecute:printclassSlowStrategy:defexecute:printclassContext:def__init__:self.data=dataself.strategy=strategydefset_strategy:self.strategy=strategydefdo_strategy:self.strategy.execute#Clientdata="[...]"s1=FastStrategys2=SlowStrategycontext=Contextcontext.do_strategycontext.set_strategycontext.do_strategy
模板方法模式
内容:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。角色:抽象类∶定义抽象的原子操作﹔实现一个模板方法作为算法的骨架。具体类:实现原子操作适用场景:一次性实现一个算法的不变的部分各个子类中的公共行为应该被提取出来并集中到一个公共父类中以避免代码重复控制子类扩展代码:fromabcimportABCMeta,abstractmethodfromtimeimportsleepclassWindow:@abstractmethoddefstart:pass@abstractmethoddefrepaint:pass@abstractmethoddefstop:#原子操作/钩子操作passdefrun:#模板方法self.startwhileTrue:try:self.repaintsleepexceptKeyboardInterrupt:breakself.stopclassMyWindow:def__init__:self.msg=msgdefstart:printdefstop:printdefrepaint:printMyWindow.run
文章为作者独立观点,不代表 股票程序化软件自动交易接口观点