Dekorator

  public abstract class Samochod
  {
    public virtual string PodajNazwe()
    {
      return "Samochód";
    }
    public virtual double PodajCene()
    {
      return 0;
    }
  }



  public class Ford : Samochod
  {
    public override string PodajNazwe()
    {
      return "Ford";
    }
    public override double PodajCene()
    {
      return 50000;
    }
  }


  public class Peugot : Samochod
  {
    public override string PodajNazwe()
    {
      return "Peugot";
    }
    public override double PodajCene()
    {
      return 60000;
    }
  }



  public abstract class Dekorator : Samochod
  {
    public Samochod pojazd;
  }


  public class Klima : Dekorator
  {
    public Klima(Samochod aPojazd)
    {
      pojazd = aPojazd;
    }

    public override string PodajNazwe()
    {
      return pojazd.PodajNazwe() + " z klimatyzacją";
    }

    public override double PodajCene()
    {
      return pojazd.PodajCene() + 7000;
    }
  }

  public class Metalik : Dekorator
  {
    public Metalik(Samochod aPojazd)
    {
      pojazd = aPojazd;
    }

    public override string PodajNazwe()
    {
      return pojazd.PodajNazwe() + " z lakierem metalic";
    }

    public override double PodajCene()
    {
      return pojazd.PodajCene() + 2000;
    }

  }
 

Przykład wykorzystania w klasie formularza (4 Button'y + 4 Label'e)

  public partial class Form1 : Form
  {

    Samochod ford;
    Samochod peugot;

	
	//W konstruktorze tworzone są podstawowe wersje marek i podstawione są pod zmienne typu (sic!) Samochod
	
    public Form1()
    {
      InitializeComponent();
      ford = new Ford();
      peugot = new Peugot();
      przedstaw();
    }
    
    void przedstaw()
    {
      label1.Text = ford.PodajNazwe();
      label2.Text = ford.PodajCene().ToString();
      label3.Text = peugot.PodajNazwe();
      label4.Text = peugot.PodajCene().ToString();
    }
        
    private void btnAddKlimaToFord_Click(object sender, EventArgs e)
    {
      ford = new Klima(ford);
      przedstaw();
    }
    
    private void btnAddMetalikToFord_Click(object sender, EventArgs e)
    {
      ford = new Metalik(ford);
      przedstaw();
    }

    private void btnDelKlimaFromFord_Click(object sender, EventArgs e)
    {
      if (ford is Klima)
        ford = (ford as Dekorator).pojazd;
      przedstaw();
    }

    private void btnDelMetalikFromFord_Click(object sender, EventArgs e)
    {
      if (ford is Metalik)
        ford = (ford as Dekorator).pojazd;
      przedstaw();
    }

    private void btnAddKlimaToPeugot_Click(object sender, EventArgs e)
    {
      peugot = new Klima(peugot);
      przedstaw();
    }

    private void btnAddMetalikToPeugot_Click(object sender, EventArgs e)
    {
      peugot = new Metalik(peugot);
      przedstaw();
    }

    private void btnDelKlimaFromPeugot_Click(object sender, EventArgs e)
    {
      if (peugot is Klima)
        peugot = (peugot as Dekorator).pojazd;
      przedstaw();
    }

    private void btnDelMetalikFromPeugot_Click(object sender, EventArgs e)
    {
      if (peugot is Metalik)
        peugot = (peugot as Dekorator).pojazd;
      przedstaw();
    }
  }