马上加入IBC程序猿 各种源码随意下,各种教程随便看! 注册 每日签到 加入编程讨论群

C#教程 ASP.NET教程 C#视频教程程序源码享受不尽 C#技术求助 ASP.NET技术求助

【源码下载】 社群合作 申请版主 程序开发 【远程协助】 每天乐一乐 每日签到 【承接外包项目】 面试-葵花宝典下载

官方一群:

官方二群:

装饰者模式(Decorator)

  [复制链接]
查看9983 | 回复5 | 2017-10-10 10:34:47 | 显示全部楼层 |阅读模式
本帖最后由 剑弑 于 2017-10-10 10:40 编辑

       国庆长假刚结束很多人都会有假期综合症(我也不例外),所以我找了些装饰者模式的资料看看,顺便写了份示例供大家评判评判
       相信电脑对于大家来说都非常非常熟悉了,哪么今天我就以手提电脑为示例跟大家分享分享装饰者模式。很多人买到手提都会接上外接键鼠,手提自身带的键盘大小,对于爱打游戏的朋友来说都不太习惯,鼠标就更不用说了,没用外接鼠标的话打游戏灵活度根本跟不上。
       到这里可能很多人都会问,手提电脑使用外接键鼠跟今天讲的装饰者模式有什么关系呢?
       大家都不要急,其实软件设计的很多设计模式都来源于我们的生活,只是我们自己没发现而已;好了废话不多说了,我们直接来上代码吧。
       首先我们先来新建一个电脑抽象类以及手提电脑类(当然平板电脑类、台式电脑类都可以,本文主要以手提电脑为示例对象)
[C#] 纯文本查看 复制代码
 /// <summary>
    /// 电脑抽象类
    /// </summary>
    public abstract class Computer
    {
        public abstract void GetComputerParts();
    }

[C#] 纯文本查看 复制代码
  
/// <summary>
/// 手提电脑类
/// </summary> 
public class PortableComputer:Computer
    {
        public override void GetComputerParts()
        {
            Console.Write("手提电脑:\r\n");
        }
    }


接下来我们来新建一个电脑配件的装饰类及要对手提电脑进行装饰的鼠标配件类和键盘配件类
[C#] 纯文本查看 复制代码
/// <summary>
    /// 电脑配件装饰类
    /// </summary>
    public abstract class DecoratorComputer:Computer
    {
        private Computer Computer;

        public DecoratorComputer(Computer computer)
        {
            this.Computer = computer;
        }

        public override void GetComputerParts()
        {
            if (Computer!=null)
            {
                Computer.GetComputerParts();
            }
        }
    }


[C#] 纯文本查看 复制代码
   /// <summary>
    /// 鼠标配件类
    /// </summary>
     public class MouseParts:DecoratorComputer
    {
         public MouseParts(Computer computer) 
            : base(computer)
         {
         }

         public override void GetComputerParts()
         {
             base.GetComputerParts();
             Mouse();
         }

         public void Mouse()
         {
             Console.Write("接入鼠标配件\r\n");
            Console.Write("鼠标接入完成\r\n");
        }
    }


[C#] 纯文本查看 复制代码
/// <summary>
    /// 键盘配件类
    /// </summary>
    class KeyboardPrts:DecoratorComputer
    {
        public KeyboardPrts(Computer computer) 
            : base(computer)
        {
        }

        public override void GetComputerParts()
        {
            base.GetComputerParts();
            Keyboard();
        }

        public void Keyboard()
        {
            Console.Write("接入键盘配件\r\n");
            Console.Write("键盘接入完成\r\n");
        }
    }

最后我们来看看客户端调用代码
[C#] 纯文本查看 复制代码
 class Program
    {
        static void Main(string[] args)
        {
            Computer computer=new PortableComputer();  
            DecoratorComputer decoratorComputer=new MouseParts(computer);
            decoratorComputer.GetComputerParts();
            Console.Write("---------------------我是华丽的分隔线-----------------------\r\n");
            decoratorComputer =new KeyboardPrts(computer);
            decoratorComputer.GetComputerParts();
            Console.Write("---------------------我是华丽的分隔线-----------------------\r\n");
            MouseParts mouseParts = new MouseParts(computer);
            KeyboardPrts keyboardPrts = new KeyboardPrts(mouseParts);
            keyboardPrts.GetComputerParts();
            Console.Read();
        }
    }


结果截图
QQ截图20171010101513.png

类图
QQ截图20171010103308.png

最后附上源码
Decorator.rar (48.98 KB, 下载次数: 3)
ibcadmin | 2017-10-10 14:11:36 | 显示全部楼层
  666  原创3元奖励
C#论坛 www.ibcibc.com IBC编程社区
C#
C#论坛
IBC编程社区
min | 2017-11-7 08:43:24 | 显示全部楼层
学到了
dfvdfgdfgf | 2018-12-6 23:27:51 | 显示全部楼层
11111
Hartmann | 2018-12-29 15:31:44 | 显示全部楼层
楼主,这种模式的好处和实际应用场景能介绍下吗?多谢了。

点评

能动态的给对象增加职责,而不改变原对象,这点跟继承一样,只会比继承更加灵活; 还有就是每个构件都可以给不同对象进行装饰,这点从某种意义上说降低了类之间的藕合度; 至于场景嘛。。。。。。 比如:在不影响  详情 回复 发表于 2018-12-29 17:52
剑弑 | 2018-12-29 17:52:43 | 显示全部楼层
Hartmann 发表于 2018-12-29 15:31
楼主,这种模式的好处和实际应用场景能介绍下吗?多谢了。

能动态的给对象增加职责,而不改变原对象,这点跟继承一样,只会比继承更加灵活;
还有就是每个构件都可以给不同对象进行装饰,这点从某种意义上说降低了类之间的藕合度;
至于场景嘛。。。。。。
比如:在不影响其实对象的情况下,动态的为单个对象增加职责啊;
还有当在框架设计的时候要使用的对象不利于扩展和维护;
*滑块验证:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则