装饰者模式 The Decorator Pattern

装饰者模式——动态的将责任附加到对象上,若要扩展功能,装饰者提供了比继承更有弹性的替代方案。(摘自《Head First Design Patterns》)
以下是自已用VS画了一个简图:
本文意要创建一把剑,给它装饰不同的属性来增加不同的效果,以达到装饰者模式的思想。
首先,创建武器抽象基类
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

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

没有更多推荐了,返回首页

关闭
关闭
关闭