设计模式之装饰模式

来源:互联网 发布:剑三好友招募积分算法 编辑:程序博客网 时间:2024/04/30 23:42

         装饰模式:动态的给一个对象添加一些额外的职责,在增加功能方面,比生成子类更为灵活。它的好处是是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。

  装饰模式具有鲜明的特点: 1、装饰对象和真实对象有相同的接口。

                          2、通过创建一个包装对象,也就是装饰来包裹真实的对象

                          3装饰对象接受所有来自客户端的请求。

                          4、装饰对象可以在转发这些请求以前或以后增加一些附加功能。


     结构图如下:

               

                           

       

    装饰模式的适用情况:对象动态功能的添加或撤销。

                        用于对象动态或添加附加职责

                        当不能采用生成子类的方法进行扩充时。

     具体应用:

                 

<span style="font-family:SimSun;font-size:18px;">using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace 装饰模式6._5{    class Program    {        class Person        {            public Person()            { }            private string name;            public Person(string name)            {                this.name = name;            }            public virtual void Show()            {                Console.WriteLine("装扮的{0}", name);            }        }        class Finery : Person        {            protected Person component;            public void Decorate(Person component)            {                this.component = component;            }            public override void Show()            {                if (component != null) ;                {                    component.Show;                }            }        }            class TShirts : Finery            {                public override void Show()                {                    Console.Write("大T恤");                    base.Show();                }            }            class BigTrouser : Finery            {                public override void Show()                {                    Console.Write("垮裤");                    base.Show();                }            }            class Sneakers : Finery            {                public override void Show()                {                    Console.Write("破球鞋");                    base.Show();                }            }            class Suit : Finery            {                public override void Show()                {                    Console.Write("西装");                    base.Show();                }            }            class Tie : Finery            {                public override void Show()                {                    Console.Write("领带");                    base.Show();                }            }            class LeatherShoes : Finery            {                public override void Show()                {                    Console.Write("皮鞋");                    base.Show();                }            }            static void Main(string[] args)            {                Person xc = new Person("小菜");                Console.WriteLine("\n第一种装扮:");                Sneakers pqx = new Sneakers();                BigTrouser kk = new BigTrouser();                TShirts dtx = new TShirts();                pqx.Decorate(xc);                kk.Decorate(pqx);                dtx.Decorate(kk);                dtx.Show();                Console.WriteLine("\n第二种装扮:");                LeatherShoes px = new LeatherShoes();                Tie ld = new Tie();                Suit xz = new Suit();                px.Decorate(xc);                ld.Decorate(px);                xz.Decorate(ld);                xz.Show();                Console.Read();            }        }    }</span>

总结:装饰模式有效地把类的核心职责和装饰功能区分,去除重复装饰逻辑,实现类的简化;因为装饰模式成功的 将类的核心职责和装饰功能分开,所以在扩展对象功能方面具有较强的灵活性。但是装饰模式把每个要装饰的功都放在单独的类中让类来包装其所装饰的对象有时难免造成类的过多的和过度使用的情况,在具体运用时还需斟酌。

                         

<span style="font-family:SimSun;font-size:18px;"> </span>

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 注塑机锁模时会有射退动作怎么办 电动车刹车油泵不打油怎么办 cad转pdf颜色浅怎么办 松下多功能传真一体机卡纸怎么办 无刷电机坏了怎么办 6kv高压电机绝缘不合格怎么办? 400t油压机下降太慢怎么办 无法连线到服务器1~1怎么办? 数控车床车角度不亮怎么办 超市存包柜的票不见了怎么办 交货期来不及导致船期延误怎么办 跑1000米中途累怎么办 手指被机器压烂怎么办 机械手不能回归原点该怎么办 前缘送纸纸板翘怎么办 三菱AL 1R.2报警怎么办 工作好但领导不好伺候怎么办 孕妇憋尿憋的小腹疼怎么办 怀孕憋尿憋的小腹疼怎么办 半夜憋尿憋的小腹疼怎么办 新生儿大便次数较多怎么办 母猎生下三天没有奶怎么办 孩孑大便干不爱喝水怎么办 发那科1050报警怎么办 plc模块bf亮了怎么办 plc模块df亮了怎么办 西门子触摸屏进不了主画面怎么办 pos机显示白屏怎么办 洗衣机的门坏了怎么办 西门子洗衣机门坏了怎么办 拆线线断在肉里怎么办 总线绝对值编码器方向反了怎么办 台达伺服报警009怎么办 台达plc禁止上传怎么办? 潜水泵电机启动绕组断线了怎么办? 永磁电机磁没了怎么办 热水器热水管坏了怎么办 松下伺服驱动器坏了怎么办 步进电机功率小了怎么办 电三轮电机坏了怎么办 电动车钢圈撞变形了怎么办