paint-brush
11 Esasy dizaýn nagyşlary: Esasy gollanmatarapyndan@ssukhpinder
Täze taryh

11 Esasy dizaýn nagyşlary: Esasy gollanma

tarapyndan Sukhpinder Singh33m2024/09/08
Read on Terminal Reader

Örän uzyn; Okamak

Programma arhitekturasynyň syrlaryny açyň * Programma arhitekturasyny özleşdirmek: 11 esasy dizaýn nagyşlary düşündirildi *. Kitap C # programma dilinde C # 8.0 ýazylýar. Zawod döretmek üçin zawod döretmek üçin ulanyp boljak 11 dizaýn nagşy bar. Abstrakt zawod nagşy, uzaldylan zawod usulydyr; zawod usulyndan geçmek maslahat berilýär.
featured image - 11 Esasy dizaýn nagyşlary: Esasy gollanma
Sukhpinder Singh HackerNoon profile picture
0-item
1-item
2-item
3-item
4-item

Programma arhitekturasyny ussatlyk bilen programma arhitekturasynyň syrlaryny açyň: 11 sany esasy dizaýn nusgasy düşündirildi .

Mazmuny

  1. Dizaýn nusgasy - Abstrakt zawod
  • Okuwyň maksatlary
  • Başlamak
  • Abstrakt zawod üpjün edijisini nädip ulanmaly?
  • Çykyş

2. Dizaýn nusgasy - Adapter

  • Kase ulanyň
  • Okuwyň maksatlary
  • Başlamak

3. Dizaýn nusgasy - Gurluşykçy

  • Kase ulanyň
  • Okuwyň maksatlary
  • Başlamak
  • Esasy () usulyndan gurluşykçy nagşyny nädip ulanmaly
  • Çykyş

4. Jogapkärçilik nusgasyny nädip ulanmaly

  • Kase ulanyň
  • Başlamak
  • Jogapkärçilik zynjyryny nädip ulanmaly?
  • Çykyş

5. Dizaýn nusgasy - bezeg

  • Kase ulanyň
  • Okuwyň maksatlary
  • Başlamak
  • Bezeg nagşy
  • Doly kod
  • Çykyş

6. Dizaýn nusgasy - Zawod usuly

  • Okuwyň maksatlary
  • Başlamak
  • Zawod usulyny nädip ulanmaly?
  • Çykyş

7. Dizaýn nusgasy - Iterator

  • Kase ulanyň
  • Başlamak
  • Hereketde Iterator nusgasy
  • Çykyş

8. Dizaýn nusgasy - araçy

  • Kase ulanyň
  • Okuwyň maksatlary
  • Başlamak
  • Esasy usuldan araçy nagşyny nädip ulanmaly

9. Dizaýn nusgasy - Synçy

  • Kase ulanyň
  • Okuwyň maksatlary
  • Başlamak
  • Synçy nagşyny nädip ulanmaly?
  • Çykyş

10. Awans emläk nusgasy C # 8.0

  • Başlalyň
  • Täze wyklýuçatel sintaksis bilen nagyş gabat gelýän programma
  • Synag programmasy
  • Konsol çykyşy

11. Dizaýn nusgasy - Singleton

  • Okuwyň maksatlary
  • Başlamak
  • Çykyş
  • Tekstiň howpsuzlygy

Dizaýn nusgasy - Abstrakt zawod

Gang of Four-yň pikiriçe, abstrakt zawod nagyşlary zawod döretmek üçin zawod hökmünde kabul edilip bilner.


Okuwyň maksatlary

  • Abstrakt zawodyň dizaýny nähili?
  • Abstrakt zawod dizaýn nusgasyny ulanyp kod nädip ýazmaly?
  • Zawod üpjün edijisini nädip döretmeli?
  • Zawod üpjün edijisini ulanýan müşderi programmasyny nädip döretmeli (Esasy usuldan)

Zerur şertler

Abstrakt zawod nagşy, diňe uzaldylan zawod usulydyr; abstrakt zawod dizaýnyna düşünmezden ozal zawod usulyndan geçmek maslahat berilýär.

  • OOPS düşünjeleri barada esasy bilim.
  • Islendik programmirleme dilini bilmek.

Başlamak

Tygşytlamak we häzirki hasaplar ýaly hasap görnüşleri bolan islendik Bankyň şol bir mysalyna seredeliň. Indi, abstrakt zawod dizaýn nusgasyny ulanyp, ýokardaky mysaly durmuşa geçireliň.


Ilki bilen ISavingAccount we ICurrentAccount interfeýslerini aşakdaky ýaly ýerine ýetiriň:


 public interface ISavingAccount{ } public interface ICurrentAccount{ }


Aşakdaky synplarda interfeýsi miras alyň


 public class CurrentAccount : ICurrentAccount { public CurrentAccount(string message) { Console.WriteLine(message); } } public class SavingsAccount : ISavingAccount { public SavingsAccount( string message) { Console.WriteLine(message); } }


Her hasap görnüşi üçin abstrakt usullar bilen abstrakt synp ýazalyň.


 public abstract class AccountTypeFactory { public abstract ISavingAccount SavingAccountFactory(string message); public abstract ICurrentAccount CurrentAccountFactory(string message); }


Indi, abstrakt usullaryň durmuşa geçirilmegini üpjün edýän “Bank1Fabrika” atly zawod durmuşa geçirişini döredeliň.


 public class Bank1Factory : AccountTypeFactory { public override ICurrentAccount CurrentAccountFactory(string message) { return new CurrentAccount(message); } public override ISavingAccount SavingAccountFactory(string message) { return new SavingsAccount(message); } }


Abstrakt zawod dizaýn nagşy , zawodlary kesgitleme boýunça yzyna getirýän zawod üpjünçisini durmuşa geçirmeli zawod usulyndan tapawutlanýar.


Indi döredilen ähli abstraksiýalar we fabrikler bar. Zawod üpjün edijisini dizaýn edeliň. Zawod üpjün edijisi üçin kod parçasynyň aşagyndan tapmagyňyzy haýyş edýäris, bu ýerde statiki usul hasabyň adyna esaslanýan zawod döreder.


 public class AccountFactoryProvider { public static AccountTypeFactory GetAccountTypeFactory(string accountName) { if (accountName.Contains("B1")) { return new Bank1Factory(); } else return null; } }

