`

装饰模式学习

阅读更多
   今天看大话设计模式一书,发现真的写的不错,之前一直有点疑惑的装饰模式,今晚看懂了,现笔记之。具体见该书相关部分,
主要是解析下。
 

using System;
using System.Collections.Generic;
using System.Text;

namespace 装饰模式
{
    class Program
    {
        static void Main(string[] args)
        {
            Person xc = new Person("小菜");

            Console.WriteLine("\n第一种装扮:");

            Sneakers pqx = new Sneakers();
            BigTrouser kk = new BigTrouser();
            TShirts dtx = new TShirts();

            pqx.Decorate(xc);
            kk.Decorate(pqx);
            dtx.Decorate(kk);
            dtx.Show();

            Console.WriteLine("\n第二种装扮:");

            LeatherShoes px = new LeatherShoes();
            Tie ld = new Tie();
            Suit xz = new Suit();

            px.Decorate(xc);
            ld.Decorate(px);
            xz.Decorate(ld);
            xz.Show();

            Console.WriteLine("\n第三种装扮:");
            Sneakers pqx2 = new Sneakers();
            LeatherShoes px2 = new LeatherShoes();
            BigTrouser kk2 = new BigTrouser();
            Tie ld2 = new Tie();

            pqx2.Decorate(xc);
            px2.Decorate(pqx);
            kk2.Decorate(px2);
            ld2.Decorate(kk2);

            ld2.Show();

            Console.Read();
        }
    }

    class Person
    {
        public Person()
        { }

        private string name;
        public Person(string name)
        {
            this.name = name;
        }

        public virtual void Show()
        {
            Console.WriteLine("装扮的{0}", name);
        }
    }

    class Finery : Person
    {
        protected Person component;

        //打扮
        public void Decorate(Person component)
        {
            this.component = component;
        }

        public override void Show()
        {
            if (component != null)
            {
                component.Show();
            }
        }
    }


    class TShirts : Finery
    {
        public override void Show()
        {
            Console.Write("大T恤 ");
            base.Show();
        }
    }

    class BigTrouser : Finery
    {
        public override void Show()
        {
            Console.Write("垮裤 ");
            base.Show();
        }
    }

    class Sneakers : Finery
    {
        public override void Show()
        {
            Console.Write("破球鞋 ");
            base.Show();
        }
    }

    class Suit : Finery
    {
        public override void Show()
        {
            Console.Write("西装 ");
            base.Show();
        }
    }

    class Tie : Finery
    {
        public override void Show()
        {
            Console.Write("领带 ");
            base.Show();
        }
    }

    class LeatherShoes : Finery
    {
        public override void Show()
        {
            Console.Write("皮鞋 ");
            base.Show();
        }
    }
}

   其实,在这个穿衣服的过程中,要注意的是顺序可以随意搭配的。所以我们先看看首先用Person xc = new Person("小菜");
创建了人的对象实例;之后分别初始化了破球鞋,垮裤,Tshirt的对象。
   再看其执行流程。
   先看dtx.show(),首先输出“大T shirt"了,之后要调用base.show(),这时会跑去Finery类中去调用show()方法,
但这个是componet不为NULL,原因是dtx.decorate(kk)起作用了,用KK去装饰dtx了。这时实际上要接着运行kk.show(),
之后输出"垮裤 ",然后又要调用base.show()了,同样道理,KK被pqx装饰了,---》运行pqx.show(),
输出破球鞋,同样道理,最后输出“装扮的小菜”

 
分享到:
评论

相关推荐

    HeadFirst 设计模式学习笔记3--装饰模式 Demo

    在“HeadFirst 设计模式学习笔记3--装饰模式 Demo”中,作者通过实例讲解了装饰模式的基本概念、结构和应用场景。这篇文章可能是从CSDN博客平台上的一个链接访问的,遗憾的是,由于我们当前无法直接访问该链接,所以...

    设计模式C++学习之装饰模式(Decorator)

    装饰模式(Decorator)是软件设计领域中一种非常实用的结构型设计模式,它允许我们向一个对象添加新的行为或责任,而无需修改该对象的源代码。在C++编程语言中,装饰模式常用于动态地扩展类的功能,使得类的行为在...

    设计模式之装饰模式

    装饰模式是一种结构型设计模式,它允许我们向一个对象动态地添加新的行为或责任,而无需修改该对象...通过学习这些示例,你可以更深入地理解如何在C#中实现和应用装饰模式,以便在自己的项目中有效地利用这一设计模式。

    JAVA设计模式学习12——装饰器模式

    2. **动态性**:装饰模式允许我们在运行时动态地为对象添加新功能,而无需修改代码。 3. **组合性**:通过多个装饰者的叠加,可以实现更复杂的功能,这比使用继承来扩展功能更加灵活。 4. **职责分离**:装饰者模式...

    装饰模式代码示例

    装饰模式是一种设计模式,它允许在运行时向对象添加新的行为或责任,而无需修改对象的源代码...通过学习这个压缩包中的内容,你将能够更好地掌握装饰模式,并能在自己的代码中灵活运用,提升软件设计的质量和可维护性。

    C#设计模式之Decorator 装饰模式

    总结来说,学习C#中的装饰模式将帮助你更好地理解和利用面向对象的设计原则,如开闭原则(对扩展开放,对修改关闭)。通过实践这些知识点,你可以写出更灵活、可维护的代码,同时避免过度使用继承导致的复杂性。无论...

    实验九:装饰模式.rar

    总结来说,"实验九:装饰模式.rar"中的示例旨在帮助学习者理解装饰模式的基本概念和用法,通过小猪游戏、肖像画装饰和咖啡茶定制这三个具体的场景,展示了如何在实际应用中灵活运用装饰模式,以实现代码的扩展性和可...

    装饰者模式案例学习代码

    装饰者模式是一种结构型设计模式,它允许在不修改对象本身的情况下动态地为对象添加新的行为和职责。这种模式在软件工程中广泛应用,因为它提供了一种灵活的方式来扩展对象的功能,而不会破坏其原有的结构。在Java、...

    设计模式装饰模式PPT学习教案.pptx

    设计模式装饰模式PPT学习教案 本资源摘要信息旨在对设计模式中的装饰模式进行详细的介绍和分析,涵盖了装饰模式的定义、结构、实现、应用实例等方面的内容。 一、装饰模式定义 装饰模式是一种用于替代继承的技术...

    Python装饰器模式学习demo

    以上就是"Python装饰器模式学习demo"中涉及的主要内容。通过这个项目,你可以深入理解装饰器的工作原理,以及如何在实际项目中应用它们。实践中,装饰器可用于日志记录、性能测试、权限控制等多种场景,是Python开发...

    装饰者模式Demo

    装饰者模式是面向对象设计模式的一种,主要用于动态地给一个对象添加一些额外的职责,而不会改变该对象的类。...在`DecoratorModeDemo`中,我们可以学习如何创建和使用装饰者模式来动态地增强对象的能力。

    设计模式之装饰模式 Java代码实现

    通过这个实验,我们可以学习到装饰模式如何使代码更具可扩展性和灵活性,而不必对原始类进行硬编码式的修改。 总结,装饰模式是设计模式中的一种,用于在不改变对象自身的基础上,动态地为其添加新的行为。在Java中...

    装饰模式示例装饰模式示例装饰模式示例

    装饰模式是一种设计模式,主要目的是在不改变对象原有结构的基础上,动态地为对象添加新的功能。这个模式在软件工程中非常常见...通过学习和理解这个示例,你可以更好地掌握装饰模式的用法,并在未来的项目中灵活运用。

    装饰者模式——Decorator

    在阅读这篇博客和解压后的“decorator”文件后,你可以深入理解装饰者模式的实现细节,学习如何在自己的项目中运用这一模式,以更优雅的方式扩展功能,同时避免过度使用继承导致的类爆炸问题。通过实践和理解装饰者...

    装饰模式Demo

    在这个Java实现的装饰模式Demo中,我们还可以学习到如何创建和使用装饰器对象,以及如何在运行时动态地组合装饰器以实现不同的功能组合。这对于理解和应用装饰模式在实际项目中的应用非常有帮助。通过分析和理解这个...

    [结构型模式] 装饰者模式的理解

    "装饰者模式-类图.pdf"则可能包含更详细的类图,显示了类与类之间的继承和关联关系,有助于深入学习和应用装饰者模式。 总结来说,装饰者模式是一种强大的设计工具,它允许我们在运行时动态地扩展对象的功能,同时...

    装饰模式实例

    通过学习这个装饰模式实例,我们可以更好地理解如何在实际开发中灵活地扩展对象的功能,同时保持代码的整洁和可维护性。装饰模式提供了一种优雅的方式,让我们能够在不破坏封装性的前提下,对对象进行扩展和定制。

    java 装饰模式

    装饰模式是一种结构型设计模式,它允许我们向一个对象添加新的功能或行为,而不改变其原有的类。在Java中,装饰模式通常通过继承和组合来...通过学习和熟练掌握装饰模式,开发者能够更好地设计出适应变化的软件系统。

    java设计模式之装饰者模式代码

    装饰者模式是面向对象设计模式的一种,主要用于动态地给一个对象添加一些额外的职责,而不会改变该对象的类。...通过学习和理解"DecorateModelStudy"中的代码示例,你可以更好地掌握这一模式的应用。

Global site tag (gtag.js) - Google Analytics