攀枝花建设工程有限责任公司网站,2345网址大全电视剧,公司做网站需要多少钱,如何做网站与网页23种计模式之 前言 #xff08;5#xff09;单例模式、工厂模式、简单工厂模式、抽象工厂模式、建造者模式、原型模式、(7)代理模式、装饰器模式、适配器模式、门面模式、组合模式、享元模式、桥梁模式、#xff08;11#xff09;策略模式、责任链模式、命令模式、中介者模…23种计模式之 前言 5单例模式、工厂模式、简单工厂模式、抽象工厂模式、建造者模式、原型模式、(7)代理模式、装饰器模式、适配器模式、门面模式、组合模式、享元模式、桥梁模式、11策略模式、责任链模式、命令模式、中介者模式、模板模式、迭代器模式、访问者模式、观察者模式、解释器模式、备忘录模式、状态模式 设计原则
23-Python与设计模式–设计原则
一 六大设计原则
在法理学中法律规则与法律原则都是法律规范的重要构成。但二者也会有些不同法律规则是指采取一定的
结构形式具体规定人们的法律权利、法律义务以及相应的法律后果的行为规范内容比较明确比如
交通法规中规定禁止闯红灯法律原则是指在一定法律体系中作为法律规则的指导思想基本或本原的、
综合的、稳定的原理和准则内容上只包含“大方针”而并未有具体规则比如如果车上有马上临产的孕妇
闯红灯不会被处罚这是符合重视生命的原则。设计模式与设计原则基本符合规则与原则的关系
设计模式是一个个具体问题的解决方案设计原则则反映了这些设计模式的指导思想
同时设计原则可衍生出的设计模式也不仅限于上述介绍到了23种设计模式任何一种针对特定业务场景中的
解决方法虽然找不到对应的设计模式与之匹配但若符合设计原则也可以认为是一种全新的设计模式。
从这个意义上来说设计模式是程序设计方法的形而设计原则是程序设计方法的神。1、单一职责原则
单一职责原则英文原名为Single Responsibility Principle简称SRP原则。
其含义为应该有且仅有一个原因引起类的变更。举个例子来说明单一职责原则一个视频播放系统
一个客户端类有两个功能接口即视频播放接口和音频播放接口。虽然这样的设计很常见
但却不满足单一职责原则的。原因是如果对视频播放有变更需求或者对音频播放有修改需求
都会变更视频客户端的类结构。符合单一原则的设计是将视频播放单元和音频播放单元各建一个类
播放客户端继承两个类构成客户端。单一职责原则的最大难点在于职责的划分试想以上划分是否是符合单一职责了既是也不是。
试想如果将视频传输和音频传输的协议信息和数据信息区分开为符合这种粒度的单一职责原则就必须要有
协议传输类和数据传输类的划分。如果接着细分可能一个简单的小模块都要设计非常多的类。
因此单一职责原则粒度的选择应该根据业务流程和人员分工来进行考虑。一些基本的划分
似乎已经成了行业规范性的内容比如业务逻辑与用户信息管理的划分等。2、里氏替换原则
里氏替换原则英文原名为Liskov Substitution Principle简称LSP原则。
它是面向对象设计的最为基本原则之一。 里氏替换原则的含义为任何基类可以出现的地方
子类一定可以出现。 LSP是继承复用的基石只有当子类可以替换掉基类软件单位的功能不受到影响时
基类才能真正被复用子类也能够在基类的基础上增加新的行为。举例说明对于一个鸟类
可以衍生出麻雀、喜鹊、布谷等子类这些子类都可继承鸟类的鸣叫、飞行、吃食等接口。
而对于一个鸡类虽然它在生物学上属于鸟类但它不会飞那么符合LSP设计原则的情况下
鸡就不应该是鸟的一个子类在鸟类调用飞行接口的地方鸡类并不能出现。如果鸡类要使用鸟类的接口
应该使用关联关系而不是继承关系。3、依赖倒置原则
依赖倒置原则英文原名为Dependence Inversion Principle简称DIP原则。
它的含义为高层模块不应该依赖于低层模块两者都应该依赖其抽象。抽象不应该依赖于细节
细节应该依赖于抽象。我们将每个不可细分的逻辑叫作原子逻辑原子逻辑组装形成低层模块
低层模块组装形成高层模块。依赖倒置原则的含义为高层模块和低层模块都应该由各自的抽象模块派生而来
同时接口设计应该依赖于抽象而非具体模块。举个例子司机与汽车是依赖的关系司机可以有实习司机类、
老司机类等派生汽车可以有轿车、SUV、卡车等派生类。如果司机中设计一个接口drive汽车是其参数
符合DIP设计原则的参数应该是在基类司机类中将基类汽车类作为参数而司机的派生类中
drive的参数同样应该为基类汽车类而不应该是汽车类的任一个派生类。如果规定实习司机只能开轿车等
业务逻辑应该在其接口中进行判断而不应该将参数替换成子类轿车。4、接口隔离原则
接口隔离原则英文原名为Interface Segregation Principle简称ISP原则。
其含义为类间的依赖关系不应该建立一个大的接口而应该建立其最小的接口
即客户端不应该依赖那些它不需要的接口。这里的接口的概念是非常重要的。从逻辑上来讲
这里的接口可以指一些属性和方法的集合
从业务上来讲接口就可以指特定业务下的接口如函数URL调用等。接口应该尽量小
同时仅留给客户端必要的接口弃用没有必要的接口。举例说明如果要根据具体的数据
生成饼图、直方图、表格这个类该如何设计如果将生成饼图、直方图、表格等“接口”
这里的接口就是“操作”的集合的概念写在一个类中是不符合接口隔离原则的。
符合ISP原则的设计应该是设计三个类每个类分别实现饼图、直方图、表格的绘制。接口隔离原则和单一职责原则一样涉及到粒度的问题解决粒度大小同样依赖于具体的业务场景
需要读者根据实践去权衡。5、迪米特法则最少知识原则
迪米特法则Law of Demeter也叫最少知识原则英文Least Knowledge Principle简称LKP原则。
其含义为一个对象应该对其它对象有最少的了解。举例说明一个公司有多个部门每个部门有多个员工
如果公司CEO要下发通知给每个员工是调用接口直接通知所有员工么其实不然CEO只需和它的“朋友”类部门
Leader交流就好部门Leader再下发通知信息即可。而CEO类不需要与员工进行“交流”。
迪米特法则要求对象应该仅对自己的朋友类交流而不应该对非朋友类交流。那什么才是朋友类呢一般来说
朋友类具有以下特征
1当前对象本身self
2以参量形式传入到当前对象方法中的对象
3当前对象的实例变量直接引用的对象
4当前对象的实例变量如果是一个聚集那么聚集中的元素也都是朋友
5当前对象所创建的对象。6、开闭原则
开闭原则英文原名为Open Closed Principle简称OCP原则。其含义为一个软件实体
如类、模块、函数等应该对扩展开放对修改关闭。开闭原则是非常基础的一个原则
也有人把开闭原则称为“原则的原则”。前面讲到过模块分原子模块低层模块高层模块
业务层可以认为是最高层次的模块。对扩展开放意味着模块的行为是可以扩展的当高层模块需求改变时
我们可以对低层模块进行扩展使其具有满足高层模块的新功能对修改关闭即对低层模块行为进行扩展时
不必改动模块的源代码。最理想的情况是业务变动时仅修改业务代码不修改依赖的模块类、函数等
代码通过扩展依赖的模块单元来实现业务变化。举例说明假设一个原始基类水果类苹果类是它的派生类
苹果中包含水果的各种属性如形状、颜色等另有两个类农民类和花园类最高层次业务层次为农民
在花园种苹果。如果此时农民决定不种苹果了改种梨符合OCP原则的设计应该为基于水果类构建一个
新的类即梨类对扩展开放而并不应该去修改苹果类使它成为一个梨类对修改关闭。
修改应仅在最高层即业务层中进行。二 遵循设计原则的好处
由于设计原则是设计模式的提炼因而设计原则的好处与设计模式是一致的
即代码易于理解更适于团体合作适应需求变化等。三、设计原则与设计模式
1、创建类设计模式与设计原则
工厂模式工厂方法模式是一种解耦结构工厂类只需要知道抽象产品类符合最少知识原则迪米特法则
同时符合依赖倒置原则和里氏替换原则抽象工厂模式抽象工厂模式具有工厂模式的优点但同时如果产品族要扩展工厂类也要修改
违反了开闭原则模板模式优秀的扩展能力符合开闭原则。2、结构类设计模式与设计原则
代理模式代理模式在业务逻辑中将对主体对象的操作进行封装合适的应用会符合开闭原则和单一职责原则事实上几乎带有解耦作用的结构类设计模式都多少符合些开闭原则门面模式门面模式不符合开闭原则有时不符合单一职责原则如若不注意也会触碰接口隔离原则组合模式符合开闭原则但由于一般在拼接树时使用实现类故不符合依赖倒置原则桥梁模式桥梁模式堪称依赖倒置原则的典范同时也符合开闭原则。3、行为类设计模式与设计原则
策略模式符合开闭原则但高层模块调用时不符合迪米特法则。
行为类设计模式多少会符合些单一职责原则典型的如观察者模式、中介者模式、访问者模式等责任链模式符合单一职责原则和迪米特法则命令模式符合开闭原则。在不同的业务逻辑中不同的设计模式也会显示出不同的设计原则特点从这个意义上来说
设计模式是设计原则的体现但体现不是固定的是根据业务而有所不同的。