Abstrakt zawod üpjün edijisini nädip ulanmaly?

Hasap belgileriniň sanawyna mysal getireliň, eger hasabyň ady sözme-söz “ B1 ” -den ybarat bolsa, onda zawod üpjünçisiniň üsti bilen yzyna gaýtarylan Bank1Fabrika mysalyny ulanar.

 static void Main(string[] args) { List<string> accNames = new List<string> { "B1-456", "B1-987", "B2-222" }; for (int i = 0; i < accNames.Count; i++) { AccountTypeFactory anAbstractFactory = AccountFactoryProvider.GetAccountTypeFactory(accNames[i]); if (anAbstractFactory == null) { Console.WriteLine("Invalid " + (accNames[i])); } else { ISavingAccount savingAccount = anAbstractFactory.SavingAccountFactory("Hello saving"); ICurrentAccount currentAccount = anAbstractFactory.CurrentAccountFactory("Hello Current"); } } Console.ReadLine(); }


Hasabyň adynda "B1" sözme-söz ýok bolsa, programma nädogry {{accountName}} çykar

Çykyş

Aboveokardaky kod parçasynyň çykyşyny aşakda tapmagyňyzy haýyş edýäris.


 Hello saving B1-456 Hello Current B1-456 Hello saving B1-987 Hello Current B1-987

Dizaýn nusgasy - Adapter

Gang of Four-yň pikiriçe, Adapter nagşy synpyň interfeýslerini müşderiniň talap edýän interfeýslerine öwürýär.


Başgaça aýdylanda, adapter dizaýn nagşy gabat gelmeýän interfeýsleriň bilelikde işlemegine kömek edýär.

Kase ulanyň

Iki guramanyň birleşmeginiň mysalyna seredeliň; X gurama Y-ny alýar, ýöne kod birleşdirilende interfeýsler gabat gelmeýär. Y guramasynyň amallarynyň sanawyny berýän interfeýsiň X bilen gabat gelmeýändigini çaklaň.


Şeýlelik bilen, adapter dizaýn nagşy, durmuşa geçirilmegi gaty gönümel bolan bu meseläni çözmäge kömek edýär.

Okuwyň maksatlary

  • Adapter dizaýn nagşyny ulanyp nädip kodlamaly?

Başlamak

Geliň, X guramasynyň müşderi programmasynyň talap edýän nagyşlaryna öwrülen Y guramasyndan geleşikleriň sanawyny döredeliň. Aboveokardaky synp “Adaptee” diýlip atlandyrylýar.


 public class OrgYTransactions { public List<string> GetTransactionsList() { List<string> transactions = new List<string>(); transactions.Add("Debit 1"); transactions.Add("Debit 2"); transactions.Add("Debit 3"); return transactions; } }


Ikinjiden, maksatly interfeýs döredeliň.


 public interface ITransactions{ List<string> GetTransactions(); }


Indi, geliň, adapter synpyny aşakdaky ýaly durmuşa geçireliň.


 public class TransAdapter : OrgYTransactions, ITransactions { public List<string> GetTransactions() { return GetTransactionsList(); } }


Aboveokardaky ähli amallar ýerine ýetirilenden soň, adapter synpyny konsol programmasynda nädip ulanmalydygyna düşüneliň.


 class Program { static void Main(string[] args) { ITransactions adapter = new TransAdapter(); foreach (var item in adapter.GetTransactions()) { Console.WriteLine(item); } } }


Aşakdaky ulanylyşyna ýakyndan göz aýlasaňyz, üçünji tarap synpy OrgYTransaction interfeýsleriniň nähili görünýändigini göz öňünde tutman, maksatly interfeýs ITransaction we adapter synp TransAdapter ulandyk. Bu, adapter dizaýn nagşynyň güýji, synpyň interfeýslerini müşderiniň talap edýän interfeýslerine öwürýär.

Dizaýn nusgasy - Gurluşykçy

Gang of Four-yň pikiriçe, “Gurluşykçy” döredijilik nagşy, bir zady gurmak üçin belli bir usuly aýyrmaga we gaýtadan ulanmaga mümkinçilik berýär.


Kase ulanyň

Awtoulagdan mysal alalyň we ulanyjy iki sany modeli, ýagny SUV we Sedan gurmak isledi.


Gurluşykçynyň dizaýn nagşy ýokardaky ulanylyş ýagdaýynda peýdaly bolýar we geliň ädimme-ädim görkezeliň.


Awtoulag synpynyň aşakdaky aýratynlyklary bar.

 public class Car{ public string Name { get; set; } public double TopSpeed { get; set; } public bool IsSUV { get; set; } }

Okuwyň maksatlary

  • Gurluşyk dizaýn nusgasyny ulanyp nädip kodlamaly?

Başlamak

Ilki bilen, ulanylyş ýagdaýyna görä ulaglar ýa-da sedanlar ýaly dürli awtoulag modelleri bilen uzaldylan abstrakt synp gurluşykçysyny durmuşa geçireliň.


 public abstract class CarBuilder { protected readonly Car _car = new Car(); public abstract void SetName(); public abstract void SetSpeed(); public abstract void SetIsSUV(); public virtual Car GetCar() => _car; }


Abstrakt synp aşakdaky usullardan durýar

  • Awtoulag synpynyň her bir emlägi üçin abstrakt usullar.
  • Awtoulag synpy mysalyndan çykýan wirtual usul.


Indi, “CarBuilder” synpyndan dürli awtoulag modellerini gurmak we öndürilen awtoulagyň mysalyny yzyna getirýän zawod döredeliň.


 public class CarFactory { public Car Build(CarBuilder builder) { builder.SetName(); builder.SetSpeed(); builder.SetIsSUV(); return builder.GetCar(); } }


Netijede, awtoulaglaryň dürli modellerini durmuşa geçiriň.

ModelSuv.cs

 public class ModelSuv : CarBuilder { public override void SetIsSUV() { _car.IsSUV = true; } public override void SetName() { _car.Name = "Maruti SUV"; } public override void SetSpeed() { _car.TopSpeed = 1000; } }

