装饰模式

简介: 装饰模式

”装饰“想到的就是人的服饰、一个物体的改造等。那么如果放在代码中时如何装饰的呢?

先要有一个被装饰的物体,拿人做例子的话,就先要有一个人的类。

private string name;
        public Person (string name)
        {
            this.name = name;
        }
        public void Show()
        {
            Console.WriteLine("装扮的{0}", name);
        }

有了人之后还要有一个卖衣服的地方。

abstract class Finery
    {
        public abstract void Show();
    }

服装店里面还有各种衣服的类型

 class TShirts : Finery
    {
        public override void Show()
       {
            Console.Write("大T恤");
        }
    }
    class BigTrouser : Finery
    {
        public override void Show()
        {
            Console.Write("跨裤");
        }
    }
    class Sneakers : Finery
    {
        public override void Show()
        {
            Console.Write("破球鞋");
        }
    }
    class Suit : Finery
    {
        public override void Show()
        {
            Console.Write("西装");
        }
    }
    class LeatherShoes : Finery
    {
        public override void Show()
        {
            Console.Write("皮鞋");
        }
    }
    class Tie : Finery
    {
        public override void Show()
        {
            Console.Write("领带");
        }
    }

客户端

Person xc = new Person("小菜");
            Console.WriteLine("\n 第一种装饰:");
            Finery dtx = new TShirts();
            Finery dkk = new BigTrouser();
            Finery pqx = new Sneakers();
            dtx.Show();
            dkk.Show();
            xc.Show();
            Console.WriteLine("\n第二种装扮:");
            Finery xz = new Suit();
            Finery ld = new Tie();
            Finery px = new LeatherShoes();
            xz.Show();
            ld.Show();
            px.Show();
            xc.Show();
            Console.Read();

可以发现在客户端有很多的重复,这需要进行修改。

装饰模式

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)//Decorate点缀的意思,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 LeatherShoes : Finery
    {
        public override void Show()
        {
            Console.Write("皮鞋");
            base.Show();
        }
    }
    class Tie : Finery
    {
        public override void Show()
        {
            Console.Write("领带");
            base.Show();
        }
    }

客户端

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();
        }

相关文章
|
数据可视化 数据挖掘 Python
跟着Nature学作图:R语言ggplot2作图展示基因和转座子的相对位置
跟着Nature学作图:R语言ggplot2作图展示基因和转座子的相对位置
|
供应链 Oracle 关系型数据库
Crystal Ball—甲骨文水晶球风险管理软件(概念以及实战——基础案例篇)(上)
Crystal Ball—甲骨文水晶球风险管理软件(概念以及实战——基础案例篇)(上)
|
存储 Kubernetes API
k8s 动态存储管理案例(GlusterFS)
k8s GlusterFS动态存储管理案例
775 0
|
数据采集 Java Unix
大数据 ETL 处理工具 Kettle 入门实践
Kettle 是一款国外开源的 ETL 工具,对商业用户也没有限制,纯 Java 编写,可以在 Window、Linux、Unix 上运行,绿色无需安装,数据抽取高效稳定。Kettle 中文名称叫水壶,它允许管理来自不同数据库的数据,把各种数据放到一个壶里,然后以一种指定的格式流出。Kettle 中有两种脚本文件,Transformation 和 Job, Transformation 完成针对数据的基础转换,Job 则完成整个工作流的控制。通过图形界面设计实现做什么业务,并在 Job 下的 start 模块,有一个定时功能,可以每日,每周等方式进行定时。
计算机组成原理——加减运算 & 溢出判断
计算机组成原理——加减运算 & 溢出判断
955 0
计算机组成原理——加减运算 & 溢出判断
|
存储 云安全 弹性计算
SAP S/4HANA上云最佳实践
本文主要基于《阿里云解决方案技术白皮书》的指导,以一个典型S/4HANA上云案例,来分析上云过程中遇到的一些典型问题,以及架构的设计和落地的最佳实践。
SAP S/4HANA上云最佳实践
|
人工智能 达摩院 算法
阿里达摩院:以语音为代表的人机交互或许是未来硬件和机器人的标配
【摘要】语音和多模态人机交互会是以机器人为代表的智能硬件的必备特征, 实践中首先要克服的是声学环境的复杂性。在声学前端核心技术上, 深挖信号处理的在线自适应能力, 以及经典信号处理与任务模型的联合优化是我们的技术特色, 也因此在高噪声、高性价比等实际业务场景都创造了多项业内第一。声学模组和芯片化也是克服场景碎片化的有效手段, 也因此快速合作落地了一批智能硬件产品, 赢得了客户的口碑,为端侧计算能力的平台化, 探索了有生命力的路径。
483 0
阿里达摩院:以语音为代表的人机交互或许是未来硬件和机器人的标配
|
Linux
CentOS 7如何建立Terminal的桌面图标?
CentOS 7如何建立Terminal的桌面图标?
1198 0
|
Ubuntu Windows
网络调试助手安装
Windows安装与使用 1. 下载软件包 [网络调试助手Windows版下载地址] (https://www.jianguoyun.com/p/DaBpZ_oQ79P5Bhj2iXc) 到坚果云上下载 2.
5868 0
|
SQL 存储 数据库
MonetDB 列存数据库架构初探
### 前言 对于越来越多的分析型场景,例如数据仓库,科学计算等, 经典的数据库DBMS的检索性能颇显乏力。 相反的,最近出现了很多面向列存的数据库DBMS,像ClickHouse,Vertica, MonetDB等,因其充分利用了现代计算机的一些硬件优势,同时舍弃了一些DBMS特性,得到了非常好的检索性能。本文就MonetDB, 整理一些资料和代码,简单介绍其核心设计。 通过简单Benc
5826 0