public static void Main()
ITalker talker = new ConsoleTalker();
talker.say("hello world");
public interface ITalker {
void say(string message);
public class ConsoleTalker : ITalker {
public void say(string message){
Console.WriteLine(message);
public abstract class BaseDecoratorTalker : ITalker {
protected ITalker wrappee;
public BaseDecoratorTalker(ITalker wrappee){
public abstract void say(string message);
public class YellingDecorator : BaseDecoratorTalker{
public YellingDecorator(ITalker wrappee):base(wrappee){
public override void say(string message){
var yelledMessage = message.ToUpper();
wrappee.say(yelledMessage);
public class FrenchDecorator : BaseDecoratorTalker{
public FrenchDecorator(ITalker wrappee):base(wrappee){
public override void say(string message){
var frenchMessage = message.Replace("hello", "bonjour");
wrappee.say(frenchMessage);