ModelSedan.cs

 public class ModelSedan : CarBuilder { public override void SetIsSUV() { _car.IsSUV = false; } public override void SetName() { _car.Name = "Maruti Sedan"; } public override void SetSpeed() { _car.TopSpeed = 2000; } }

Esasy () usuldan ulanyjy gurluşykçy nusgasyny nädip ulanmaly

Ahyrynda, zawodyň kömegi bilen dürli awtoulag modellerini gurmak üçin dizaýn nagyşlaryny ulanalyň. Gurmak (<model>) usuly.


 static void Main(string[] args) { var sedan = new ModelSedan(); var suv = new ModelSuv(); var factory = new CarFactory(); var builders = new List<CarBuilder> { suv, sedan }; foreach (var b in builders) { var c = factory.Build(b); Console.WriteLine($"The Car details" + $"\n--------------------------------------" + $"\nName: {c.Name}" + $"\nIs SUV: {c.IsSUV}" + $"\nTop Speed: {c.TopSpeed} mph\n"); } }

Aboveokardaky ulanyş, gurluşykçynyň dizaýn nusgasyny ulanyp, dürli awtoulag modellerini nädip ajaýyp gurup biljekdigimizi görkezýär.


Kod nagşy ýokary derejede saklanýar we giňeldilýär. Geljekde täze modeli ösdürmeli bolsa, diňe täze model CarBuilder synpyny giňeltmeli we ol ýerine ýetirildi.

Çykyş

Jogapkärçilik zynjyryny nädip ulanmaly

Gang of Four-yň pikiriçe, haýyşy işlemek üçin jogapkärçilik zynjyryny kesgitleýär. Başgaça aýdylanda, haýsydyr bir obýekt jogapkärçiligini kabul edýänçä haýyşy bir obýektden beýlekisine geçiriň.


Kase ulanyň

Islendik kompaniýa kompaniýasynda talaplar ulgamynyň mysalyna seredeliň. Ine, kim tarapyndan tassyklanyp bilinjek bahalaryň sanawy.


 100–1000 Rs => Junior/Senior Engineers => Approved by Manager 1001–10000 Rs => Managers => Approved by Senior Manager


Eger mukdar 10000 diapazonyň daşynda bolsa, baş müdirden aýratyn tassyknama talap edilýär.


Aboveokardaky ulanylyş meselesi, jogapkärçilik zynjyrynyň dizaýn nusgasyny ulanyp aňsatlyk bilen amala aşyrylyp bilner. Şeýlelikde, talap synpynyň aşakdaky aýratynlyklary bar.


 public class Claim{ public int Id{get;set;} public double amount{get;set;} }

Başlamak

Ilki bilen, talaplary tassyklaýjynyň haýsy funksiýalary ýerine ýetirip biljekdigini kesgitläliň we dürli derejedäki işgärler üçin iýerarhiýa düzeliň. Aşakda görkezilişi ýaly abstrakt synpy durmuşa geçiriň


 public abstract class ClaimApprover { protected ClaimApprover claimApprover; public void SetHierarchy(ClaimApprover claimApprover) { this.claimApprover = claimApprover; } public abstract void ApproveRequest(Claim claim); }


Ulanylyş ýagdaýyna görä, geliň “kiçi / uly” talap edijini süreliň. Işgärleriň bu synpy / belligi haýsydyr bir talaplary tassyklap bilmejekdigine üns beriň.


 public class Junior : ClaimApprover { public override void ApproveRequest(Claim claim) { System.Console.WriteLine("Cannot approve"); } }


Edil şonuň ýaly-da, dolandyryjy we uly menejer rollary üçin ýerine ýetiriş kesgitläliň.


 public class Manager : ClaimApprover { public override void ApproveRequest(Claim claim) { if (claim.amount >= 100 && claim.amount <= 1000) { System.Console.WriteLine($"Claim reference {claim.Id} with amount {claim.amount} is approved by Manager"); } else if (claimApprover != null) { claimApprover.ApproveRequest(claim); } } }


Üns beriň, mukdar aralygyna görä, dolandyryjynyň çäginde bolsa, talap dolandyryjy tarapyndan tassyklanyp bilner; bolmasa, haýyş Uly Dolandyryja geçiriler.


 public class SeniorManager : ClaimApprover { public override void ApproveRequest(Claim claim) { if (claim.amount > 1000 && claim.amount <= 10000) { System.Console.WriteLine($"Claim reference {claim.Id} with amount {claim.amount} is approved by Senior Manager"); } else { System.Console.WriteLine($"Exceptional approval for Claim reference {claim.Id} with amount {claim.amount} is approved by Senior Manager"); } } }


Şonuň ýaly-da, mukdar aralygy Uly Dolandyryjynyň çäginde bolsa, talap dolandyryjy tarapyndan tassyklanyp bilner; bolmasa, iýerarhiýada iň soňky bolup, çäkden daşardaky mukdarda aýratyn tassyklama edilýär.


 ClaimApprover junior = new Manager(); ClaimApprover sukhpinder = new Manager(); ClaimApprover singh = new SeniorManager(); junior.SetHierarchy(sukhpinder); sukhpinder.SetHierarchy(singh); Claim c1 = new Claim() { amount = 999, Id = 1001 }; Claim c2 = new Claim() { amount = 10001, Id = 1002 }; junior.ApproveRequest(c1); sukhpinder.ApproveRequest(c2);

Jogapkärçilik zynjyryny nädip ulanmaly?

  1. Talaby tassyklaýjyny kesgitläň: haýsydyr bir talaplary tassyklap bilmese-de kiçi.
  2. Talap tassyklaýjysyny kesgitläň: dolandyryjy “sukhpinder”.
  3. Talaby tassyklaýjyny kesgitläň: uly ýolbaşçy “Singh”.
  4. Kiçijikler üçin iýerarhiýa gatnaşyklaryny guruň, ýagny talaplary tassyklaýan dolandyryjy.
  5. Dolandyryjy üçin iýerarhiýa gatnaşyklaryny guruň, ýagny talaplary tassyklaýan uly menejer.
  6. Iki dürli talaplary dörediň.
  7. Junior talap arzasyny dolandyryja iberýär.
  8. Dolandyryjy talap arzasyny uly dolandyryja iberýär.

