【问题标题】:C# decorator pattern and wrapping issuesC# 装饰器模式和包装问题
【发布时间】:2016-10-26 03:59:11
【问题描述】:

我在包装我的代码返回值时遇到问题。所以基本上我正在尝试显示以下输出:

Morg,类型,xy,

我的代码在 C# 中,根据我下面的代码,这些输出是基于我在字符串中的返回值。我正在使用它们来测试我的程序,看看它是否有效。到目前为止它有效,但不是我想要的方式。我只能显示类型返回值,但似乎无法显示其余部分。

这就是它给我的。

类型

但最上面的那个是我想要显示为输出的那个。不仅仅是类型。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication3
{
    class Program
    {
        static void Main(string[] args)
        {
            MorgReader myMorg = new FileReader();
            MorgReader myMorg2 = new MorgType(new MorgXY(new MorgMovement(new FileReader())));

            Console.WriteLine(myMorg.Read());
            Console.WriteLine(myMorg2.Read());

        }

    }

    // THE MAIN ABSTRACT CLASS //
    abstract class MorgReader
    {
        public abstract string Read();
    }

    //  THE CLASS THAT WILL READ THE FILE //
    class FileReader : MorgReader
    {
        public override string Read()
        {
            return "Morg";
        }
    }

    //  MY READER DECORATOR //

    abstract class ReaderDecorator : MorgReader
    {
        private MorgReader wrappedReader;
        protected ReaderDecorator(MorgReader wrapped)
        {
            wrappedReader = wrapped;
        }
        protected MorgReader WrappedReader
        { get { return wrappedReader; } }
    }

    class MorgType : ReaderDecorator
    {
        public MorgType(MorgReader wrapped) : base(wrapped)
        { }

        public override string Read()
        {
            return "type";
        }
    }

    class MorgXY : ReaderDecorator
    {
        public MorgXY(MorgReader wrapped) : base(wrapped)
        { }

        public override string Read()
        {
            return "x,y";
        }
    }

    class MorgMovement : ReaderDecorator
    {
        public MorgMovement(MorgReader wrapped) : base(wrapped)
        { }

        public override string Read()
        {
            return "paddle";
        }
    }
}

【问题讨论】:

    标签: c# decorator


    【解决方案1】:

    更改您的 ReaderDecorator 课程

    abstract class ReaderDecorator : MorgReader
    {
        private MorgReader wrappedReader;
        protected ReaderDecorator(MorgReader wrapped)
        {
            wrappedReader = wrapped;
        }
    
        protected MorgReader WrappedReader
        { get { return wrappedReader; } }
    
        public override string Read()
        {
            var wrapped = WrappedReader.Read();
            if (!string.IsNullOrEmpty(wrapped))
                wrapped += ", ";
    
            return wrapped + ReadImpl();
        }
    
        // template method
        protected abstract string ReadImpl();
    }
    

    在这样的具体类中实现ReadImpl

    class MorgType : ReaderDecorator
    {
        public MorgType(MorgReader wrapped) : base(wrapped)
        { }
    
        protected override string ReadImpl()
        {
            return "type";
        }
    }
    

    如果你不想引入ReadImpl方法,那么你应该在每个这样的具体类中重写Read方法

    public override string Read()
    {
        var wrapped = WrappedReader.Read();
        if (!string.IsNullOrEmpty(wrapped))
            wrapped += ", ";
    
        return wrapped + "type";
    }
    

    【讨论】:

    • 非常感谢您的帮助!我很感激!
    【解决方案2】:

    我认为您的装饰器模式丢失了......好吧,装饰(LOL)。所以装饰你的抽象类后代,像这样:

    class MorgType : ReaderDecorator
    {
        public MorgType(MorgReader wrapped) : base(wrapped)
        { }
    
        public override string Read()
        {
            return WrappedReader == null ? "type" : WrappedReader.Read() + ",type";
        }
    }
    
    class MorgXY : ReaderDecorator
    {
        public MorgXY(MorgReader wrapped) : base(wrapped)
        { }
    
        public override string Read()
        {
            return WrappedReader == null ? "x,y" : WrappedReader.Read() + ",x,y";
        }
    }
    
    class MorgMovement : ReaderDecorator
    {
        public MorgMovement(MorgReader wrapped) : base(wrapped)
        { }
    
        public override string Read()
        {
            return WrappedReader == null ? "paddle" : WrappedReader.Read() + ",paddle";
        }
    }
    

    您应该会看到 myMorg2 的预期结果,这是您在帖子中描述的逗号分隔输出。

    【讨论】:

    • 请注意,我个人讨厌装饰器模式——这种模式确实应该被列为反模式,因为它引入了所有的弊端。你很快就会同意,一旦你遇到了你的第一个大规模重构事件,如果该模式曾经在一个大型项目中使用过,这肯定会发生......
    • 哈哈!哦,相信我。我已经恨它了。但是非常感谢您的帮助!我真的很感激!
    猜你喜欢
    • 2011-05-19
    • 2016-10-05
    • 2014-10-29
    • 1970-01-01
    • 1970-01-01
    • 2011-02-20
    • 2021-06-05
    • 1970-01-01
    相关资源
    最近更新 更多