设计模式总结

                                                                        设计模式总结

1、创建型模式
  1)单件(Singleton)模式解决的是实体对象个数的问题。除了Singleton之外,其他创建型模式解决的都是new所带来的耦合关系。
  2)工厂方法(Factory Method)模式,抽象工厂(Abstract Factory)模式,创建者(Builder)模式都需要一个额外的工厂类来负责实例化“易变对象”,而原型(Prototype)模式则是通过原型(一个特殊的工厂类)来克隆“易变对象”。
  3)如果遇到“易变类”,起初的设计通常从Factory Method开始,当遇更多的复杂变化时,再考虑重构为其他三种工厂模式(Abstract Factory,Builder,Prototype)。
 
2、结构型模式
  1)适配器(Adapter)模式注重转换接口,将不吻合的接口适配对接。
  2)桥接(Bridge)模式注重分离接口与其实现,支持多维度变化。
  3)组合(Composite)模式注重统一接口,将“一对多”的关系转化为“一对一”的关系。
  4)装饰(Decorator)模式注重稳定接口,在此前提下为对象扩展功能。
  5)外观(Facade)模式注重简化接口,简化组件系统与外部客户程序的依赖关系。
  6)享元(Flyweigth)模式注重保留接口,在内部使用共享技术对对象存储进行优化。
  7)代理(Proxy)模式注重假借接口,增加间接层来实现灵活控制。
 
3、行为型模式
  1)模版方法(Template Method)模式封装算法结构,支持算法子步骤变化。
  2)策略(Strategy)模式注重封装算法,支持算法的变化。
  3)状态(State)模式注重封装与状态相关的行为,支持状态的变化。
  4)备忘录(Memento)模式注重封装对象状态变化,支持状态保存/恢复。
  5)中介者(Mediator)模式注重封装对象间的交互,支持对象交互的变化。
  6)职责链(Chain Of Responsibility)模式注重封装对象责任,支持责任的变化。
  7)命令(Command)模式注重将请求封装为对象,支持请求的变化。
  8)迭代器(Iterator)模式注重封装集合对象内部结构,支持集合的变化。
  9)解释器(Interpreter)模式注重封装特定领域变化,支持领域问题的频繁变化。
  10)观察者(Observer)模式注重封装对象通知,支持通信对象的变化。
  11)访问者(Visitor)模式注重封装对象操作变化,支持在运行时为类层次结构动态添加新的操作。

4、实例:切割文件
//记录进度条进度
public class CutFileEventArgs
{
  private double _value;
 
  public double Value
  {
    get
    {
      return this._value;
    }
    set
    {
      this._value = value;
    }
  }
}

//委托代替观察者模式
public delegate void MyDelegate(object sender, CutFileEventArgs args);

/// <summary>
/// 接口:分割文件
/// </summary>
public interface ISplitFile
{
  /// <summary>
  /// 文件名称
  /// </summary>
  string FileNmae
  {
    get;
    set;
  }

  /// <summary>
  /// 分割个数/分割大小
  /// </summary>
  int CutNumber
  {
     get;
     set;
  }

  /// <summary>
  /// 开始分割
  /// </summary>
  /// <returns></returns>
  void StartCut();

  event MyDelegate CutEvent;
}

    /// <summary>
    /// 按分文件个数切割文件
    /// </summary>
    public class CutFileNumber : ISplitFile
    {
        private string _fileName;
        private int _cutNumber;

        //响应进度条的事件
        public event MyDelegate CutEvent;

        public CutFileNumber(string fileName, int cutNumber)
        {
            this._fileName = fileName;
            this._cutNumber = cutNumber;
        }

        public string FileNmae
        {
            get
            {
                return this._fileName;
            }
            set
            {
                this._fileName = value;
            }
        }

        public int CutNumber
        {
            get
            {
                return this._cutNumber;
            }
            set
            {
                this._cutNumber = value;
            }
        }

        public void StartCut()
        {
            FileStream fsRead = new FileStream(_fileName, FileMode.Open);
            long length = fsRead.Length;
            BinaryReader reader = new BinaryReader(fsRead);
            CutFileEventArgs args = new CutFileEventArgs();

            int writerLength = (int)length / _cutNumber;
            int lastLength = writerLength + (int)length % _cutNumber;

            for (int i = 0; i < _cutNumber; i++)
            {
                if (CutEvent != null)
                {
                    args.Value = (double)i / (double)_cutNumber;
                    this.CutEvent(this, args);
                }

                //从dsRead中读取数据
                byte[] data;

                if (i == _cutNumber - 1)
                {
                    data = reader.ReadBytes(lastLength);
                }
                else
                {
                    data = reader.ReadBytes(writerLength);
                }
                //将读取出来的数据写入一个新的文件中
                string newFileName = _fileName + (i + 1) + "split";
                FileStream newFS = new FileStream(newFileName, FileMode.Create);
                BinaryWriter writer = new BinaryWriter(newFS);
                writer.Write(data);

                writer.Close();
                newFS.Close();
            }
        }
    }

5、设计模式应用总结
  1)设计模式建立在对系统变化点的基础上进行,哪里有变化点,哪里用设计模式。
  2)设计模式应该以演化的方式来获得,系统的变化点往往是经过不断演化才能准确定位。
  3)不能为了模式而模式,设计模式是一种软件设计的软力量,而非规范标准。不应夸大设计模式的作用。

你可能感兴趣的:(设计模式总结)