Çykyş

 Claim reference 1001 with amount 999 is approved by Manager Exceptional approval for Claim reference 1002 with amount 10001 is approved by Senior Manager


1-nji setiriň çykarylyşy üçin mukdar çäkde boldy, şonuň üçin dolandyryjy muny tassyklady.


2-nji setir üçin, uly menejer muny tassyklasa-da, mukdar çäkden çykdy.

Dizaýn nusgasy - bezeg

Gang of Four-yň pikiriçe, nagyş synp obýektine dinamiki taýdan goşmaça jogapkärçilik goşýar.


Kase ulanyň

On million dollarlyk awtoulag satyn almagyň mysalyna seredeliň; kompaniýa aşakdaky goşmaça aýratynlyklary hödürleýär.

  • Gün şöhlesi
  • Öňdebaryjy aýdym-saz ulgamy
  • we başgalar


Käbir goşmaça aýratynlyklar bilen awtoulagyň umumy bahasy ýokarlanýar. Decorator nagşyny ulanyp, ýokardaky ulanylyş ýagdaýyny durmuşa geçireliň.

Okuwyň maksatlary

  • Bezeg dizaýn nusgasyny ulanyp nädip kodlamaly?

Başlamak

Aboveokarda kesgitlenen ulanylyş ýagdaýyny durmuşa geçireliň. Ilki bilen abstrakt synp awtoulagyny we onuň esasy usullaryny kesgitläň.


 public abstract class Car{ public abstract int CarPrice(); public abstract string GetName(); }


Abstrakt synp awtoulagynyň üstünden uzalyp gidýän kiçijik ulagy gözden geçiriň.


 public class SmallCar : Car{ public override int CarPrice() => 10000; public override string GetName() => "Alto Lxi"; }


Indi, “Car” komponentini ulanyp, “CarDecorator” synpyny durmuşa geçiriň.


 public class CarDecorator : Car { protected Car _car; public CarDecorator(Car car) { _car = car; } public override int CarPrice() => _car.CarPrice(); public override string GetName() =>_car.GetName(); }


Indi, CarDecorator synpyna miras galan awtoulag üçin elýeterli her goşmaça aýratynlyk üçin aýratyn synp döredeliň.


Ulanylyş ýagdaýyna görä, goşmaça aýratynlyklar gün şöhlesinden we ösen aýdym-saz ulgamyndan ybaratdyr.

AdvanceMusic.cs

Usullary ýokaşdyryň

  • Awtoulagyň umumy bahasyna “ösen aýdym-saz ulgamynyň” goşmaça bahasyny goşuň.

  • Awtoulagyň adyny goşmaça aýratynlyk ady bilen täzeläň.

     public class AdvanceMusic : CarDecorator { public AdvanceMusic(Car car) : base(car) { } public override int CarPrice() => _car.CarPrice() + 3000; public override string GetName()=> "Alto Lxi with advance music system"; }

Gün şöhlesi. cs

Usullary ýokaşdyryň

  • Awtoulagyň umumy bahasyna “gün şöhlesiniň” goşmaça bahasyny goşuň.
  • Awtoulagyň adyny goşmaça aýratynlyk ady bilen täzeläň.
 public class Sunroof : CarDecorator { public Sunroof(Car car) : base(car) { } public override int CarPrice() => _car.CarPrice() + 2000; public override string GetName() => "Alto Lxi with Sunroof"; }

Hereketde bezeg nusgasy

“SmallCar” mysalyny dörediň we awtoulagyň adyny we bahasyny çykaryň.


 Car car = new SmallCar(); Console.WriteLine($"Price of car {car.GetName()} : " + car.CarPrice());


Indi, aşakda görkezilişi ýaly goşmaça aýratynlyklary goşalyň


 var car1 = new Sunroof(car); var car2 = new AdvanceMusic(car);

Doly kod

 static void Main(string[] args) { Car car = new SmallCar(); Console.WriteLine($"Price of car {car.GetName()} : " + car.CarPrice()); var car1 = new Sunroof(car); Console.WriteLine($"Price of car {car1.GetName()} : " + car1.CarPrice()); var car2 = new AdvanceMusic(car); Console.WriteLine($"Price of car {car2.GetName()} : " + car2.CarPrice()); }

Çykyş

Gutlaýarys .. !! Bezeg nagşyny ulanyp, ulanylyş gabyny üstünlikli ýerine ýetirdiňiz.

Dizaýn nusgasy - Zawod usuly

Dört toparyň pikiriçe, zawod usuly kiçi klasa haýsy synp obýektiniň döredilmelidigini kesgitlemäge mümkinçilik berýär.


Okuwyň maksatlary

  • Zawod usulynyň dizaýny nähili?
  • Zawod usuly bilen kod nädip ýazmaly?

Başlamak

Hasap görnüşleri bolan islendik Bankyň Tygşytlylyk we häzirki hasaplar ýaly mysalyna seredeliň. Indi, zawodyň dizaýn nusgasyny ulanyp, ýokardaky mysaly durmuşa geçireliň


Ilki bilen hasap görnüşli abstrakt synp dörediň.


 public abstract class AccoutType { public string Balance { get; set; } }


Aşakda görkezilişi ýaly “AccountType” abstrakt synpyny miras alýan häzirki we tygşytlaýjy hasap sapaklaryny ýerine ýetiriň.


 public class SavingsAccount : AccoutType { public SavingsAccount() { Balance = "10000 Rs"; } } public class CurrentAccount : AccoutType { public CurrentAccount() { Balance = "20000 Rs"; } }


Ahyrynda, synp obýektini döretmäge kömek edýän şertnama üpjün etjek zawod interfeýsini durmuşa geçireliň. Bu interfeýs thearadyjy hökmünde hem bellidir.


 public interface IAccountFactory { AccoutType GetAccoutType(string accountName); }


Ahyrynda, aşakda görkezilişi ýaly döredijiniň interfeýs usulynyň ýerine ýetirilişini ýazyň. Döredijini durmuşa geçirýän synp beton dörediji hökmünde bellidir.


 public class AccountFactory : IAccountFactory { public AccoutType GetAccoutType(string accountName) { if (accountName.Equals("SAVINGS", StringComparison.OrdinalIgnoreCase)) { return new SavingsAccount(); } else if (accountName.Equals("CURRENT", StringComparison.OrdinalIgnoreCase)) { return new CurrentAccount(); } else { throw new ArgumentException("Invalid account name"); } } }


