欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

装饰者模式 The Decorator Pattern

程序员文章站 2022-07-13 22:26:10
...
装饰者模式——动态的将责任附加到对象上,若要扩展功能,装饰者提供了比继承更有弹性的替代方案。(摘自《Head First Design Patterns》)
以下是自已用VS画了一个简图: 装饰者模式 The Decorator Pattern
本文意要创建一把剑,给它装饰不同的属性来增加不同的效果,以达到装饰者模式的思想。
首先,创建武器抽象基类
public abstract class Weapon

    {

        private string Appearance;



        private int Aggressivity;



        public abstract string GetAppearance();

        public abstract int GetAggressivity();



        public void Show()

        {

            Console.WriteLine(GetAppearance() + "  攻击力:" + GetAggressivity().ToString());

       }
show方法意在输出测试结果。 下面创建装饰者的基类:
public abstract class Decorator : Weapon

    {



        public Weapon Weapon;

    }
很简单的一个抽象类,当然可以*扩充一些方法等,但在此只是为了以最简单的方式表达装饰者模林思想。
实现三个装饰者,目的是给剑附上冰,火,风等属性:
public class GlacialDecorator : Decorator

    {

        public GlacialDecorator(Weapon w)

        {

            base.Weapon = w;

        }



        public override string GetAppearance()

        {

            return base.Weapon.GetAppearance() + " 附冰属性";

        }



        public override int GetAggressivity()

        {

            return base.Weapon.GetAggressivity() + 50;

        }

    }



public class FireDecorator : Decorator

    {

        public FireDecorator(Weapon w)

        {

            base.Weapon = w;

        }



        public override string GetAppearance()

        {

            return base.Weapon.GetAppearance() + " 附火属性";

        }



        public override int GetAggressivity()

        {

            return base.Weapon.GetAggressivity() + 70;

        }

    }



public class WindDecorator : Decorator

    {

        public WindDecorator(Weapon w)

        {

            base.Weapon = w;

        }



        public override string GetAppearance()

        {

            return base.Weapon.GetAppearance() + " 附风属性属性(攻击速度加20%)";

        }



        public override int GetAggressivity()

        {

            return base.Weapon.GetAggressivity();

        }

    }
最后,开始创建一把普通的剑了:
public class Sword : Weapon

    {

        public override string GetAppearance()

        {

            return "这是一把剑";

        }



        public override int GetAggressivity()

        {

            return 10;

        }

    }
接下来试着给普通的剑附魔:
Weapon sword = new Sword();

            sword.Show();

            //装饰一个冰属性

            sword = new GlacialDecorator(sword);

            sword.Show();

            //装饰一个火属性

            sword = new FireDecorator(sword);

            sword.Show();

            //装饰一个风属性

            sword = new WindDecorator(sword);

            sword.Show();

输出结果:
这是一把剑 攻击力:10
这是一把剑 附冰属性 攻击力:60
这是一把剑 附冰属性 附火属性 攻击力:130
这是一把剑 附冰属性 附火属性 附风属性属性(攻击速度加20%) 攻击力:130

到此为止,装饰者模式的思想介绍完毕,当给这把普通的剑装饰上各种不同的属性时,这把普通的剑也变的不再普通,攻击力也不断上涨,还带有攻击属性,呵呵。我们还可以创建一把斧头,然后用这些装饰者装饰产生不同的效果。
欢迎大家给一些意见。