初次对于模板方法的使用是在机房重构的时候使用了,至于为什么使用。自己有懂得多少呢!使用场合。当我们对于要完成某一细节层次一致的一个过程或一系列步骤,但其个别步骤在更详细的层次上的实现可能不同时,我们通常考虑使用模板方法来处理。
模板方法用到了继承,子类对于父类中的方法进行了更深一步的,解释或者说是使用。将一些公共的算法抽出来放到父类,而对于子类则可以实现不同的功能。(个人理解)
模板方法模式:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
优势方面其实通过把不变的行为搬到超类(公共)。去除子类中的重复代码。代码的复用方面得到了很好的提升。
static void Main(string[] args)
{
AbstractClass c;
c = new ConcreteClassA();
c.TemplateMethod();
c = new ConcreteClassB();
c.TemplateMethod();
Console.Read();
}
}
//abstractclass是抽象类,其实也就是一抽象模板,定义并实现了一个模板方法,这个模板方法是一个具体方法,
//他给出了一个顶级逻辑的骨架,而路基的组成步骤在相应的抽象操作中,推迟到子类实现,顶级逻辑也有可能调用一些具体方法。
abstract class AbstractClass
{
public abstract void PrimitiveOperation1(); //一些抽象行为,放到子类去实现。
public abstract void PrimitiveOperation2();
public void TemplateMethod() //模板方法,给出了逻辑的骨架,而逻辑的组成是一些相应的抽象操作。
{
PrimitiveOperation1();
PrimitiveOperation2();
Console.WriteLine("");
}
}
//oncreteclass,实现父类所定义的一个或多个抽象方法,每一个abstractclass都可以有任意多个concreteclass与之对应,而每一个concreteclass都可以给出这些抽象方法,
//也即是顶级逻辑的组成步骤)的不同实现,从而使得顶级逻辑的实现各不相同。
class ConcreteClassA:AbstractClass
{
public override void PrimitiveOperation1()
{
Console.WriteLine("具体类A方法1实现");
}
public override void PrimitiveOperation2()
{
Console.WriteLine("具体类A方法2实现");
}
}
class ConcreteClassB:AbstractClass
{
public override void PrimitiveOperation1()
{
Console.WriteLine("具体类B方法1实现");
}
public override void PrimitiveOperation2()
{
Console.WriteLine("具体了B方法2实现");
}
}
对于代码的理解,首先来看子类的特点,子类中就是继承了父类中的虚方法,进行了重写虚方法。父类中的抽象的行为都放到了子类中。也就是子类中各个方法中的具体实现。父类代码的特点:虚方法当然不用过多的赘述,然后就是抽象出来的公共部分,公共部分会对于虚方法进行调用。
最后来看客户端代码的部分,简单地说就是实例化具体的子类,但是调用方法的时候会调用父类的公共方法来实现子类想要是实现的具体功能。代码的体现也和父类代码特点呼应。
原型模式和模板方法模式的区别或者说是不同(代码方面的体现),其实个人感觉原型是对于整个对象的复制,想要给与不同属性的时候需要复制之后调用相应的添加方法。调用的是子类的方法。而模板方法的时候一直调用的都是父类的公共方法,实例化相应的子类。我自己的理解。