Ine. Bank mysalyny ulanyp zawod usulyny üstünlikli durmuşa geçirdiňiz.

Zawod usulyny nädip ulanmaly?

Kiçi topar, hasabyň adyna esaslanyp haýsy “AccountType” synp obýektiniň dörediljekdigini kesgitlär.


 class Program { static void Main(string[] args) { IAccountFactory accountFactory = new AccountFactory(); var savingAccount = accountFactory.GetAccoutType("SAVINGS"); Console.WriteLine("Saving account balance: " + savingAccount.Balance); var currentAccount = accountFactory.GetAccoutType("CURRENT"); Console.WriteLine("Current account balance: " + currentAccount.Balance); } }

Mysal üçin, hasabyň ady “Tygşytlamak” bolsa, “SavingAccount” synp obýekti dörediler we yzyna gaýtarylar.


Şonuň ýaly-da, hasabyň ady “CURRENT” bolsa, “CurrentAccount” synp obýekti dessine we yzyna gaýtarylar.

Çykyş

 Saving account balance: 10000 Rs Current account balance: 20000 Rs

Dizaýn nusgasy - Iterator

Gang of Four-yň pikiriçe, iterator nagşy, agregatoryň ýerine ýetirilişini bilmezden almak prosesini üpjün edýär.


Kase ulanyň

Awtoulaglaryň ýygyndy sanawyndan we motosiklleriň bir toparyndan mysal alalyň, sanawyň ýa-da massiwiň bardygyny bilmän kolleksiýanyň üstünde gaýtalanmagy üçin agregator obýektini dizaýn etmeli.


Iterator dizaýn nagşy, adaty iteratoryň dürli ýygnamak görnüşlerini kesip geçjek bu meseläni çözmäge kömek edýär.

Başlamak

Useokardaky ulanylyş ýagdaýyny göz öňünde tutup, sanawyň we massiw iteratorynyň üstünde abstrakt gatlak hökmünde hereket edýän adaty iterator interfeýsini kesgitläliň.


 public interface IVehicleIterator{ void First(); bool IsDone(); string Next(); string Current(); }


Indi, ulanylyş ýagdaýyna görä ýokardaky interfeýsi ýerine ýetirýän awtoulag we motosikl iteratorlaryny ýazyň.

CarIterator.cs

 public class CarIterator : IVehicleIterator { private List<string> _cars; private int _current; public CarIterator(List<string> cars) { _cars = cars; _current = 0; } public string Current() { return _cars.ElementAt(_current); } public void First() { _current = 0; } public bool IsDone() { return _current >= _cars.Count; } public string Next() { return _cars.ElementAt(_current++); } }


Awtoulag iterator sanawy <string> ýygyndysynyň üstünde ýerine ýetirilýär we interfeýs usullarynyň ýerine ýetirilmegini üpjün edýär.

MotorcycleIterator.cs

Motosikl iteratory setir [] ýygnamak arkaly amala aşyrylýar we interfeýs usullarynyň ýerine ýetirilmegini üpjün edýär.


 public class MotercycleIterator : IVehicleIterator { private string[] _motercylces; private int _current; public MotercycleIterator(string[] motercylces) { _motercylces = motercylces; _current = 0; } public string Current() { return _motercylces[_current]; } public void First() { _current = 0; } public bool IsDone() { return _current >= _motercylces.Length; } public string Next() { return _motercylces[_current++]; } }


Aboveokardaky iteratorlaryň hemmesi kesgitlenenden soň, iteratorlary döredýän adaty agregator obýekt interfeýsini kesgitläň.


 public interface IVehicleAggregate{ IVehicleIterator CreateIterator(); }


Ahyrynda ýokardaky agregator interfeýsini ýerine ýetirýän synplary ýazyň. Ulanyş ýagdaýyna görä, Awtoulag we motosikl synplarynyň ikisi hem agregator interfeýsini durmuşa geçirer.

Awtoulag cs

Agregator interfeýsiniň usuly, aşakda görkezilişi ýaly degişli iteratory yzyna gaýtaryp berýär.


 public class Car : IVehicleAggregate { private List<string> _cars; public Car() { _cars = new List<string> { "Car 1", "Car 2", "Car 3" }; } public IVehicleIterator CreateIterator() { return new CarIterator(_cars); } }

Motosikl. cs

Agregator interfeýsiniň usuly, aşakda görkezilişi ýaly degişli iteratory yzyna gaýtaryp berýär.


 public class Motercycle : IVehicleAggregate { private string[] _motercycles; public Motercycle() { _motercycles = new[] { "Bike 1", "Bike 2", "Bike 3" }; } public IVehicleIterator CreateIterator() { return new MotercycleIterator(_motercycles); } }

Hereketde Iterator nusgasy

“PrintVehicles” usullary! Iterator.isDone ýa-da ýygnamak elementini çykarýar. Haýsy kolleksiýa bilen iş salyşýandygymyza garamazdan, “First”, “IsDone” we “Next” ýaly usullary durmuşa geçiriň.


 static void Main(string[] args) { IVehicleAggregate car = new Vehicles.Car(); IVehicleAggregate motercycle = new Vehicles.Motercycle(); IVehicleIterator carIterator = car.CreateIterator(); IVehicleIterator motercycleIterator = motercycle.CreateIterator(); PrintVehicles(carIterator); PrintVehicles(motercycleIterator); } static void PrintVehicles(IVehicleIterator iterator) { iterator.First(); while (!iterator.IsDone()) { Console.WriteLine(iterator.Next()); } }

Çykyş

Esasy kolleksiýa görnüşini bilemzok, ýöne henizem Iterator Dizaýn nusgasy arkaly gaýtalanýar. Öňe gidip ylgasaňyz, aşakdaky çykyşy görkezýär.

Dizaýn nusgasy - araçy

Gang of Four-yň pikiriçe, araçy nagşy obýektiň biri-biri bilen täsirini öz içine alýar.


