代码改变世界

Head First 设计模式阅读所得:策略模式(Strategy Pattern) 接口的用处(之一)

2009-03-13 15:24  咒语  阅读(1888)  评论(11编辑  收藏  举报

周一从当当定的书,周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