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.
中描述的以逗号分隔的输出
我在包装我的代码 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.