JavaRush /Blog Jawa /Random-JV /Pola Desain "Strategi"

Pola Desain "Strategi"

Diterbitake ing grup
Hello! Ing kuliah sadurunge, kita wis nemoni konsep kaya "pola desain". Yen sampeyan lali, ayo ngelingake sampeyan: istilah iki nuduhake solusi standar tartamtu kanggo masalah umum ing program. Pola desain "Strategi" - 1Ing JavaRush kita asring ujar manawa jawaban kanggo meh kabeh pitakonan bisa digoleki ing Google. Mulane, ana wong sing wis bisa ngrampungake masalah sing padha karo sampeyan. Dadi, pola minangka solusi sing diuji wektu lan dites latihan kanggo masalah utawa cara sing paling umum kanggo ngrampungake kahanan masalah. Iki minangka "sepeda" sing ora perlu sampeyan ciptakake dhewe, nanging sampeyan kudu ngerti carane lan kapan kudu ditrapake :) Tugas liyane saka pola yaiku nggawa arsitektur menyang standar siji. Maca kode wong liya dudu tugas sing gampang! Saben uwong nulis kanthi beda, amarga masalah sing padha bisa ditanggulangi kanthi cara akeh. Nanging nggunakake pola ngidini programer beda mangertos logika program tanpa delving menyang saben baris kode (sanajan padha ndeleng iku kanggo pisanan!) Dina iki kita bakal katon ing salah siji saka pola paling umum disebut "Strategi". Pola desain "Strategi" - 2Ayo mbayangno yen kita nulis program sing aktif nggarap obyek Mobil. Ing kasus iki, ora pati penting apa sing ditindakake program kita. Kanggo nindakake iki, kita nggawe sistem warisan karo siji kelas induk Autolan telung kelas anak: Sedan, Trucklan F1Car.
public class Auto {

   public void gas() {
       System.out.println("Едем вперед");
   }

   public void stop() {

       System.out.println("Тормозим!");
   }
}

public class Sedan extends Auto {
}

public class Truck extends Auto {
}

public class F1Car extends Auto {
}
Kabeh telung kelas anak diwenehi loro cara standar saka wong tuwa - gas()lan stop() program kita rampung prasaja: mobil mung bisa maju lan rem. Nerusake karya kita, kita mutusaké kanggo nambah cara anyar kanggo mobil - fill()(isi bahan bakar). Ayo ditambahake menyang kelas induk Auto:
public class Auto {

   public void gas() {
       System.out.println("Едем вперед");
   }

   public void stop() {

       System.out.println("Тормозим!");
   }

   public void fill() {
       System.out.println("Заправить бензин!");
   }
}
Iku bakal katon yen masalah bisa muncul ing kahanan sing prasaja? Inggih, nyatane, dheweke wis muncul ... Pola Desain "Strategi" - 3
public class ChildrenBuggies extends Auto {

   public void fill() {

       //хм... Это детский багги, его не надо заправлять :/
   }
}
Mobil wis muncul ing program kita sing ora cocog karo konsep umum - buggy anak. Bisa uga pedal-powered utawa radio-kontrol, nanging siji bab manawa - ora ana ngendi kanggo sijine bensin menyang. Skema warisan kita nyebabake kita menehi cara umum sanajan kelas sing ora mbutuhake. Apa sing kudu kita lakoni ing kahanan kaya ngono? Contone, sampeyan bisa ngilangi metode fill()ing kelas ChildrenBuggiessupaya nalika nyoba ngisi bahan bakar, ora ana sing kedadeyan:
public class ChildrenBuggies extends Auto {

   @Override
   public void fill() {
       System.out.println("Игрушечную машину нельзя заправить!");
   }
}
Nanging solusi iki meh ora bisa diarani sukses, paling ora amarga duplikasi kode. Contone, paling kelas bakal nggunakake cara saka kelas induk, nanging kelas liyane bakal dipeksa kanggo nolak. Yen kita duwe 15 kelas, lan ing 5-6 kita dipeksa kanggo ngatasi prilaku, duplikasi kode bakal dadi cukup ekstensif. Mungkin antarmuka bisa mbantu kita? Contone, iki:
public interface Fillable {

