大话设计-装饰模式

装饰模式的核心:被装饰对象(最原始),装饰对象(带有装饰功能的被装饰对象)。

假设有一个被装饰对象叫“ConcreteComponent ”,两个装饰对象叫“ConcreteDecoratorA”、“ConcreteDecoratorB”。装饰是锦上添花的事情,ConcreteComponent 被装饰之前已经最好了最基本的工作,ConcreteDecoratorA和ConcreteDecoratorB只是在这个基本工作里额外加了些工作。

装饰是无序的,可以ConcreteDecoratorA先装饰ConcreteComponent,然后ConcreteDecoratorB装饰ConcreteDecoratorA。也可以ConcreteDecoratorB先装饰ConcreteComponent,然后ConcreteDecoratorA装饰ConcreteDecoratorB。

被装饰对象和装饰类是否需要抽象跟这里的装饰模式无关。

using System;

namespace ConsoleApp4
{
    class Program
    {
        public static void Main(string[] args)
        {
            ConcreteComponent concreteComponent = new ConcreteComponent();
            ConcreteDecoratorA concreteDecoratorA = new ConcreteDecoratorA();
            ConcreteDecoratorB concreteDecoratorB = new ConcreteDecoratorB();

            concreteDecoratorA.SetComponent(concreteComponent);
            concreteDecoratorB.SetComponent(concreteDecoratorA);
            concreteDecoratorB.Operation();
        }
    }

    abstract class Component
    {
        public abstract void Operation();
    }

    class ConcreteComponent:Component
    {
        public override void Operation()
        {
            Console.WriteLine("具体对象的操作");
        }
    }

     abstract class Decorator : Component
    {
        protected Component component;
        public void SetComponent(Component component)
        {
            this.component = component;
        }
        public override void Operation()
        {
            if (component != null)
            {
                component.Operation();
            }
        }
    }

     class ConcreteDecoratorA : Decorator
    {
        private string addState;
        public override void Operation()
        {
            base.Operation();
            addState = "A addState";
            Console.WriteLine("A类装饰");
        }
    }

    class ConcreteDecoratorB : Decorator
    {
        private string addState;
        public override void Operation()
        {
            base.Operation();
            addState = "B addState";
            Console.WriteLine("B类装饰");
        }
    }
}

View Code

using System;

namespace ConsoleApp4
{
    class Program
    {
        public static void Main(string[] args)
        {
            Person person = new Person("白石");
            TShirts shirts = new TShirts();
            Overalls overalls = new Overalls();

            shirts.Decorate(person);
            overalls.Decorate(shirts);
        }
    }

   class Person
    {
        public Person()
        {

        }
        private string name;
        public Person (string name)
        {
            this.name = name;
        }
        public virtual void Show()
        {
            // 什么装饰都没有的基本展示。
            Console.WriteLine($"{name} 一个人的基本show");
        }
    }

    abstract class Finery : Person
    {
        protected Person component;
        public void Decorate(Person person)
        {
            this.component = person;
        }
        public override void Show()
        {
            if (component != null)
            {
                component.Show();
            }
        }
    }

    class TShirts : Finery
    {
        public override void Show()
        {
            base.Show();
            Console.WriteLine("穿T恤");
        }
    }

    class Overalls : Finery
    {
        public override void Show()
        {
            base.Show();
            Console.WriteLine("工装裤");
        }
    }
}
(0)

