• 设计模式


    面向对象设计模式是"好的面向对象设计",所谓“好的面向对象设计”是那些可以满足“应对变化,提高复用”的设计。

    Gof

    软件经常要面对变化

    敏捷软件开发

    使用 设计模式的目的是为了减少 需求变化带来的影响 (少写代码)

    三大设计原则

    1)针对接口编程,而不是针对实现编程

    - 客户(调用程序的程序、客户程序)无需知道所使用对象的特定类型,只需要知道对象拥有客户所期望的接口。

    2)优先使用对象组合,而不是类继承

    - 类继承通常为了“白箱复用”,对象组合通常为了“黑箱复用”。继承在某种程序上破坏了封装性,子类父类耦合度高;而对象组合则只要求被组合的对象具有良好定义的接口,耦合度低。

    3)封装变化点

    - 使用封装来创建对象之间的分界层,让设计者可以在分界层的一侧进行修改,而不会对另一侧产生不良的影响,从而实现层次间的松耦合。

    4) 使用重构得到模式

    - 设计模式的应用不宜先入为主,一上来就使用设计模式是对设计模式的最大误用。没有一步到位的设计模式。敏捷软件开发初中提倡的“Refactoring to Patterns”是目前普遍公众的最好的使用设计模式的方法。

    单例模式

    在软件系统中,经常有这样一些特殊的类,必须保证它们在系统中只存在一个实例,才能确保它们的逻辑正确性、以及良好的效率。

    如何绕过常规的构造器,提供一种机制来保证一个类只有一个实例?

    这应该是类设计者的责任,而不是使用者(调用者)的责任。

    public class Singleton
    {
      private static Singleton instance;
      private Singleton(){};
      public static Singleton Instance
      {
        get
       { if(instance==null) { instance = new Singleton(); } return instance; } } }

    单例构造代码片段

    多线程构造单例

    单例readonly实现

    Singleton模式中的实例构造器可以设置为protected以允许子类派生。

    Singleton模式一般不要支持ICloneable接口,因为这可能会导致多个对象实例,与Singleton模式的初衷违背。

    Singleton模式一般不要支持序列化,因为这也有可能导致多个对象实例,同样与Singleton模式的初衷违背。

    Singleton模式只考虑到了对象创建的管理,没有考虑对象销毁的管理。就支持垃圾回收的平台和对象的开销来说,我们一般没有必要对其销毁进行特殊的管理。

    不能应对多线程环境:在多线程环境下,使用Singleton模式仍然有可能得到Singleton类的多个实例对象。

    Abstract Factory 抽象工厂(创建型模式)

    工厂模式

    抽象工厂

    面向接口编程 ——依赖接口,而非实现

    变化点

    在软件系统中,经常面临着“一系列相互依赖的对象”的创建工作;同时,由于需求的变化,往往存在更多系列对象的创建工作。

    如何应对这种变化?如何绕过常规的对象创建方法(new),提供一种“封装机制”来避免客户程序和这种“多系列具体对象创建工作”的紧耦合?

    提供一个接口,让该接口负责创建一系列“相关或者相互依赖的对象”,无需指定它们具体的类。

     抽象工厂简单示例

     抽象工厂农场示例

    发布-订阅模型(观察者模式)

    定义对象间的一种一对多的依赖关系,以便当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动更新。

    示例: 账户取钱后,发送通知。发送手机短信、邮件、发送通知等。

    接口 是面向 对象的核心思想

    使用面向对象的抽象,Observer模式使得我们可以独立地改变目标与观察者,从而使二者之间的依赖关系达到松耦合。

    目标发送通知时,无需指定观察者,通知会自动传播。

    观察者模式资料1

    观察者模式资料2

  • 相关阅读:
    .net验证是否合法邮箱和ip地址的方式
    .net通用类型转换方法
    asp.net中的<%%>的使用
    autofac初识
    .net面试题
    asp.net使用一般处理程序实现文件下载
    asp.net 一般处理程序接收上传文件的问题
    Python学习日记(十八) 序列化模块
    Python学习日记(十七) os模块和sys模块
    Python学习日记(十六) time模块和random模块
  • 原文地址:https://www.cnblogs.com/rockywood/p/6559631.html
Copyright © 2020-2023  润新知