   public void fill();
}
Kita bakal nggawe antarmuka Fillablekanthi siji cara fill(). Mulane, mobil sing kudu diisi bahan bakar bakal ngetrapake antarmuka iki, nanging mobil liyane (contone, buggy kita) ora bakal. Nanging pilihan iki uga ora cocog karo kita. Hierarki kelas kita bisa tuwuh nganti akeh banget ing mangsa ngarep (bayangake pira macem-macem jinis mobil ing donya). Kita nilar opsi warisan sadurunge amarga kita ora pengin nolak fill(). Ing kene kita kudu ngetrapake ing saben kelas! Apa yen kita duwe 50? Lan yen owah-owahan Kerep digawe kanggo program kita (lan ing program nyata iki bakal meh tansah kelakon!), Kita kudu mbukak watara karo ilat nggandhol metu antarane kabeh 50 kelas lan ngganti prilaku saben wong kanthi manual. Dadi apa sing kudu kita lakoni ing pungkasan? Kanggo ngatasi masalah kita, ayo milih dalan sing beda. Yaiku, ayo dipisahake prilaku kelas kita karo kelas kasebut dhewe. Iki artine apa? Kaya sing sampeyan ngerteni, obyek apa wae duwe negara (set data) lan prilaku (set metode). Prilaku kelas mesin kita kasusun saka telung cara - gas(), stop()lan fill(). Loro cara pisanan apik. Nanging kita bakal mindhah cara katelu ing njaba kelas Auto. Iki bakal dadi pamisahan prilaku saka kelas (luwih tepat, kita misahake mung bagean saka prilaku - loro cara pisanan tetep ing panggonan). Ing endi kita kudu mindhah metode kita fill()? Ora ana sing enggal-enggal ana ing pikirane: / Dheweke kaya wis rampung ing panggonane. Kita bakal pindhah menyang antarmuka sing kapisah - FillStrategy!
public interface FillStrategy {

   public void fill();
}
Napa kita butuh antarmuka iki? Iku prasaja. Saiki kita bisa nggawe sawetara kelas sing bakal ngleksanakake antarmuka iki:
public class HybridFillStrategy implements FillStrategy {

   @Override
   public void fill() {
       System.out.println("Заправляем бензином or электричеством на выбор!");
   }
}

public class F1PitstopStrategy implements FillStrategy {

   @Override
   public void fill() {
       System.out.println("Заправляем бензин только после всех остальных procedures пит-стопа!");
   }
}

public class StandartFillStrategy implements FillStrategy {
   @Override
   public void fill() {
       System.out.println("Просто заправляем бензин!");
   }
}
Kita wis nggawe telung strategi prilaku - kanggo mobil konvensional, kanggo hibrida lan kanggo mobil Formula 1. Saben strategi ngetrapake algoritma pengisian bahan bakar sing kapisah. Ing kasus kita, iki mung output menyang console, nanging bisa uga ana sawetara logika rumit ing metode kasebut. Apa sing kudu ditindakake sabanjure?
public class Auto {

   FillStrategy fillStrategy;

   public void fill() {
       fillStrategy.fill();
   }

   public void gas() {
       System.out.println("Едем вперед");
   }

   public void stop() {
       System.out.println("Тормозим!");
   }

}
Kita nggunakake antarmuka FillStrategyminangka lapangan ing kelas induk Auto. Wigati dicathet: kita ora nemtokake implementasine tartamtu, nanging nggunakake antarmuka. Lan kita butuh implementasi antarmuka khusus FillStrategying kelas mobil anak:
public class F1Car extends Auto {

