zoukankan      html  css  js  c++  java
  • Decorator装饰模式

    >>返回《C#常用设计模式》

    1. 简介

    • 定义
      • 动态地给一个对象增加一些附属的职责。
      • 装饰装饰,自然的理解就是在原有物品的基础上(不改变原有物品),增加一些别的东西,让它变得更令人满意。
    • 类图

    2. 示例

    using System;
    using 
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace WindowsFormsApplication1
    {
        //client
        class Program
        {
            static void Main()
            {
                Hero hero = new BigHero();
                HeroShell s1 = new SpiderManShell(hero);
                HeroShell s2 = new SupperManShell(s1);
                s2.Attack();
                Console.ReadKey();
            }
        }
        //Component
        public abstract class Hero
        {
            public abstract void Attack();
        }
        //Decorator
        public abstract class HeroShell : Hero
        {
            private Hero _hero;
    
            public HeroShell(Hero hero)
            {
                _hero = hero;
            }
    
            public override void Attack()
            {
                _hero.Attack();
            }
        }
    
        //ConcreteDecoratorA
        public class SpiderManShell : HeroShell
        {
            public SpiderManShell(Hero hero) : base(hero) { }
            public override void Attack()
            {
                Console.WriteLine("织网");
                Console.WriteLine("撒网");
                base.Attack();
            }
        }
        //ConcreteDecoratorB
        public class SupperManShell : HeroShell
        {
            public SupperManShell(Hero hero) : base(hero) { }
            public override void Attack()
            {
                Console.WriteLine("我飞");
                Console.WriteLine("我裤衩反穿");
                base.Attack();
            }
        }
    
        //ConcreteComponent
        public class BigHero : Hero
        {
    
            public override void Attack()
            {
                Console.WriteLine("我是破坏者,BigHero");
            }
        }
    }
    

    2.1. 框架中的例子

    // 泛型集合基接口 component:组成
    public interface IEnumerable<out T> : IEnumerable
    { }
    
    // 只读集合接口 decorator:装饰器
    public interface IReadOnlyCollection<out T> : IEnumerable<out T>
    { }
    
    // 集合接口 decorator:装饰器
    public interface ICollection<T> : IEnumerable<T>
    { }
    
    // 列表接口 decorator:装饰器
    public interface IList<T> : ICollection<T>, IEnumerable<T>
    { }
    
    // 列表 concrete-implement: 具体实现
    public class List<T> : ICollection<T>, IEnumerable<T>, IList<T>, IReadOnlyCollection<T>, IReadOnlyList<T>, IList
    { }
    
    // 队列 concrete-implement: 具体实现
    public class Queue<T> : IEnumerable<T>, IReadOnlyCollection<T>, ICollection
    { }
    
    // 链表 concrete-implement: 具体实现
    public class LinkedList<T> : ICollection<T>, IEnumerable<T>, IReadOnlyCollection<T>,  IDeserializationCallback, ISerializable
    { }
    

    如果您认为这篇文章还不错或者有所收获,您可以通过右边的"打赏"功能 打赏我一杯咖啡【物质支持】,也可以点击左下角的【好文要顶】按钮【精神支持】,因为这两种支持都是我继续写作,分享的最大动力!

    作者: 大师兄石头
    来源: https://bigbrotherstone.cnblogs.com/
    声明: 原创博客请在转载时保留原文链接或者在文章开头加上本人博客地址,如发现错误,欢迎批评指正。凡是转载于本人的文章,不能设置打赏功能,如有特殊需求请与本人联系!

  • 相关阅读:
    原生JS实现日历
    重复的事情让机器来做,简化的思想
    Ext3.1的一些使用讨论
    JS使用Crypto实现AES/ECS/zero-padding加密
    一些提升效率的小知识
    一些很有意思的JS现象
    Tiny Linux -- tce-load
    python sqlalchemy mysql 自动映射
    python 反射
    python 动态导包
  • 原文地址:https://www.cnblogs.com/BigBrotherStone/p/decorator.html
Copyright © 2011-2022 走看看