Araçy dizaýn nagşy, obýektleriň özara täsirini jemläp, birleşdirilen programmalary dizaýn etmäge kömek edýär.

Kase ulanyň

Gatnaşanlaryň hasaba alynýan söhbetdeşlik otagynyň we netijeli aragatnaşyk saklamagyň mysalyna seredeliň.


Araçy dizaýn nusgasyny ulanyp, aşakdaky söhbetdeşlik söhbetdeşligini durmuşa geçirmeli.


 David to Scott: 'Hey' Scott to David: 'I am good how about you.' Jennifer to Ashley: 'Hey ashley... david is back in the group' Jennifer to David: 'Where have you been?' Ashley to David: 'How come you aren't active here anymore?'

Okuwyň maksatlary

  • Araçy dizaýn nusgasyny ulanyp nädip kodlamaly?

Başlamak

Esasy ädim, söhbetdeşlik otagynda ulanyljak ulanyjy atlarynyň sanawyny döretmekdir. Munuň üçin köpçülikleýin san aşakda görkezilýär.


 public enum Username{ Ashley, David, Jennifer, Scott }


Indi, ilkinji nobatda, söhbetdeşlik otagynyň abstrakt gatlagyny durmuşa geçiriň.


 public abstract class AChatroom { public abstract void Register(User user); public abstract void Post(string fromUser, string toUser, string msg); }


Abstrakt usullary kesgitleýän synp. Usullar sözlükde bar bolsa, usullar tassyklanýar. Mysal üçin, ulanyjy eýýäm bar bolsa ýa-da ýok bolsa, hasaba alyş usuly tassyklanýar. Eger ýok bolsa, ulanyjyny diňe söhbetdeşlik otagynda hasaba alyň.


 public class Chatroom : AChatroom { private Dictionary<string, User> _users = new Dictionary<string, User>(); public override void Post(string fromUser, string toUser, string msg) { User participant = _users[toUser]; if (participant != null) { participant.DM(fromUser, msg); } } public override void Register(User user) { if (!_users.ContainsValue(user)) { _users[user.Name] = user; } user.Chatroom = this; } }


Ahyrynda, söhbet otagynda bir ulanyja habar ibermek ýa-da başga bir ulanyjydan DM almak ýaly ulanyjynyň ýerine ýetirip biljek hereketlerini durmuşa geçireliň.


 public class User { private Chatroom _chatroom; private string _name; public User(string name) => this._name = name; public string Name => _name; public Chatroom Chatroom { set { _chatroom = value; } get => _chatroom; } public void Post(string to, string message) => _chatroom.Post(_name, to, message); public virtual void DM(string from, string message) => Console.WriteLine("{0} to {1}: '{2}'", from, Name, message); }

Esasy usuldan araçy nagyşyny nädip ulanmaly

 static void Main(string[] args) { Chatroom chatroom = new Chatroom(); User Jennifer = new UserPersona(Username.Jennifer.ToString()); User Ashley = new UserPersona(Username.Ashley.ToString()); User David = new UserPersona(Username.David.ToString()); User Scott = new UserPersona(Username.Scott.ToString()); chatroom.Register(Jennifer); chatroom.Register(Ashley); chatroom.Register(David); chatroom.Register(Scott); David.Post(Username.Scott.ToString(), "Hey"); Scott.Post(Username.David.ToString(), "I am good how about you."); Jennifer.Post(Username.Ashley.ToString(), "Hey ashley... david is back in the group"); Jennifer.Post(Username.David.ToString(), "Where have you been?"); Ashley.Post(Username.David.ToString(), "How come you aren't active here anymore?"); Console.ReadKey(); }


  1. Söhbet synp obýekti döredildi.
  2. Dört dürli ulanyjy özboluşly atlar bilen döredilýär.
  3. Olaryň hersini söhbetdeşlik otagynda hasaba alyň.
  4. Ulanyjylar indi biri-birine habar iberip bilerler.

Programmanyň ýerine ýetirilişi diňe ulanyjy synpynyň Post usulyny suratlandyrýar.


Çykyş: aboveokardaky programmanyň ýerine ýetirilişiniň söhbetdeşlik taryhy


 David to Scott: 'Hey' Scott to David: 'I am good how about you.' Jennifer to Ashley: 'Hey ashley... david is back in the group' Jennifer to David: 'Where have you been?' Ashley to David: 'How come you aren't active here anymore?'

Dizaýn nusgasy - Synçy

Gang of Four-yň pikiriçe, synçy nagşy b / w iki ýa-da has köp jisime baglylygy kesgitleýär. Şeýlelik bilen, bir obýektiň ýagdaýy üýtgese, oňa bagly bolanlaryň hemmesine habar berilýär.


Başgaça aýdylanda, bir obýektiň üýtgemegi başga bir obýektde habarnamany başlaýar.

Kase ulanyň

Geliň, “ x ” yzarlaýjylarynyň sany bolan Instagram meşhur täsir edijisinden mysal alalyň. Şeýlelik bilen, meşhur bir ýazgy goşan pursatynda, yzarlaýanlaryň hemmesine habar berilýär.


“Observer Design Pattern” -i ulanyp, ýokarda agzalan ulanylyş ýagdaýyny durmuşa geçireliň.

Okuwyň maksatlary

  • Synçynyň dizaýn nusgasyny ulanyp nädip kodlamaly?

Başlamak

Ulanylyş ýagdaýyna görä, ilkinjisi meşhurlaryň ýerine ýetirip biljek hereketlerini öz içine alýan interfeýsi durmuşa geçiriň. “ Subýekt ” hökmünde bellidir.


 public interface ICelebrityInstagram{ string FullName { get; } string Post { get; set; } void Notify(string post); void AddFollower(IFollower fan); void RemoveFollower(IFollower fan); }

Mowzukda aşakdaky agza funksiýalary bar.

  • Duýduryş: thehli yzarlaýanlara habar bermek.

  • AddFollower: Meşhurlaryň sanawyna täze yzarlaýjy goşuň.

  • RemoveFollower: Meşhurlaryň sanawyndan bir yzarlaýjyny aýyryň.


Indi, habarnamada “Täzelenme” agza funksiýasyny öz içine alýan synçy “IFollower” interfeýsini durmuşa geçiriň.


 public interface IFollower{ void Update(ICelebrityInstagram celebrityInstagram); }