   public F1Car() {
       this.fillStrategy = new F1PitstopStrategy();
   }
}

public class HybridAuto extends Auto {

   public HybridAuto() {
       this.fillStrategy = new HybridFillStrategy();
   }
}

public class Sedan extends Auto {

   public Sedan() {
       this.fillStrategy = new StandartFillStrategy();
   }
}
Ayo ndeleng apa sing entuk:
public class Main {

   public static void main(String[] args) {

       Auto sedan = new Sedan();
       Auto hybrid = new HybridAuto();
       Auto f1car = new F1Car();

       sedan.fill();
       hybrid.fill();
       f1car.fill();
   }
}
Output konsol:

Просто заправляем бензин!
Заправляем бензином or электричеством на выбор!
Заправляем бензин только после всех остальных procedures пит-стопа!
Apik banget, proses ngisi bahan bakar bisa digunakake! Miturut cara, ora ana sing ngalangi kita nggunakake strategi minangka parameter ing konstruktor! Contone, kaya iki:
public class Auto {

   private FillStrategy fillStrategy;

   public Auto(FillStrategy fillStrategy) {
       this.fillStrategy = fillStrategy;
   }

   public void fill() {
       this.fillStrategy.fill();
   }

   public void gas() {
       System.out.println("Едем вперед");
   }

   public void stop() {
       System.out.println("Тормозим!");
   }
}

public class Sedan extends Auto {

   public Sedan() {
       super(new StandartFillStrategy());
   }
}



public class HybridAuto extends Auto {

   public HybridAuto() {
       super(new HybridFillStrategy());
   }
}

public class F1Car extends Auto {

   public F1Car() {
       super(new F1PitstopStrategy());
   }
}
Ayo mbukak metode kita main()(tetep ora owah) lan entuk asil sing padha! Output konsol:

Просто заправляем бензин!
Заправляем бензином or электричеством на выбор!
Заправляем бензин только после всех остальных procedures пит-стопа!
Pola Strategy nemtokake kulawarga algoritma, encapsulates saben mau, lan mesthekake yen padha bisa diijolke. Iku ngijini sampeyan kanggo ngowahi algoritma preduli saka nggunakake ing sisih klien (definisi iki dijupuk saka buku "Njelajah Pola Desain" lan misale jek kula arang banget sukses). Pola Desain "Strategi" - 4Kita wis ngisolasi kulawarga algoritma sing narik kawigaten kita (jinis mobil ngisi bahan bakar) dadi antarmuka sing kapisah karo sawetara implementasine. Kita wis dipisahake saka inti saka mobil. Mulane, saiki, yen kita kudu nggawe owah-owahan kanggo iki utawa proses ngisi bahan bakar, iki ora bakal mengaruhi kelas mobil kita ing sembarang cara. Kanggo interchangeability, kanggo entuk, kita mung kudu nambah siji metode setter menyang kelas kita Auto:
public class Auto {

   FillStrategy fillStrategy;

   public void fill() {
       fillStrategy.fill();
   }

   public void gas() {
       System.out.println("Едем вперед");
   }

   public void stop() {
       System.out.println("Тормозим!");
   }

   public void setFillStrategy(FillStrategy fillStrategy) {
       this.fillStrategy = fillStrategy;
   }
}
Saiki kita bisa ngganti strategi kanthi cepet:
public class Main {

   public static void main(String[] args) {

       ChildrenBuggies buggies = new ChildrenBuggies();
       buggies.setFillStrategy(new StandartFillStrategy());

       buggies.fill();
   }
}
Yen dumadakan mobil buggy bocah-bocah wiwit diisi bensin, program kita bakal siyap kanggo skenario kaya ngono :) Iku kabeh, bener! Sampeyan wis sinau pola desain liyane, sing mesthi sampeyan butuhake lan bakal mbantu sampeyan luwih saka sepisan nalika nggarap proyek nyata :) Sampai ketemu maneh!
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION