装饰器模式的问题
我有一个抽象类
abstract class Log
{
public string message;
abstract public void Write();
}
和一个实体类
class TextLog : Log
{
public override void Write()
{
Console.WriteLine(message);
}
}
我想编写两个装饰类PriorityLog和ErrorLog,能够对一个Log进行装饰,
能够实现如下结果
TextLog log=new TextLog();
t.message="删除用户";
t.Write();
打印结果为:删除用户
PriorityLog plog=new Priority(log);
plog.level=1;
plog.Write();
打印结果为:删除用户,优先级别:1
ErrorLog elog=new ErrorLog(plog);
elog.level=2;
elog.Write();
打印结果为:删除用户,优先级别:1,错误级别:2
用装饰器模式如何实现?请高手指教!!
[解决办法]
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
TextLog log = new TextLog();
log.message = "删除用户";
log.Write();
PriorityLog plog = new PriorityLog(log);
plog.level = 1;
plog.Write();
ErrorLog elog = new ErrorLog(plog);
elog.level = 2;
elog.Write();
Console.ReadKey();
}
}
abstract class Log
{
public string message;
abstract public void Write();
}
class TextLog : Log
{
public override void Write()
{
Console.WriteLine();
Console.Write(message);
}
}
class PriorityLog : Log
{
Log _log;
public int? level;
public PriorityLog(Log log)
{
_log = log;
}
public override void Write()
{
_log.Write();
Console.Write(",优先级别:"+level??0.ToString());
}
}
class ErrorLog : Log
{
Log _log;
public int? level;
public ErrorLog(Log log)
{
_log = log;
}
public override void Write()
{
_log.Write();
Console.Write(",错误级别:"+level??0.ToString());
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
abstract class Log
{
public string Message { get; set; }
abstract public void Write();
}
class TextLog : Log
{
public override void Write()
{
Console.WriteLine(Message);
}
}
static class LogDecorator
{
//C#的扩展方法不支持扩展属性,但是未来据说要增加这个特性。所以增加以下代码来模拟扩展属性。
#region ExtendFields
private static Dictionary<Log, int[]> ExtendFields = new Dictionary<Log,int[]>();
private static void SetValue(this Log log, int value, int index)
{
if (!ExtendFields.ContainsKey(log))
ExtendFields.Add(log, new int[] { 0, 0 });
ExtendFields[log][index] = value;
}
private static int GetValue(this Log log, int index)
{
if (!ExtendFields.ContainsKey(log))
ExtendFields.Add(log, new int[] { 0, 0 });
return ExtendFields[log][index];
}
#endregion
public static void SetPriority(this Log log, int value)
{
log.SetValue(value, 0);
}
public static int GetPriority(this Log log)
{
return log.GetValue(0);
}
public static void SetErrorLevel(this Log log, int value)
{
log.SetValue(value, 1);
}
public static int GetErrorLevel(this Log log)
{
return log.GetValue(1);
}
//C#的扩展方法不支持覆盖方法,所以不得不另外使用一个函数名,不过这么做也有好处,明确调用的是扩展方法版本。
public static void WriteWithPriorityAndErrorLevel(this Log log)
{
Console.WriteLine("{0},优先级别:{1},错误级别:{2}。", log.Message, log.GetPriority(), log.GetErrorLevel());
}
}
class Program
{
static void Main(string[] args)
{
TextLog tl = new TextLog() { Message = "删除用户" };
tl.SetPriority(1);
tl.SetErrorLevel(2);
tl.WriteWithPriorityAndErrorLevel();
}
}
}