zoukankan      html  css  js  c++  java
  • Head First 设计模式阅读所得:策略模式(Strategy Pattern) 接口的用处(之一)

    周一从当当定的书,周4到的,看了20多页。讲的非常好。真的!以前看模式老是雾里看花的感觉。现在不一样,很清淅。

    可能你也和我一样,一直不明白,接口只不过是个规范,是个定义,是个好抽的抽象,她倒底有什么迷人的呢?看到下面,你也许能知道了接口真的是很迷人。

    策略模式用了三个原则:
    一、封装变化
    二、接口编程
    三、用组合代替继承

    -------------------------------
    一,封装变化
     所谓的封装变化,就是把子类中共同的属性和方法留在父类里,而把不同子类里的同一实现用一个具体的“行为”类给封装起来。[感谢kisskiki提醒,这儿来原写错了]
     如:
     public class 动物()
     {
     }

     每个不同的动物有不同的叫声,如果只是在父类里实现,那么继承过去后不同的动物叫声就要“覆盖”这个方法。复用性太差,这就是原来的,我一直用的非OO思想编程方式。

     那么,我们来把“变化的”声音给封装起来。(这里的变化的指的是具体的物动对象的不同的发音)

     public class 牛的行为
     {
      public void Sound()
      {
       Console.WriteLine("牛发出的声音");
      }
     }

     public class 羊的行为
     {
      public void Sound()
      {
       Console.WriteLine("羊发出的声音");
      }
     }

     ....

     这就是把变化的部分给封装起来了。

     那么,你可能很快就会说,这样做怎么复用呀?还是不能复用呀?这里就要用动第二个原则了。

    二,接口编程
     学OO编程的时候从一开始就听说要面向接口编程,而不要针对实现编程,可是我一直不明白是什么意思?那么这个倒底是什么意思呢?
     暂时先把这个问题放一边。来看看下面这个问题:怎么样才能把不同的封装后的行为给“挂”到一起呢?让他们联系起来呢?让他们复用呢?
     答案就是:接口。

     public interface I动物发声
     {
      void Sound(); 
     }

     public class 牛的行为:I动物发声
     {
      public void Sound()
      {
       Console.WriteLine("牛发出的声音");
      }
     }

     public class 羊的行为:I动物发声
     {
      public void Sound()
      {
       Console.WriteLine("羊发出的声音");
      }
     }

     
     通过这个办法,就把不同的“封装” 给联系起来了,他们是“串在一根绳上的蚂蚱”了。

     可能你又要问了,这样看起来是很“吊” 可是怎么用他们呀? 好了,那么,我们就来看看所谓的面向接口编程吧。

     public class 动物()
     {
      I动物发声 行为;  //这个就是实现封装后的类的变化的抽象,先不管有些什么变化。

      public 动物(I动物发声 发声)
      {
       行为=发声;
      }

      public void Sound()
      {
       行为.Sound();
      }
     }

     public class 牛:动物
     {}


     客户端代码:

     牛 n = new 动物(new 牛的行为())  //在这个构造里,你也可以让牛实现羊的声音,尽管现实中这个有些困难。
     
     n.Sound(); //这里是用到的OO中的多态


     这里的行为接口,与封装起来的行为类在模式里叫算法族(可以有N多封装起来的行为类)

    三,多用组合,少用继承
     这里,我们通过组合不同的封装起来的行为类,来完成继承后要重写的行为方法。他们的优劣比,相信你一眼就能看得出来。


    学习中,也是第一次写模式方面的,嘿嘿,有错误还请一定要指正呀! 谢谢!

    厚颜发到首页*__*

    更详细的理论性的介绍请移步:http://www.cnblogs.com/justinw/archive/2007/02/06/641414.html

  • 相关阅读:
    valgrind使用手册
    [转]windows server 2008 多用户远程登录设置
    ios控件学习 IB实现
    把java变成exe
    python 函数 值传递
    java 经验
    python list 去除重复
    xcode 4.2 基础
    mac 使用
    object c 基础语法
  • 原文地址:https://www.cnblogs.com/atwind/p/1410811.html
Copyright © 2011-2022 走看看