因为forum使用自定义的服务器控件(.cs),所有有外观的自定义服务器控件都继承自SkinnedForumWebControl.cs类,在SkinnedForumWebControl.cs类的LoadSkin方法中动态装载用户控件(ascx),这就提供了一种机会,使得可以根据用户的个人配置从不同的文件夹中装载用户控件,并且在用户控件(ascx)中所有的图片以及可变的外观属性都是使用Globals.GetSkinPath() + "/images的方式获取的,所以我们只看到在default目录下有完全的字文件夹skins,其他的皮肤目录没有,或者只有几个skin文件,这是因为如果我们不想重新布局(ascx)页面,就使用default目录里的ascx文件布局,但是页面的颜色以及图片等属性则是根据用户定义的皮肤目录来获取的。
这种换肤和使用不同的css有很大的区别,使用css只能改变控件的颜色,大小等,使用动态装载技术还能实现控件的不同布局。就像使用xsl文件来解释xml呈现不同的样式一样。
使用下图来表示
看看模板方法模式,就好理解了
UML class diagram
// Template Method pattern -- Structural example |
using System;
// "AbstractClass"
abstract class AbstractClass
{
// Methods
abstract public void PrimitiveOperation1();
abstract public void PrimitiveOperation2();
// The Template method
public void TemplateMethod()
{
Console.WriteLine( "In AbstractClass.TemplateMethod()");
PrimitiveOperation1();
PrimitiveOperation2();
}
}
// "ConcreteClass"
class ConcreteClass : AbstractClass
{
// Methods
public override void PrimitiveOperation1()
{
Console.WriteLine( "Called ConcreteClass.PrimitiveOperation1()");
}
public override void PrimitiveOperation2()
{
Console.WriteLine( "Called ConcreteClass.PrimitiveOperation2()");
}
}
/// <summary>
/// Client test
/// </summary>
public class Client
{
public static void Main( string[] args )
{
// Create instance and call template method
ConcreteClass c = new ConcreteClass();
c.TemplateMethod();
}
} |
Output
In AbstractClass.TemplateMethod() Called ConcreteClass.PrimitiveOperation1() Called ConcreteClass.PrimitiveOperation2() |
|
其实就是"抽象-具体"模式,系统需要的是一个抽象的引用,而我们提供给系统的是具体的实现方法.
|