您的位置:金沙手机版下载 > 格斗网络游戏 > 装饰模式

装饰模式

2019-12-10 01:57

故事

技师小明的两任女盆友

于今进一层多的胞妹愿意找IT男当男票,因为不知底是哪些挨(qin卡塔尔(قطر‎千(ge卡塔尔刀(ge卡塔尔(英语:State of Qatar)的揭发了IT男钱多话少死的早的暧昧。

但是难点快捷就来了,有女对象事情发生之前的IT男的卡包长那样:

图片 1

有了女对象的IT男的卡包长那样:

图片 2

早晨,小明的女朋友如花第一次全国代表大会早已打扮的壮丽的拉着小明去逛街,走到金饰品店,看上了多少个手链,左戴右试爱不忍释,时有的时候还可怜兮兮的看一眼小明,看得小明心惊胆跳的,心想那月已经吃了俩礼拜的杯面了,小编那可(bai卡塔尔国爱(jia卡塔尔(英语:State of Qatar)的女友怎么一点都不晓得心痛我。

油炸面就油炸面吧,大不断就换窝头梅菜,尽管心疼,但为了获取美丽的女人一笑,小明依旧秀气的掘出了银行卡。女对象则兴缓筌漓的即时就戴上了手链,八面雄风!

图片 3

其生龙活虎进程能够用UML类图画一下:

图片 4

类图中,“女对象”被设计成接口,是考虑到这些女对象太可(bai卡塔尔国爱(jia卡塔尔国,为了能不直接吃热干面,有比非常大可能率会换其余叁个落实(换女朋友),咳咳....

图片 5

过了意气风发段时间,小明实在没钱给女对象买首饰了,如花异常快又找到了另二个IT男,和小明分别了,万幸直接暗恋小明的似玉及时向小明勇敢告白,那才让小明从失恋的黑影中走出来

图片 6

咱俩来看一下现行反革命的类图:

图片 7

小明的新女盆友似玉温柔保护,向往看书、吃古董羹,很懂事,小明心想这一次好不轻便找到了真命天女了!

    /// <summary>
    /// 女朋友接口
    /// </summary>
    public interface IGirlFriend
    {
        string Description { get; set; }
        void Dating();
    }

    /// <summary>
    /// 如花
    /// </summary>
    public class RuHua : IGirlFriend
    {
        public string Description { get; set; } = "我是如花";

        public void Dating()
        {
        }
    }

    /// <summary>
    /// 似玉
    /// </summary>
    public class SiYu : IGirlFriend
    {
        public string Description { get; set; } = "我是似玉";

        public void Dating()
        {
        }
    }

    /// <summary>
    /// 约会装饰器
    /// </summary>
    public class Decorator : IGirlFriend
    {
        public IGirlFriend GirlFriend { get; private set; }
        public string Description { get; set; }

        public Decorator(IGirlFriend girl)
        {
            this.GirlFriend = girl;
        }

        public virtual void Dating()
        {
            Console.Write(this.GirlFriend.Description);
        }
    }

    /// <summary>
    /// 约会之逛街
    /// </summary>
    public class Shopping : Decorator
    {
        public Shopping(IGirlFriend girlFriend):base(girlFriend)
        {
        }

        public override void Dating()
        {
            base.Dating();
            this.WalkAndShopping();
        }

        public void WalkAndShopping()
        {
            Console.WriteLine("我在和小明逛街");
        }
    }

    /// <summary>
    /// 约会之吃饭
    /// </summary>
    public class Eatting : Decorator
    {
        public Eatting(IGirlFriend girlFriend) : base(girlFriend)
        {
        }

        public override void Dating()
        {
            base.Dating();
            this.EatSomething();
        }

        public void EatSomething()
        {
            Console.WriteLine("我在和小明吃饭");
        }
    }

    /// <summary>
    /// 小明真心喜欢似玉,决定带她去看电影
    /// </summary>
    public class Film : Decorator
    {
        public Film(IGirlFriend girl) : base(girl)
        {
        }

        public override void Dating()
        {
            base.Dating();
            this.WatchMovie();
            this.MoCha();
        }

        public void WatchMovie()
        {
            Console.Write("我在和小明看电影");
        }

        public void MoCha()
        {
            Console.WriteLine(",我在和小明喝摩卡");
        }
    }


    /// <summary>
    /// 场景模拟
    /// </summary>
    class Program
    {
        static void Main(string[] args)
        {
            //女友如花
            IGirlFriend ruHua = new RuHua(); 
            IGirlFriend ruHuaShopping = new Shopping(ruHua);
            ruHuaShopping.Dating();

            IGirlFriend ruHuaEatting = new Eatting(ruHua);
            ruHuaEatting.Dating();

            Console.WriteLine("----");

            //女友似玉
            IGirlFriend siYu = new SiYu();
            IGirlFriend siYuFilm = new Film(siYu);
            siYuFilm.Dating();

            Console.ReadKey();
        }
    }

运作结果如下:

我是如花我在和小明逛街
我是如花我在和小明吃饭
----
我是似玉我在和小明看电影,我在和小明喝摩卡

咳咳,(敲黑板)那就是我们前天要说的装修情势/修饰形式了

先看一下定义:

修饰形式,是面向对象编制程序领域中,风流倜傥种动态地往多少个类中加多新的行事的设计方式。就功效来说,修饰形式相比生成子类更为灵活,这样能够给有些对象并不是全部类增加一些成效。维基百科

解读:

动态的给叁个目的增多一些附加的职务,就扩充效果来说,装饰方式比扩大子类越来越灵敏。在不转移接口的前提下,加强所思考的的类的习性

利用意况:
  1. 亟需扩充学一年级个类的功效,或给叁个类扩展附加权利;
  2. 须求动态的给叁个指标扩大效果与利益,那个作用能够再动态的吊销;
  3. 须要追加一些底工用的排列组合而产生的可怜大方的法力,进而使得后续变得不具体。

图片 8

组成
  1. 虚幻零部件(Component)剧中人物: 给出三个浮泛接口,以标准希图接收附加权利的指标;
  2. 实际构件(ConcreteComponent卡塔尔国剧中人物:定义七个就要采用附加义务的类;
  3. 装饰剧中人物(Decorator卡塔尔国: 持有二个零构件对象(Component)的实例,并定义一个与虚幻零器件接口大器晚成致的接口;
  4. 现实装饰剧中人物(ConcreteDecorator卡塔尔(قطر‎: 担任给零部件对象“贴上”附加的职责。

精通了点缀格局的基本概念,大家以网络电子游艺中的Buff为例实行练习。

Buff:英雄战迹和魔兽世界

玩过农药手机游戏也许魔兽世界等网页游戏的校友都知晓Buff是怎么,勇气比赛场:5v5比赛场游戏中的红蓝buff,魔兽世界中骑士的灵气(增添法力值上限),法师的法强(扩充法术强度),战士的怒吼(扩展力量或生命值上限),等等。
这几个“Buff”,持续的时日短则几秒,长则几分钟以致几钟头,有的则越发不断到剧中人物归西。

图片 9
图片 10

/// <summary>
/// Buff接口
/// </summary>
public interface IHeroBuff
{
    void AddBuff();
}

/// <summary>
/// 王者农药
/// </summary>
public class KingOfGlory : IHeroBuff
{
    public void AddBuff()
    {
        Console.WriteLine("王者荣耀加Buff");
    }
}

/// <summary>
/// 魔兽世界
/// </summary>
public class Wow : IHeroBuff
{
    public void AddBuff()
    {
        Console.WriteLine("魔兽世界加Buff");
    }
}

/// <summary>
/// 装饰器
/// </summary>
public abstract class GameDecorator : IHeroBuff
{
    public IHeroBuff GameBuff { get; set; }

    public GameDecorator(IHeroBuff gf)
    {
        this.GameBuff = gf;
    }

    public abstract void AddBuff();
}

/// <summary>
/// 吃红
/// </summary>
public class RedBuff : GameDecorator
{
    public RedBuff(IHeroBuff buff) : base(buff) { }

    public override void AddBuff()
    {
        this.GameBuff.AddBuff();
        this.AddRedBuff();
        this.FirstBlood();
    }

    private void AddRedBuff()
    {
        Console.WriteLine("都让开我吃红了");
    }

    public void FirstBlood()
    {
        Console.WriteLine("顺便拿个一血");
    }
}

/// <summary>
/// 吃蓝
/// </summary>
public class BlueBuff : GameDecorator
{
    public BlueBuff(IHeroBuff buff) : base(buff) { }

    public override void AddBuff()
    {
        this.GameBuff.AddBuff();
        this.BeCarefor();
        this.AddBlueBuff();
    }

    private void AddBlueBuff()
    {
        Console.WriteLine("那个,不好意思,我补个蓝");
    }

    public void BeCarefor()
    {
        Console.WriteLine("猥琐点小心被拿一血");
    }
}

/// <summary>
/// 战士团队Buff:生命咆哮
/// </summary>
public class CommandingShout : GameDecorator
{
    public CommandingShout(IHeroBuff buff):base(buff)
    {

    }

    public override void AddBuff()
    {
        this.GameBuff.AddBuff();
        this.AddBlood();
    }

    public void AddBlood()
    {
        Console.WriteLine("战士团队Buff: 生命值上限增加10%");
    }
}

/// <summary>
/// 小德Buff:野性呼唤(爪子)
/// </summary>
public class MarkOfTheWild : GameDecorator
{
    public MarkOfTheWild(IHeroBuff gf) : base(gf)
    {
    }

    public override void AddBuff()
    {
        this.GameBuff.AddBuff();
        this.AddSomeBuff();
    }

    public void AddSomeBuff()
    {
        Console.WriteLine("小德Buff: 没玩过不知道有啥增益效果的小德Buff");
    }
}

/// <summary>
/// 骑士Buff:王者祝福
/// </summary>
public class BlessingOfKings : GameDecorator
{
    public BlessingOfKings(IHeroBuff gf) : base(gf)
    {
    }

    public override void AddBuff()
    {
        this.GameBuff.AddBuff();
        this.AddBloodAndFight();
    }

    public void AddBloodAndFight()
    {
        Console.WriteLine("骑士Buff: 攻击力和生命值上限增加10%");
    }
}

/// <summary>
/// 场景模拟
/// </summary>
class Program
{
    static void Main(string[] args)
    {
        // 王者
        IHeroBuff hero = new KingOfGlory(); //定义英雄
        IHeroBuff redBuff = new RedBuff(hero); //吃红
        IHeroBuff blueBuff = new BlueBuff(redBuff); //吃蓝
        blueBuff.AddBuff();

        Console.WriteLine("...........");

        // 魔兽世界
        IHeroBuff wowHero = new Wow(); //定义英雄
        IHeroBuff commandingShout = new CommandingShout(wowHero); //战士buff
        IHeroBuff markOfTheWild = new MarkOfTheWild(commandingShout); //小德buff
        IHeroBuff blessingOfKings = new BlessingOfKings(markOfTheWild); //骑士buff
        blessingOfKings.AddBuff();

        Console.ReadKey();
    }
}

王者荣耀加Buff
都让开我吃红了
顺便拿个一血
猥琐点小心被拿一血
那个,不好意思,我补个蓝
...........
魔兽世界加Buff
战士团队Buff: 生命值上限增加10%
小德Buff: 没玩过不知道有啥增益效果的小德Buff
骑士Buff: 攻击力和生命值上限增加10%

小结一下装潢形式的利害:

  1. 装饰形式与世袭关系的指标都以要扩张对象的功用,然而装潢情势能够提供比持续关系越来越多的灵活性;
  2. 透过采用分化的现实性装饰类以至那几个装饰类的排列组合,设计员可以创造出大多两样行为的三结合。
  3. 运用装饰格局或许会时有产生比持续关系更加多的对象,使得查错困难。

装饰方式分透明和半晶莹剔透方式:

  • 其透明性必要程序不要注脚风姿洒脱(Wissu卡塔尔国个ConcreteComponent类型的变量,而相应声爱他美(Aptamil卡塔尔(Beingmate卡塔尔(قطر‎个Component类型的变量;
  • 半晶莹剔透的办准则表示必要依赖实际须要声美素佳儿个ConcreteDecorator类型的变量,进而得以调用ConcreteDecorator中才有的艺术。

不管哪类方式,出发点都以“不修改原本接口”。

因此,实际支出进度中,不供给郁结其透明格局,只要能够降低系统规划的复杂度,知足设计供给就可以。


据传,设计格局是药,未有病是没有必要吃药的。不驾驭那句话该怎么精通,路过的贤淑能够指点大器晚成二。

好了,继续回到写Bug了,上周再聊!

图片 11

本文由金沙手机版下载发布于格斗网络游戏,转载请注明出处:装饰模式

关键词: