algorytm.org

Implementacja w C#



Baza Wiedzy
wersja offline serwisu przeznaczona na urządzenia z systemem Android
Darowizny
darowiznaWspomóż rozwój serwisu
Nagłówki RSS
Artykuły
Implementacje
Komentarze
Forum
Bookmarki






Sonda
Implementacji w jakim języku programowania poszukujesz?

Dekorator (decorator) - Implementacja w C#
Ocena użytkownikóww: *****  / 7
SłabyŚwietny
Nadesłany przez Kamil Dworak, 14 sierpnia 2010 22:00
Kod przedstawiony poniżej przedstawia główną część rozwiązania problemu.
Pobierz pełne rozwiązanie.

Jeżeli nie odpowiada Ci sposób formatowania kodu przez autora skorzystaj z pretty printer'a i dostosuj go automatycznie do siebie.

dekorator.cs:
/****************************************
*   Wzorzec Projektowy Decorator        *
*   (dekorator)                         *   
*   www.algorytm.org                    *
*   Opracowal Dworak Kamil              *
*****************************************/

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Main {

    /* Standardowy nieudekorowany samochod */
    abstract class Samochod {
	    protected string samochod = "Samochod podstawowy";
    	
	    virtual public String about(){
		    return samochod;
	    }
    	
	    public abstract double cena();
}
    /* abstrakcyjny dekorator */
    abstract class Dekorator : Samochod {
        public abstract override String about();
        }

    /* teraz mamy 2 przykladowe marki samochodow */
    class Mercedes : Samochod {

	    public Mercedes(){
		    samochod = "Mercedes";
	    }
    	
	    public override double cena(){
		    return 500000;
	    }
}

    class Fiat : Samochod {
	
	    public Fiat(){
		    samochod = "Fiat";
	    }
    	
	    public override double cena(){
		    return 100000;
	    }
}

    /* czas na same dodatki */
    class Klimatyzacja : Dekorator {
	    Samochod car;
    	
	    public Klimatyzacja(Samochod samochod){
            car = samochod;
	    }
    	
	    public override String about(){
            return car.about() + " + klimatyzacja";
	    }
    	
	    public override double cena(){
            if (car is Mercedes)
            {
                return car.cena() + 100000;
		    }
            else if (car is Fiat)
            {
                return car.cena() + 20000;
		    }
		    return 0;
	    }
}

    class OponyZimowe : Dekorator {
	Samochod car;
	
	public OponyZimowe(Samochod samochod){
        car = samochod;
	}

    public override String about()
    {
        return car.about() + " + opony zimowe";
	}
	
	/* niech ceny beda takie same */
    public override double cena()
    {
        return car.cena() + 31234;
	}
}


    public class Application
    {
        public static void Main(String[] args)
        {
        Samochod s1 = new Mercedes();
		Samochod s2 = new Fiat();
		
		Console.WriteLine("\nBez wyposazenia");
        Console.WriteLine(s1.about() + " " + s1.cena());
        Console.WriteLine(s2.about() + " " + s2.cena());
		
		//dodajemy po klimie
		
		s1 = new Klimatyzacja(s1);
		s2 = new Klimatyzacja(s2);
        Console.WriteLine("\nZ Klima");
        Console.WriteLine(s1.about() + " " + s1.cena());
        Console.WriteLine(s2.about() + " " + s2.cena());
		
		// i opony
		
		s1 = new OponyZimowe(s1);
		s2 = new OponyZimowe(s2);
        Console.WriteLine("\nZ oponami");
        Console.WriteLine(s1.about() + " " + s1.cena());
        Console.WriteLine(s2.about() + " " + s2.cena());
		
		//odrazu tworzymy wyposazony samochod
        Console.WriteLine("\nPelne wyposazenie");
		Samochod s3 = new OponyZimowe(new Klimatyzacja(new Mercedes()));
        Console.WriteLine(s3.about() + " " + s3.cena());
        Console.ReadLine();
        }
    }
}
Komentarze
photo
+1 # lukasz3456543634 2015-09-08 09:45
"Cannot implicitly convert type Klimatyzacja to Samochod
Odpowiedz | Odpowiedz z cytatem | Cytować
photo
0 # Piotras 2019-03-19 09:19
Cytuję lukasz3456543634:
"Cannot implicitly convert type Klimatyzacja to Samochod


Musiałeś dziedziczenia gdzieś nie dodać.
Odpowiedz | Odpowiedz z cytatem | Cytować
photo
0 # Kuboludek 2016-04-20 12:42
Czy dekorator musi być koniecznie "potomkiem" dekorowanego obiektu? Nie bardzo mi pasuje takie rozwiązanie, ze względu na identyczne nazwy publiczne, jeżeli obiekt "agreguje się" w dekoratorze.
Odpowiedz | Odpowiedz z cytatem | Cytować
Dodaj komentarz