接上一篇:装饰模式例子中的关键代码

前言:在上一篇装饰模式的博客中,我简要讲解了有装饰模式的思想,但当时对于这个例子的实现,我产生了一些疑惑:这个程序是怎么实现按顺序穿上衣服的呢?特此今天写下此博客,以此巩固C#语言中有关知识点。

本篇博客重点概念:有参数的方法、方法的参数、base语法

我们先看这个例子中的重点代码:

重点代码块1:来自Finery类

    protected Person component;//定义一个类的变量(字段)

    public void Decorate(Person component)
    {
        this.component = component;//this表示当前类,前面的component是变量,后面的component是Decorate的参数
    }

对应的Client端代码(shs是T-Shirt子类中实例化的对象,tos是Trousers子类中实例化的对象,shs是Shoes类中实例化的对象)

    shs.Decorate(Marshall);
    tos.Decorate(shs);
    tst.Decorate(tos);

以上代码中,通过Finery中的方法Decorate,给该类对应的对象中的变量componet赋值:shs的变量componet赋值为Marshall、tos的变量component赋值为shs......

这块代码的关键点就是Decorate方法的使用,之前大家使用它更多的时候是在传一些具体的属性值,而这次不同,component中所存的值并不是简单的属性值,而是变量,所以在理解这块代码时,我耗费了相当长的一段时间。

重点代码块2:来自Finery类

    public override void Show()
    {
        if(component!=null)//这行代码是Client中得以串联运行的保证
        {
            component.Show();
        }
    }

与之关联的代码:来自具体实现装饰的子类

    base.Show();//跳转至父类的方法(重写时自带)

Client端代码:

    tst.Show();

base.Show()表示执行基类的方法,而在客户端的代码中,通过tst.Show()显示出“T恤”这一结果后,运行到base.Show(),转到父类Finery的Show方法中进行判定。而此时component的值不为空:其值为Trousers类的对象tos,因此就要执行tos.Show()方法...以此类推,直到Marshall.Show()也运行完毕。

这块代码的重点则是base语法--转到基类的方法。而相同的,在这块代码中component代表的同样是变量,可见在C#中命名也是个很令初学者头疼的知识点。

后记:写完博客之后,看了看自己的一些过程解释有些啰嗦,这是在所难免的:因为自己结束VB,转到C#的学习时间也不过刚一个多月,因此对于面向对象的认识还是没那么深刻,所以很多地方不得不吹毛求疵地让自己能看懂。不过,我自认为这样的学习态度是值得的:基本功打不扎实,后面的问题成本可就要高得多了。

猜你喜欢

转载自blog.csdn.net/Marshallren/article/details/87855476