zoukankan      html  css  js  c++  java
  • 哪些设计模式最值得学习

    人的时间是有限的,23个模式也不是都那么常用,哪些模式才是最经常用到的,才是最值得学习的呢?

    第一梯队:Iterator,Observer,Template Method,Strategy

    Iterator:LINQ,foreach这不都是Iterator么。

    Observer:MVC的核心,.NET中事件就是Observer。

    Strategy:对同一个行为有不同实现的时候,如果考虑将行为的实现委托(不是.NET中的委托)给另一个类,那就用到了Strategy。通过这种方式,可以简单的替换算法的实现类,来达到更换算法的目的。

    代码
    class Foo
    {
      
    private IBar bar;
      
    public Foo(IBar bar)
      {
        
    this.bar = bar;
      }

      
    public void DoSomething()
      {
        
    //some code
        bar.DoWhatYouWant();
        
    //some code
      }
    }

    class A : IBar
    {
      
    public void DoWhatYouWant()
      {
        
    //do in A's way
      }
    }
    class B : IBar
    {
      
    public void DoWhatYouWant()
      {
        
    //do in B's way
      }
    }

    Template Method:一个算法的同一个步骤有不同的实现,通过继承来实现。这种方式通过创建子类来改变算法的实现和行为。ASP.NET WebForm中Page的OnInit,OnLoad等事件,就是Template Method

    代码
    class Foo
    {
      
    public void DoSomething()
      {
        
    //some code
        DoWhatYouWant();
        
    //some code
      }
      
    protected abstract void DoWhatYouWant();
    }

    class A: Foo
    {
      
    protected override void DoWhatYouWant();
      {
        
    //do in A's way
      }
    }

    class B: Foo
    {
      
    protected override void DoWhatYouWant();
      {
        
    //do in B's way
      }
    }

    面向对象的一个重要特点就是多态,也就是对于同一个动作有不同的行为。Strategry通过委托的方式,将一个算法的不同实现委托给其它类;Template Method通过继承的方式,让子类实现算法的可变部分,基类则处理算法的流程和不变部分。近年来组合优于继承的观点已经成为主流,因此Strategy的处境频率相对高一些,但是Template Method在解决简单问题的时候更好用,只要注意继承层次不要太多(<=3)就好。

    第二梯队:Adapter,Facade,Decorator

    Adapter:当你需要使用第三方库,但是又不想太依赖于它的API,以便于今后在需要时可以方便的切换到另一个库的时候,你就需要在你的代码和第三方API之间放置一个抽象层,也就需要用Adapter模式了。比如你想使用log4net,如果直接在代码中到处引用log4net的API,将来有一天需要切换到另一个库比如EntLib,你的改动量可就大了去了。如果在一开始就自己设计一个API,在代码中使用自己的API,再用Adapter模式将log4net的API包装到自己的API中,如果有一天想要切换到Entlib,只要为EntLib在写一个Adapter就行了。对于IoC框架也是一样的。不过需要注意的是,如果第三方库的API接口非常庞大,使用Adapter就会很麻烦,因为你需要包装太多的东西,那么使用Adapter可能就不是一个太好的主意。或许谨慎考虑确定一个不太可能会变化的第三方库更好一些。

    Facade:基本上用于简化API,隐藏细节,在一个系统中,高层模块调用低层模块时,如果低层模块API比较复杂,而高层模块并不需要这种复杂度,那么加一个Facade,可以简化高层模块使用API的难度。

    Decorator:为一个类的行为增加行为,比如ASP.NET MVC中的Action Filter。

    第三梯队:Command,State,Composite

    Command:统一接口,Undo/Redo。

    State:当你的model有多种状态,model的行为在每种状态下并不一样的时候,就需要用State。如果你有多个相似的Switch,那也可能意味着需要用State来代替Switch。

    Composite:ASP.NET WebForm的Page和Control就是一个例子。

    这些模式和分类只是凭我的感觉,并没有任何实际的数据做支持,而我的感觉也只来源于我所接触到的领域和代码。 希望同学们也可以提供自己接触到的代码中,最常见到和用到的模式。

  • 相关阅读:
    【python cookbook】替换字符串中的子串(使用Template)
    python 学习sys
    【python cookbook】 替换字符串中的子串
    Python文件读写
    【python cookbook】python过滤字符串中不属于指定集合的字符
    【python cookbook】改变多行文本字符串的缩进
    python字符编码
    【python cookbook】python访问子字符串
    【python cookbook】python 控制大小写
    过关了
  • 原文地址:https://www.cnblogs.com/aaa6818162/p/1680073.html
Copyright © 2011-2022 走看看