Netijede, “ Subýekt ” we “ Synçy ” üçin “Beton ýerine ýetiriş” amala aşyrmagyň wagty geldi.

BetonObserver “Follower.cs”

Meşhurlaryň adyny we konsola iberýän täzelenme agza funksiýasynyň ýerine ýetirilmegini üpjün edýär.


 public class Follower : IFollower { public void Update(ICelebrityInstagram celebrityInstagram) { Console.WriteLine($"Follower notified. Post of {celebrityInstagram.FullName}: " + $"{celebrityInstagram.Post}"); } }

Beton meselesi “Suhpinder. cs ”

 public class Sukhpinder : ICelebrityInstagram { private readonly List<IFollower> _posts = new List<IFollower>(); private string _post; public string FullName => "Sukhpinder Singh"; public string Post { get { return _post; } set { Notify(value); } } public void AddFollower(IFollower follower) { _posts.Add(follower); } public void Notify(string post) { _post = post; foreach (var item in _posts) { item.Update(this); } } public void RemoveFollower(IFollower follower) { _posts.Remove(follower); } }

Synçy nusgasyny nädip gözlemeli?

Aşakdaky ulanylyş mysaly, aşakdaky jümle haçan ýerine ýetirilendigini görkezýär.Post = "Dizaýn nagyşlaryny halaýaryn."; Täzelenme usuly her bir yzarlaýjy üçin döredilýär, ýagny her bir yzarlaýjy obýekt “Sukhpinder” -den täze ýazgy barada habar berilýär.


 static void Main(string[] args) { var sukhpinder = new Sukhpinder(); var firstFan = new Follower(); var secondFan = new Follower(); sukhpinder.AddFollower(firstFan); sukhpinder.AddFollower(secondFan); sukhpinder.Post = "I love design patterns."; Console.Read(); }

Çykyş

Awans emläk nusgasy C # 8.0

Makalada nagyşlaryň gabat gelmegi, esasy ulgamyň bölegi bolmadyk görnüşlerde şol maglumatlary ulanmagyň we gaýtadan işlemegiň täsirli usulyny üpjün edýär.


Başlalyň

Toll Kalkulýatoryndan mysal alalyň we nagyş gabat gelmeginiň munuň üçin algoritm ýazmaga nähili kömek edýändigini göreliň.

Makalanyň dowamynda ulanylýan edara synpy

 public class Car { public int PassengerCount { get; set; } } public class DeliveryTruck { public int Weight { get; set; } } public class Taxi { public int Fare { get; set; } } public class Bus { public int Capacity { get; set; } public int RidersCount { get; set; } }


Mysal 1: Töleg tölegini aşakdaky şertlere görä hasaplaň:


  • Ulag Awtoulag bolsa => 100 Rs
  • Ulag DeliveryTruck => 200 Rs
  • Ulag Awtobus bolsa => 150 Rs
  • Ulag taksi bolsa => 120 Rs

Täze kommutasiýa sintaksis bilen nagyş gabatlaşma programmasy

