C# 装饰器模式和包装问题

C# decorator pattern and wrapping issues

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

Morg, type, xy, paddle

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

这就是它给我的。

type

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

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";
        }
    }
}

改变你的 ReaderDecorator class

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

像这样class具体实施ReadImpl

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

    protected override string ReadImpl()
    {
        return "type";
    }
}

如果你不想引入 ReadImpl 方法,那么你应该像这样在 every 具体 class 中覆盖 Read 方法

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

    return wrapped + "type";
}

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

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 的预期结果,这是您在 post.

中描述的以逗号分隔的输出