该操作可以描述为:
public interface ITextDecorator
{
string GetString(string input);
}
这封装了方式(Web.config、XML 等)并强调了内容(装饰字符串)。
然后,任何可能需要装饰文本的类都可以采用该接口的实例:
public class Foo
{
private ITextDecorator _textDecorator;
public Foo(ITextDecorator textDecorator)
{
_textDecorator = textDecorator;
}
public void Bar(string text)
{
text = _textDecorator.GetString(text);
// ...
}
}
的示例实现ITextDecorator
可能是:
public sealed class ExclamationPointTextDecorator : ITextDecorator
{
public string GetString(string input)
{
return input + "!";
}
}
public sealed class ConditionalTextDecorator : ITextDecorator
{
private Func<bool> _condition;
private ITextDecorator _innerTextDecorator;
public ConditionalTextDecorator(Func<bool> condition, ITextDecorator innerTextDecorator)
{
_condition = condition;
_innerTextDecorator = innerTextDecorator;
}
public string GetString(string input)
{
return _condition() ? _innerTextDecorator.GetString(input) : input;
}
}
这些类的示例用法可能是:
var textDecorator = new ConditionalTextDecorator(
() => true, // Check Web.config, an XML file, or any other condition
new ExclamationPointTextDecorator());
var foo = new Foo(textDecorator);
foo.Bar("Test");
请注意附加的感叹号与其条件调用的分离。这两个类现在可以独立于另一个类重用。这种细粒度对象的设计风格最适用于控制反转 (IoC) 容器。但是,这不是必需的。