Awtoulagyň görnüşi “Car 100” bilen gabat gelýän bolsa we ş.m. Null & {object obýektiň görnüşi üçin adaty ýagdaýlara üns beriň.

Şeýle hem, “_” deslapky ssenariýany programmirlemek üçin ulanylyp bilner. Täze wyklýuçatel sintaksisine serediň.


Kodlaşdyrmagyň has arassa we täsirli usuly, şeýle hem wyklýuçatel sintaksisiniň içinde bir harply üýtgeýän atlary ulanmagy maslahat berýär.


 public static int TollFare(Object vehicleType) => vehicleType switch { Car c => 100, DeliveryTruck d => 200, Bus b => 150, Taxi t => 120, null => 0, { } => 0 };

Aboveokardaky programma

Konsol amaly nukdaýnazaryndan mysallary synap görüň. Aşakdaky kod, esasy usuldan ýokardaky nagyş gabat gelýän funksiýany nädip çagyrmalydygyny görkezýär.


 var car = new Car(); var taxi = new Taxi(); var bus = new Bus(); var truck = new DeliveryTruck(); Console.WriteLine($"The toll for a car is {TollFare(car)}"); Console.WriteLine($"The toll for a taxi is {TollFare(taxi)}"); Console.WriteLine($"The toll for a bus is {TollFare(bus)}"); Console.WriteLine($"The toll for a truck is {TollFare(truck)}");

Konsol çykyşy

 The toll for a car is 100 The toll for a taxi is 120 The toll for a bus is 150 The toll for a truck is 200


Mysal 2: Awtoulagyň görnüşine baglylykda ýaşaýyş bahasyny goşuň


  • “” OK ”ýolagçylary bolan awtoulaglar we taksiler goşmaça 10 000 dollar töleýärler.
  • Iki ýolagçyly awtoulaglar we taksiler 10 dollar arzanladyş alýarlar.
  • Üç ýa-da has köp ýolagçyly awtoulaglar we taksiler 20 dollar arzanladyş alýarlar.
  • Passengersolagçylaryň 50% -inden az awtobuslar goşmaça 30 000 töleýärler.
  • Passengersolagçylaryň 90% -den gowragy bolan awtobuslarda 40 dollar arzanladyş bolýar.
  • 5000 funtdan ýokary awtoulaglara goşmaça 100 dollar tölenýär.
  • 3000 funtdan ýeňil awtoulaglar, 20 dollar arzanladyş berilýär.

Nusga gabat geliş kommutatory

Singleeke we köp emläk synplary bilen nagyş gabat gelýän sintaksisine serediň. Baglanyşyk

Nusga laýyklygy - Awtoulag kärhanasy

 Car { PassengerCount: 0 } => 100 + 10, Car { PassengerCount: 1 } => 100, Car { PassengerCount: 2 } => 100 - 10, Car c => 100 - 20,

Nusga laýyklygy - Taksi kärhanasy

 Taxi {Fare:0 }=>100+10, Taxi { Fare: 1 } => 100, Taxi { Fare: 2 } => 100 - 10, Taxi t => 100 - 20,

Nusga laýyklygy - Awtobus kärhanasy

 Bus b when ((double)b.RidersCount / (double)b.Capacity) < 0.50 => 150 + 30, Bus b when ((double)b.RidersCount / (double)b.Capacity) > 0.90 => 150 - 40, Bus b => 150,

Nusga laýyklygy - eltip bermek üçin ýük awtoulag kärhanasy

 DeliveryTruck t when (t.Weight > 5000) => 200 + 100, DeliveryTruck t when (t.Weight < 3000) => 200 - 20, DeliveryTruck t => 200,

Entitieshli guramalary birleşdirmek

Aşakdaky mysal nagyş gabat gelmegiň artykmaçlyklaryny görkezýär: nagyş şahalary tertipde düzülýär. Düzediji elýeterli kod hakda hem duýduryş berýär.


 public static int OccupancyTypeTollFare(Object vehicleType) => vehicleType switch { Car { PassengerCount: 0 } => 100 + 10, Car { PassengerCount: 1 } => 100, Car { PassengerCount: 2 } => 100 - 10, Car c => 100 - 20, Taxi { Fare: 0 } => 100 + 10, Taxi { Fare: 1 } => 100, Taxi { Fare: 2 } => 100 - 10, Taxi t => 100 - 20, Bus b when ((double)b.RidersCount / (double)b.Capacity) < 0.50 => 150 + 30, Bus b when ((double)b.RidersCount / (double)b.Capacity) > 0.90 => 150 - 40, Bus b => 150, DeliveryTruck t when (t.Weight > 5000) => 200 + 100, DeliveryTruck t when (t.Weight < 3000) => 200 - 20, DeliveryTruck t => 200, null => 0, { } => 0, };

Aboveokardaky programma

Konsol amaly nukdaýnazaryndan mysallary synap görüň. Aşakdaky kod, esasy usuldan ýokardaky nagyş gabat gelýän funksiýany nädip çagyrmalydygyny görkezýär.


 var car1 = new Car{ PassengerCount=2}; var taxi1 = new Taxi { Fare = 0 }; var bus1 = new Bus { Capacity = 100, RidersCount = 30 }; var truck1 = new DeliveryTruck { Weight = 30000 }; Console.WriteLine($"The toll for a car is {OccupancyTypeTollFare(car1)}"); Console.WriteLine($"The toll for a taxi is {OccupancyTypeTollFare(taxi1)}"); Console.WriteLine($"The toll for a bus is {OccupancyTypeTollFare(bus1)}"); Console.WriteLine($"The toll for a truck is {OccupancyTypeTollFare(truck1)}");

Konsol çykyşy

 The toll for a car is 90 The toll for a taxi is 110 The toll for a bus is 180 The toll for a truck is 300


"Nusga gabat gelmegi kody has okalýar we sapaklaryňyza kod goşup bilmeýän wagtyňyz obýekte gönükdirilen usullara alternatiwa hödürleýär."

Dizaýn nusgasy - Singleton

Dört topar - Singleton dizaýn nagşy, belli bir synpyň diňe bir mysal / obýekt we global giriş nokadynyň bolmagyny üpjün edýär.


Okuwyň maksatlary

  • Singeke-täk dizaýn nagşyny ulanyp nädip kodlamaly?

Başlamak

Singleton sapaklary, belli bir synpyň birden köp obýektiniň dessine ýok edilmegi üçin ulanylýar.


 public class SingletonExample { private string Name { get; set; } = "Hello from singleton"; private static SingletonExample _instance; public static SingletonExample Instance { get { if (_instance == null) { _instance = new SingletonExample(); } return _instance; } } public SingletonExample() { } public string GetName() => Name; }

Bölünmek

  1. Iterasiýa 1 _instance == null diňe mysallaryň dörediljekdigini aňladýar.
  2. Iteration 2, edil häzirki ýaly _intance! = Null Şonuň üçin öň döredilen mysallar yzyna gaýtarylar.

Konsol programmasyny ulanyp synag

Singleton synpyna iki gezek jaň edeliň we gaýdyp gelen mysaly iki dürli üýtgeýjä belläliň. Netijede, “Object.Equals” funksiýasyny ulanyp, iki obýektiň deňdigini barlaň.


 static void Main(string[] args) { var response = SingletonExample.Instance; Console.WriteLine(response); var response1 = SingletonExample.Instance; Console.WriteLine(response1); Console.WriteLine(Object.Equals(response1, response)); }
  • Eger hakykata gaýdyp gelse, her gezek ýekeje mysal öndürilýär.
  • Falsealňyş gaýdyp gelse, synpyň ýeke-täk nagyşa eýermeýändigini aňladýar.

Çykyş

Konsol çykyşy hakyky; gutlaýan “Singleton” nusgasyny üstünlikli durmuşa geçirdiňiz.



Tekstiň howpsuzlygy

Aboveokardaky synp singleton synpy diýlip atlandyrylýar, ýöne häzirki wagtda sapak üçin howpsuz däl. Köp sapakly gurşawda (_instance == null) jümle bir wagtyň özünde iki sapak urup biler we biz ýeke-täk synpyň birnäçe mysaly bolar.


Has ygtybarly sapak üçin bir ýol gulp mehanizmini ulanmak, beýleki ýol bolsa has arassa we has täsirli çemeleşmek üçin diňe okalýan mysal döretmekdir.

 public class ThreadSafeSingleton { private static readonly ThreadSafeSingleton _instance = new ThreadSafeSingleton(); public static ThreadSafeSingleton Instance { get { return _instance; } } public ThreadSafeSingleton() { } }

Github nusgasy

https://github.com/ssukhpinder/DesignPatterns

Okanyňyz üçin sag boluň!

Hemaýatkärlik, şuňa meňzeş täze taslamalary dowam etdirmäge we gurmaga kömek edýär.


Pay “Töleg”, “Bellik” ýa-da başga bir taslamamdan peýdalanýan bolsaňyz, az mukdarda goşant KÖP KÖP diýmekdir. Özbaşdak, açyk çeşme tölegleri tölemeýär. Siziň kömegiňiz bilen işimi dowam etdirip bilerin diýip umyt edýärin we hakyky işe girmek hökman däl 😛.

C # Programmirlemek

C # jemgyýetiniň bir bölegi bolanyňyz üçin sag boluň!

Buymeacoffee