相关推荐

  • C#设计模式-组合模式(Composite Pattern)

    概念 组合是一种结构型设计模式, 你可以使用它将对象组合成树状结构, 并且能像使用独立对象一样使用它们. 组合模式(Composite Pattern)是将对象组合成树形结构以表示'部分-整体'的层次 ...

  • 详解JAVA面向对象的设计模式 (七)、装饰模式

    装饰模式 Decorator 装饰模式比较简单,我就不单独写实现例子了.参考设计图去实现不是什么问题.建议可以写一写找找感觉. 在现实生活中,常常需要对现有产品增加新的功能或美化其外观,如房子装修.相 ...

  • DercoratorPattern装饰者模式

    装饰者模式 1,定义 动态的给一个对象添加一些额外的职责. 装饰者模式通常有4个角色,就增加功能来说,装饰者模式比生成子类更加的灵活. Component:抽象构件.通常是一个接口或者抽象类,定义最核 ...

  • Decorator装饰模式

    >>返回<C#常用设计模式> 1. 简介 2. 示例 2.1. 框架中的例子 1. 简介 定义 动态地给一个对象增加一些附属的职责. 装饰装饰,自然的理解就是在原有物品的基础上 ...

  • 3年工作必备 装饰器模式

    回复"000"获取大量电子书 大家好,我是老田,从今天开始,本公众号每周给大家送福利,送什么呢?肯定是技术书啦,没那么多花里胡哨的,参与方式见文末. 好啦,进入我们的主题,今天我给 ...

  • 设计模式-结构型-装饰者模式

    装饰者模式(wrapper): 允许向一个现有的对象添加新的功能,同时又不改变其结构.装饰器模式是一种用于代替继承的技术,无需通过继承增加子类就能扩展对象的新功能.使用对象的关联关系代替继承关系,更加 ...

  • 大话设计-模板方法模式

    在基类定义算法的结构,具体实现延迟到子类. using System; namespace ConsoleApp2 { class Program { static void Main(string[ ...

  • 大话设计-代理模式

    记录大话设计学习过程. 代理模式:代理者为其他对象提供代理,以控制对真实对象的访问. 用户调用代理者,代理者通过真实的对象引用让对象去做事情.但是代理者可以附加一些功能,然后才让真实对象去做事情. 代 ...

  • 大话设计-单一职责

    记录大话设计学习过程. 如果能想到多一个动机去改变一个类,那么这个类负责的职责就多于一个. 单一职责在企业里就能明显的体现出来,HR一个类.开发人员一个类.项目经理一个类.测试人员一个类.业务人员一个 ...

  • 大话清美|部分染织服装艺术设计赏析

    前段时间和小编一起观看了清华美院的毕业设计展,线上展的设计让人大呼过瘾! 今天小编就和大家一起来欣赏几件来自染织服装艺术设计的作品吧. " 染织服装艺术设计 地域与全球,真实与虚拟,过去与未 ...

  • 大话设计模式笔记(四)の装饰模式

    举个栗子 问题描述 可以给人搭配嘻哈服或白领装的程序. 简单实现 代码 /** * 人类 * Created by callmeDevil on 2019/6/23. */ public class ...

  • ​浅析农贸市场设计改造与动态线路规划的重要性

    浅析农贸市场设计改造与动态线路规划的重要性 现代农贸市场的日常运作,动态线路设计必须保持稳定发展的首要因素.完善合理的动态线路规划,不仅能反映进入市场时的客货供应情况,而且对引导顾客的购物趋势也有很大 ...

  • 农贸市场设计中形式匹配的基本条件是什么?

    农贸市场设计中形式匹配的基本条件是什么?   现代农贸市场设计中的业态匹配原则是什么?在进行业态匹配时,现代农贸市场应满足哪些基本条件?   业态匹配是现代农贸市场运作的一个非常重要的因素.杭州佰映介 ...

  • 冰箱突出太难看,怎么办?其实可以这样做! #冰箱柜 #装修设计 @DOU 小助手

    冰箱突出太难看,怎么办?其实可以这样做! #冰箱柜 #装修设计 @DOU 小助手

  • 主题乐园环境的设计原则应把握哪些方面重点

    主题乐园作为一种人工旅游环境,与人的游乐行为密切联系.从游乐行为的无规定性.不受约束性特征出发,主题乐园环境的设计原则应从以下几个方面重点把握: 主题乐园环境的设计原则应把握哪些方面重点 1.多样性和 ...