N号林克

导航

设计模式学习记录2

设计模式设计原则:
1.单一职责原则:一个类应该只有一个能够引起他变化的原因。如果承担职责过多,就会把他们耦合在一起,一个职责的变化会引起其他的变化,也会影响代码复用性
2.开闭原则:即OCP,一个软件实体(类,函数方法,模块等)每次发生变化时,应该时通过添加代码来增加行为,而不是修改原有代码
最好的实现这一原则的方法:提供一个固有接口,然后让所有可能的类实现该接口,让固定的接口与对象交互
3.里氏替代原则:即LSP,子类必须在能够完全替代父类的情况且软件不受影响的情况下,父类的函数才能安全的重用,子类才能安全的修改。里氏替代原则是实现ocp原则的重要方式
参考:正方形与长方形 正方形不能作为长方形的子类
4.依赖倒置原则:DIP,抽象不因该依赖于细节,细节应该依赖于抽象,即面向接口编程而不是面向实现编程,从而降低客户于具体实现的耦合
5.接口隔离原则:ISP,多个专门的接口比使用单一的总接口要好,不要让单一接口承担太多职责,把多个职责分离到多个接口中去。
6.合成复用原则:CRP,在新对象里面使用一些原有的对象,使之成为新对象的一部分。多用合成/聚合,少用继承
7.迪米特法则/最少知识原则:LOD/LKP,一个对象对其他对象应该尽少的了解。一个模块应该尽少的与其他实体交互,这样当一个模块修改时,其他模块的影响会变小,已于扩展
 
创建型模式:以下模式都属于创建型模式,共同点:第一,它们都将系统使用哪些具体类的信息封装起来;第二,它们隐藏了这些类的实例是如何被创建和组织的
 
单例模式:确保一个类只有一个实例。通过私有构造函数来实现类外部不能对类实例化
提供一个全局访问点,通过一个返回该类对象的静态方法来实现
 
工厂方法模式:实现一个创造对象的接口,把创建对象这一工作推迟到子类中实现,让子类来决定创建对象的种类
定义一个工厂接口:创建一个工厂类
创建工厂类,将对象创建推迟到子类:创建类继承工厂类,由创建类创建不同产品
不同产品继承产品类,需要增加产品时只需要加一个产品类和一个创建工厂类
 
抽象工厂模式:提供一个创建一系列相关或相互依赖的接口,使得客户可以在不必指定产品的具体类型下 ,创建多个产品族中的对象,强调系列对象的变化
提供一系列对象的接口:提供多个产品的抽象接口
创建多个产品族中的产品对象:每一个具体的创建工厂创建产品族中的多个产品对象,多个具体的创建工厂可以实现创建多个产品族的多个产品对象。工厂创建产品的多元化
 
建造者模式:将一个复杂对象的构建和他的表示分裂,通过同样的构建可以完成不同的表示
如何割裂:将产品的构造过程放在建造者中,由建造者来负责,产品的内部放在产品类中
 
原型工厂模式:通过给出一个原型对象来指明产品类型,通过复制该产品来创建同类对象
给出原型对象:给出一个原型类
通过复制:.net直接调用MemberwiseClone方法来实现浅拷贝
结构型模式:一是类结构型模式,指的是采用继承机制来组合接口或实现;二是对象结构型模式,指的是通过组合对象的方式来实现新的功能。它包括适配器模式、桥接模式、装饰者模式、组合模式、外观模式、享元模式和代理模式。
 
适配器模式:使原本不能在一起工作的两个类一起工作,包括类适配模式、对象适配器模式
 
桥接模式:将抽象化与实现解耦,使得两者可以独立地变化。将基类的实现细节重新放入另一个抽象化类中,在基类中引用抽象类
例子:
装饰者模式:可以动态的给类增加一些新功能,较继承子类的方法比起来更加灵活,但会产生一些小的对象,增加系统复杂度
组合模式:使客户将复杂对象和简单对象同等对待,
例子:透明式组合模式,
安全式组合模式:
外观模式:客户端经常与子系统交互,将子系统与客户端解耦。为子系统中的一组接口提供一个一致的门面,提供一个高层接口,使子系统更加容易使用
享元模式:需要重复使用一个对象的时候,使用new需要多次申请内存,造成内存使用过多
通过创建一个对象,下一次创建时进行修改,让对象共享
定义:享元模式——运用共享技术有效地支持大量细粒度的对象。享元模式可以避免大量相似类的开销,在软件开发中如果需要生成大量细粒度的类实例来表示数据,如果这些实例除了几个参数外基本上都是相同的,这时候就可以使用享元模式来大幅度减少需要实例化类的数量。如果能把这些参数(指的这些类实例不同的参数)移动类实例外面,在方法调用时将他们传递进来,这样就可以通过共享大幅度地减少单个实例的数目。(这个也是享元模式的实现要领),然而我们把类实例外面的参数称为享元对象的外部状态,把在享元对象内部定义称为内部状态。具体享元对象的内部状态与外部状态的定义为:
内部状态:在享元对象的内部并且不会随着环境的改变而改变的共享部分
外部状态:随环境改变而改变的,不可以共享的状态。
代理模式:有些对象由于网络或其他的障碍,以至于不能直接对其访问,此时可以通过一个代理对象来实现对目标对象的访问
 
 注:外观模式、适配器模式和代理模式区别?
  解答:这三个模式的相同之处是,它们都是作为客户端与真实被使用的类或系统之间的一个中间层,起到让客户端间接调用真实类的作用,不同之处在于,所应用的场合和意图不同。
  代理模式与外观模式主要区别在于,代理对象无法直接访问对象,只能由代理对象提供访问,而外观对象提供对各个子系统简化访问调用接口,而适配器模式则不需要虚构一个代理者,目的是复用原有的接口。外观模式是定义新的接口,而适配器则是复用一个原有的接口。
  另外,它们应用设计的不同阶段,外观模式用于设计的前期,因为系统需要前期就需要依赖于外观,而适配器应用于设计完成之后,当发现设计完成的类无法协同工作时,可以采用适配器模式。然而很多情况下在设计初期就要考虑适配器模式的使用,如涉及到大量第三方应用接口的情况;代理模式是模式完成后,想以服务的方式提供给其他客户端进行调用,此时其他客户端可以使用代理模式来对模块进行访问。
  总之,代理模式提供与真实类一致的接口,旨在用来代理类来访问真实的类,外观模式旨在简化接口,适配器模式旨在转换接口。

 

posted on 2020-07-15 16:42  N号林克  阅读(134)  评论(0编辑  收藏  举报