Administrator
发布于 2024-07-31 / 25 阅读
0
0

装饰模式

问题描述

使用程序给人搭配不同的服饰,预期的输出结果如下:

第一种装扮:

大T恤 垮裤 破球鞋 装扮的小菜

第二种装扮:

西装 领带 皮鞋 装扮的小菜

第三种装扮:

领带 垮裤 皮鞋 破球鞋 装扮的小菜

代码实现

定义Person类

    public class Person
    {
        public Person() { }
        private string mName;
        public Person(string _name)
        {
            this.mName = _name;
        }

        public virtual void Show()
        {
            Console.WriteLine("装扮的" + mName);
        }
    }

定义Finery类

class Finery : Person
{
    protected Person mComponent = null;

    public void decorate(Person component)
    {
        mComponent = component;
    }

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

具体的服饰类

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

class Sneakers : Finery
{
    public override void Show()
    {
        Console.WriteLine("运动鞋");
        base.Show();
    }
}

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

客户端代码

    class Program
    {
        static void Main(string[] args)
        {
            Person person = new Person("小菜");
            Console.WriteLine("第一种装扮");

            Sneakers sneakers = new Sneakers();
            BigTouser bigTouser = new BigTouser();
            TShirts shirts = new TShirts();

            sneakers.decorate(person);
            bigTouser.decorate(sneakers);
            shirts.decorate(bigTouser);

            shirts.Show();
        }
    }

运行结果:

第一种装扮
大T恤
垮裤
运动鞋
装扮的小菜

结构组成

装饰模式主要有四类角色组成

  1. 实体接口:对象接口的定义,可以为对象动态添加职责

  2. 实体类:这个例子中具体为Person类

  3. 装饰抽象类:继承实体接口,动态扩展职责,这个粒子中具体为服饰抽象类

  4. 具体装饰类:装饰的具体表现

UML图


评论