设计模式-装饰模式

举报
ksh1998 发表于 2021/12/25 23:00:41 2021/12/25
【摘要】 前言: 装饰模式和人穿衣打扮是差不多的,人类穿衣打扮都需要一个更衣室或者是商场的试衣间。都是在隐秘的空间里打扮后之后再展示出自己的搭配,而今天这装饰模式和试衣服是一样的。都需要在后台进行然后在展示时出来结...

前言:
装饰模式和人穿衣打扮是差不多的,人类穿衣打扮都需要一个更衣室或者是商场的试衣间。都是在隐秘的空间里打扮后之后再展示出自己的搭配,而今天这装饰模式和试衣服是一样的。都需要在后台进行然后在展示时出来结果!

需求:
小菜有各种各样的服饰,鞋子和装饰品。小菜可以利用装饰模式,用自己已有的服饰对自己进行打扮。
类图:
解释:(装饰类Finey继承与人person 类。Finey子类都是一些具体的服饰!)
在这里插入图片描述
**实现:
Person(要装饰的对象,就是给谁打扮)

 public class Person
    {
        public Person()
        {

        }
        private string name;
        /// <summary>
        /// 人名
        /// </summary>
        /// <param name="name"></param>
        public Person(string name)
        {
            this.name = name;
        }//end Person
        /// <summary>
        /// 显示穿的衣服
        /// </summary>
        public virtual void Show()
        {
            Console.WriteLine("装扮的{0}", name);
        }//end Show
    }//end class Person

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

Finery(服饰的抽象类,定义打扮对象的初始化。)继承与Person类


    /// <summary>
    /// 服饰的抽象类
    /// </summary>
  public  class Finery:Person
    {
        protected Person component;
        /// <summary>
        /// 打扮
        /// </summary>
        /// <param name="component">打扮的对象</param>
        public void Decorate(Person component)
        {
            this.component = component;
        }
        /// <summary>
        /// 显示具体衣服的抽象方法
        /// </summary>
        public override void Show()
        {
            //重写show里执行的具体内容
            if (component!=null)
            {
                component.Show();
            }//end if

        }
    }

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

具体的服饰:(Finery的子类)
垮裤

  public  class BigTrouser:Finery
    {
        public override void Show()
        {
            Console.WriteLine("垮裤");
            base.Show();//调用具体的装饰对象
        }
    }

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

领带

 public class public_WerTie:Finery
    {
        public override void Show()
        {

            Console.WriteLine("领带");
            base.Show();//调用具体的装饰对象
        }
    }

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

运动鞋

 public    class Sneakers:Finery
    {
        public override void Show()
        {
            Console.WriteLine("运动鞋");
            base.Show();//调用具体的装饰对象
        }
    }

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

T-血

  /// <summary>
    /// 服饰的子类,T-血
    /// </summary>
public  class Tshirts:Finery
    {
        /// <summary>
        /// 重新父类方法
        /// </summary>
        public override void Show()
        {
            Console.WriteLine("大T-血");
            base.Show();//调用具体的装饰对象
        }//end Show
    }

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

西装

 public class WeraSuit:Finery
    {
        public override void Show()
        {
            Console.WriteLine("西装");
            base.Show();//调用具体的装饰对象
        }
    }

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

皮鞋

  public  class WerLeatherShoes:Finery
    {
        public override void Show()
        {
            Console.WriteLine("皮鞋");
            base.Show();//调用具体的装饰对象
        }
    }

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

破球鞋

 public  class Wersneakers:Finery

    {
        public override void Show()
        {
            Console.WriteLine("破球鞋");
            base.Show();//调用具体的装饰对象
        }
    }


  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

结果:
在这里插入图片描述
总结:
可以和第一版,第二版做下对比,很明显的可以看到第一版是违反开放封闭原则的不利于扩展。第二版虽然遵循了开放封闭性原则但是没有私密性 ,相当于在大街上当着所有人的面换衣服。第三版既做到了易扩展,还有私密性。 虽然最后展示的结果相同,但是后面的思路不同。

文章来源: kangshihang.blog.csdn.net,作者:康世行,版权归原作者所有,如需转载,请联系作者。

原文链接:kangshihang.blog.csdn.net/article/details/103001345

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。