• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

(原创)无废话C#设计模式之十三:Decorator

原作者: [db:作者] 来自: [db:来源] 收藏 邀请
 

无废话C#设计模式之十三:Decorator

 

意图

 

       动态地给一个对象添加一些额外的职责。就增加功能来说,Decorator模式相比生成子类更为灵活。

 

场景

 

在设计网络游戏的武器系统时,开始并没有考虑到武器的强化和磨损。之后,策划人员说希望给游戏增加强化系统和修理系统,那么我们的武器类型就需要对外提供强化、磨损、修理等方法了。发生这种改动是我们最不愿意看到的,按照设计原则,我们希望功能的扩展尽可能不要修改原来的程序。你可能会想到使用继承来实现,但是策划人员的需求是有的武器能磨损能修理,不能强化,有的武器能强化,但是不会磨损,有的武器既能强化还能磨损和修理。遇到这样的情况,继承的方案可能不适合了,一来继承的层次可能会很多,二来子类的数量可能会很多。

由此,引入装饰模式来解决这个问题。装饰模式使得我们能灵活赋予类额外的职责,并且使得设计和继承相比更合理。

 

示例代码

 

using System;

using System.Collections.Generic;

using System.Text;

 

namespace DecoratorExample

{

    class Program

    {

        static void Main(string[] args)

        {

            Weapon w = new Rifle();

            w.ShowInfo();

            Enhance enhancedWeapon = new Enhance(w);

            enhancedWeapon.EnhanceAmmo();

            enhancedWeapon.ShowInfo();

            Wear wornWeapon = new Wear(w);

            wornWeapon.WearByRate(0.8);

            wornWeapon.ShowInfo();

        }

    }

 

    abstract class Weapon

    {

        private double ammo;

 

        public double Ammo

        {

            get { return ammo; }

            set { ammo = value; }

        }

 

        private double attack;

 

        public double Attack

        {

            get { return attack; }

            set { attack = value; }

        }

 

        private double speed;

 

        public double Speed

        {

            get { return speed; }

            set { speed = value; }

        }

 

        private string name;

 

        public string Name

        {

            get { return name; }

            set { name = value; }

        }

 

        public abstract void ShowInfo();

    }

 

    class Rifle : Weapon

    {

        public Rifle()

        {

            this.Ammo = 100;

            this.Attack = 10;

            this.Speed = 5;

            this.Name = "Rifle";

        }

 

        public override void ShowInfo()

        {

            Console.WriteLine(string.Format("ammo\t{0}", Ammo));

            Console.WriteLine(string.Format("attack\t{0}", Attack));

            Console.WriteLine(string.Format("speed\t{0}", Speed));

            Console.WriteLine(string.Format("name\t{0}",  Name));

        }

    }

 

    abstract class Decorator : Weapon

    {

        protected Weapon w;

 

        public Decorator(Weapon w)

        {

            this.w = w;

        }

 

        public override void ShowInfo()

        {

            w.ShowInfo();

        }

    }

 

    class Enhance : Decorator

    {

        public Enhance(Weapon w) : base(w) { }

 

        public void EnhanceAmmo()

        {

            w.Ammo += 20;


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
C#实现短信猫通信(无开发包)发布时间:2022-07-10
下一篇:
C#GDI+旋转图片(转)发布时间:2022-07-10
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap