Programma arhitekturasyny ussatlyk bilen programma arhitekturasynyň syrlaryny açyň: 11 sany esasy dizaýn nusgasy düşündirildi .
2. Dizaýn nusgasy - Adapter
3. Dizaýn nusgasy - Gurluşykçy
4. Jogapkärçilik nusgasyny nädip ulanmaly
5. Dizaýn nusgasy - bezeg
6. Dizaýn nusgasy - Zawod usuly
7. Dizaýn nusgasy - Iterator
8. Dizaýn nusgasy - araçy
9. Dizaýn nusgasy - Synçy
10. Awans emläk nusgasy C # 8.0
11. Dizaýn nusgasy - Singleton
Gang of Four-yň pikiriçe, abstrakt zawod nagyşlary zawod döretmek üçin zawod hökmünde kabul edilip bilner.
Abstrakt zawod nagşy, diňe uzaldylan zawod usulydyr; abstrakt zawod dizaýnyna düşünmezden ozal zawod usulyndan geçmek maslahat berilýär.
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; } }
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
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
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.
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.
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.
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.
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; } }
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
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ň.
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; } }
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; } }
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.
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ň.
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;} }
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);
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.
Gang of Four-yň pikiriçe, nagyş synp obýektine dinamiki taýdan goşmaça jogapkärçilik goşýar.
On million dollarlyk awtoulag satyn almagyň mysalyna seredeliň; kompaniýa aşakdaky goşmaça aýratynlyklary hödürleýär.
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ň.
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.
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"; }
Usullary ýokaşdyryň
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"; }
“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);
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()); }
Gutlaýarys .. !! Bezeg nagşyny ulanyp, ulanylyş gabyny üstünlikli ýerine ýetirdiňiz.
Dört toparyň pikiriçe, zawod usuly kiçi klasa haýsy synp obýektiniň döredilmelidigini kesgitlemäge mümkinçilik berýär.
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.
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.
Saving account balance: 10000 Rs Current account balance: 20000 Rs
Gang of Four-yň pikiriçe, iterator nagşy, agregatoryň ýerine ýetirilişini bilmezden almak prosesini üpjün edýär.
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.
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ň.
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.
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.
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); } }
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); } }
“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()); } }
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.
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.
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?'
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); }
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(); }
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?'
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.
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ň.
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); }
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.
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}"); } }
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); } }
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(); }
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.
Toll Kalkulýatoryndan mysal alalyň we nagyş gabat gelmeginiň munuň üçin algoritm ýazmaga nähili kömek edýändigini göreliň.
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
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 };
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)}");
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.
Singleeke we köp emläk synplary bilen nagyş gabat gelýän sintaksisine serediň. Baglanyşyk
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,
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, };
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)}");
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."
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.
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; }
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)); }
Konsol çykyşy hakyky; gutlaýan “Singleton” nusgasyny üstünlikli durmuşa geçirdiňiz.
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() { } }
https://github.com/ssukhpinder/DesignPatterns
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 # jemgyýetiniň bir bölegi bolanyňyz üçin sag boluň!