代码复用,我应该知道的这些事
注册博客园账号4年多了,一直在想园子里的各种大牛、大神学习,自己从来没有动手写过。没写的原因只有一个,觉得自己只是太浅薄了,写出来怕别人笑话,说白了,就是对自己没有信心。
现在突然决定胡乱画几笔的原因是想将自己今天的学习记录下来,方便自己日后备查。也算是对自己的一个督促,真心羡慕各种大牛,想你们致敬,学习。
__________________________________________________________________________________________________________
在我的工作中,开发项目的时候,经常出现与如下情况类似的代码:
public class ClassA
{
public void fun1()
{
Console.WriteLine("fun");
Console.WriteLine("funA1");
}
public void fun2()
{
Console.WriteLine("fun");
Console.WriteLine("funA2");
}
}
public class ClassB
{
public void fun1()
{
Console.WriteLine("fun");
Console.WriteLine("funB1");
}
public void fun2()
{
Console.WriteLine("fun");
Console.WriteLine("funB2");
}
}
其实对于ClassA 与ClassB,除了每个方法的第二个语句Console.WriteLine("funXX");不一样以外,其他都是一样的。很容易出现一种这样的情况,如果Console.WriteLine("fun"); 这样的一段代码发生了变化,我们就需要修改二处甚至更多的地方,代码不但有很多重复,而且也很难维护。一般情况下,解决上面的问题,我们可以这样做:定义一个有fun1和fun2方法的基类,然后ClassA和ClassB分别继承实现,结果如下:
public class BaseClass
{
public void fun1()
{
Console.WriteLine("fun");
}
public void fun2()
{
Console.WriteLine("fun");
}
}
public class ClassA : BaseClass
{
public new void fun1()
{
base.fun1();
Console.WriteLine("funA1");
}
public new void fun2()
{
base.fun2();
Console.WriteLine("funA2");
}
}
public class ClassB : BaseClass
{
public new void fun1()
{
base.fun1();
Console.WriteLine("funB1");
}
public new void fun2()
{
base.fun2();
Console.WriteLine("funB2");
}
}
其实经过上面这样的处理,结果并不是我们想要的,代码还是有很多重复,除了方法中的此代码Console.WriteLine("funXX");不一样以外,其他都是相同的,那么我们到底还有没有其他的方法来继续优化呢?
其实根据设计模式的思想,我们既然用了继承并且认定这种继承是有意义的,我们就应该把所有相同的内容都放入父类,让父类成为子类的模板。进一步封装后,代码结构如下:
public class BaseClass
{
public void fun1()
{
Console.WriteLine("fun");
Console.WriteLine("" + Result1());
}
public virtual string Result1()
{
return "";
}
public void fun2()
{
Console.WriteLine("fun");
Console.WriteLine("" + Result2());
}
public virtual string Result2()
{
return "";
}
}
public class ClassA : BaseClass
{
public override string Result1()
{
return "funA1";
}
public override string Result2()
{
return "funA2";
}
}
public class ClassB : BaseClass
{
public override string Result1()
{
return "funB1";
}
public override string Result2()
{
return "funB2";
}
}
此时,每个子类都可以实现自己的业务处理功能而且与其他业务子类都没有关联,重复的功能调整也只需修改基类,达到了代码高度复用,维护简单的目的。而这就是典型的模板方法模式。
模板方法将模式将不变的形式在父类中实现,出除子类的重复实现从而体现它的优势,因此,模板方法模式为代码复用提供了一个很好的平台。
记录完毕,欢迎大家来喷!