JavaRush /Java Blog /Random-TK /Java-da dizaýn nagyşlary
Viacheslav
Dereje

Java-da dizaýn nagyşlary

Toparda çap edildi
Nagyşlar ýa-da dizaýn nagyşlary, döredijiniň işiniň köplenç ünsden düşürilýän bölegi bolup, kody saklamak we täze talaplara uýgunlaşdyrmak kynlaşdyrýar. JDK-da onuň nämedigine we ulanylyşyna göz aýlamagy maslahat berýärin. Elbetde, bir görnüşdäki esasy nagyşlar uzak wagtlap töweregimizde. Geliň, bu synda göreliň.
Java-da dizaýn nagyşlary - 1
Mazmuny:

Şablonlar

Boş işlerde iň köp ýaýran talaplaryň biri “Nusgalary bilmek”. Ilki bilen, “Dizaýn nusgasy näme?” Diýen ýönekeý soraga jogap bermeli. Nusga iňlis dilinden “şablon” hökmünde terjime edilýär. .Agny, bu belli bir nagyş, oňa görä bir zatlar edýäris. Programmirlemekde-de edil şonuň ýaly. Umumy meseleleri çözmekde iň oňat tejribe we çemeleşmeler bar. Her bir programmist arhitektor. Diňe birnäçe synp ýa-da hatda bir synp döredeniňizde-de, üýtgeýän talaplar boýunça koduň näçe wagtlap ýaşap biljekdigine, beýlekiler tarapyndan ulanmagyň nähili amatlydygyna baglydyr. Ine, şablonlary bilmek kömek eder, sebäbi ... Bu, kod ýazmazdan nädip ýazmalydygyny çalt düşünmäge mümkinçilik berer. Bilşiňiz ýaly, programmistler ýalta adamlar we bir zady birnäçe gezek gaýtalamazdan derrew gowy ýazmak has aňsat) Nagyşlar hem algoritmlere meňzeýär. Emma olaryň tapawudy bar. Algoritm zerur hereketleri beýan edýän anyk ädimlerden durýar. Nagyşlar diňe çemeleşmäni suratlandyrýar, ýöne durmuşa geçiriş ädimlerini suratlandyrmaýar. Nagyşlar başga, sebäbi ... dürli meseleleri çözmeli. Adatça aşakdaky kategoriýalar tapawutlanýar:
  • Generative

    Bu nagyşlar obýekt döretmegi çeýe etmek meselesini çözýär

  • Gurluş

    Bu nagyşlar obýektleriň arasynda baglanyşyk gurmak meselesini çözýär

  • Özüňi alyp baryş

    Bu nagyşlar obýektleriň arasynda täsirli täsirleşmek meselesini çözýär

Mysallary gözden geçirmek üçin onlaýn kod düzüjisi repl.it ulanmagy maslahat berýärin.
Java-da dizaýn nagyşlary - 2

Döredijilik nagyşlary

Obýektleriň ýaşaýyş sikliniň başyndan - obýektleriň döredilmegi bilen başlalyň. Gelip çykyş şablonlary obýektleri has amatly döretmäge we bu amalda çeýeligi üpjün etmäge kömek edýär. Iň meşhurlaryndan biri " Gurluşykçy ". Bu nagyş, ädimme-ädim çylşyrymly zatlary döretmäge mümkinçilik berýär. Java-da iň meşhur mysal StringBuilder:
class Main {
  public static void main(String[] args) {
    StringBuilder builder = new StringBuilder();
    builder.append("Hello");
    builder.append(',');
    builder.append("World!");
    System.out.println(builder.toString());
  }
}
Obýekt döretmäge başga bir belli çemeleşme, döredijiligi aýratyn usula geçirmekdir. Bu usul, bolşy ýaly, obýekt zawodyna öwrülýär. Şonuň üçin nagyş " Zawod usuly" diýilýär. Mysal üçin Java-da onuň täsirini synpda görmek bolýar java.util.Calendar. Synpyň özi Calendarabstrakt we ony döretmek üçin usul ulanylýar getInstance:
import java.util.*;
class Main {
  public static void main(String[] args) {
    Calendar calendar = Calendar.getInstance();
    System.out.println(calendar.getTime());
    System.out.println(calendar.getClass().getCanonicalName());
  }
}
Bu köplenç obýekt döretmegiň logikasynyň çylşyrymly bolmagy sebäpli bolýar. Mysal üçin, ýokardaky ýagdaýda esasy synpa girýäris Calendarwe bir synp döredilýär GregorianCalendar. Konstruktora seretsek, şertlere baglylykda dürli amallaryň döredilendigini görüp bileris Calendar. Emma käwagt zawodyň bir usuly ýeterlik däl. Käwagt biri-birine gabat gelmegi üçin dürli zatlar döretmeli. Başga bir şablon bize kömek eder - “ Abstrakt zawod ”. Soň bolsa bir ýerde dürli zawodlar döretmeli. Şol bir wagtyň özünde, artykmaçlygy, durmuşa geçiriş jikme-jiklikleriniň biziň üçin möhüm däldigidir. haýsy zawod alýandygymyz möhüm däl. Esasy zat, dogry durmuşa geçirmegi döredýär. Ajaýyp mysal:
Java-da dizaýn nagyşlary - 3
.Agny, daşky gurşawa (operasiýa ulgamy) baglylykda, gabat gelýän elementleri döredýän belli bir zawod alarys. Başga biriniň üsti bilen döretmek çemeleşmesine alternatiwa hökmünde " Prototip " nagyşyny ulanyp bileris. Onuň manysy ýönekeý - täze obýektler eýýäm bar bolan zatlaryň şekilinde we meňzeşliginde döredilýär. prototipine laýyklykda. Java-da hemmeler bu nagyşa duş geldiler - bu interfeýsiň ulanylyşy java.lang.Cloneable:
class Main {
  public static void main(String[] args) {
    class CloneObject implements Cloneable {
      @Override
      protected Object clone() throws CloneNotSupportedException {
        return new CloneObject();
      }
    }
    CloneObject obj = new CloneObject();
    try {
      CloneObject pattern = (CloneObject) obj.clone();
    } catch (CloneNotSupportedException e) {
      //Do something
    }
  }
}
Görşüňiz ýaly, jaň edeniň nädip bolandygyny bilenok clone. .Agny, prototip esasynda bir obýekt döretmek obýektiň özi. Bu peýdaly, sebäbi ulanyjyny şablon obýektiniň ýerine ýetirilmegi bilen baglanyşdyrmaýar. Bu sanawdaky iň soňkusy “Singleton” nagşy. Maksady ýönekeý - tutuş programma üçin obýektiň ýekeje mysalyny bermek. Bu nagyş gyzykly, sebäbi köplenç köp okamak meselesini görkezýär. Has içgin gözlemek üçin şu makalalara göz aýlaň:
Java-da dizaýn nagyşlary - 4

Gurluş nagyşlary

Obýektleriň döredilmegi bilen has aýdyňlaşdy. Indi gurluş nagyşlaryna seretmegiň wagty geldi. Olaryň maksady, aňsat goldaýan synp iýerarhiýalaryny we gatnaşyklaryny gurmak. Ilkinji we belli nagyşlaryň biri “ Deputat ” (Proksi). Proksi hakyky obýekt bilen birmeňzeş interfeýsi bar, şonuň üçin müşderiniň proksi ýa-da göni işlemegi bilen tapawudy ýok. Iň ýönekeý mysal java.lang.reflect.Proxy :
import java.util.*;
import java.lang.reflect.*;
class Main {
  public static void main(String[] arguments) {
    final Map<String, String> original = new HashMap<>();
    InvocationHandler proxy = (obj, method, args) -> {
      System.out.println("Invoked: " + method.getName());
      return method.invoke(original, args);
    };
    Map<String, String> proxyInstance = (Map) Proxy.newProxyInstance(
        original.getClass().getClassLoader(),
        original.getClass().getInterfaces(),
        proxy);
    proxyInstance.put("key", "value");
    System.out.println(proxyInstance.get("key"));
  }
}
Görşüňiz ýaly, mysalymyzda asyl nusgasy bar - bu HashMapinterfeýsi durmuşa geçirýän zat Map. Mundan soň , jaň wagtynda öz logikamyzy goşup, müşderi HashMapbölegi üçin asyl nusgasyny çalyşýan proksi döredýäris . Görşümiz ýaly, nagyşdaky täsir interfeýsler arkaly ýüze çykýar. Sometimesöne käwagt onuň ornuny tutmak ýeterlik däl. Soň bolsa " Bezegçi " nagşy ulanylyp bilner. Bezegçä örtük ýa-da örtük diýilýär. Proksi we bezegçi gaty meňzeýär, ýöne mysala seretseňiz, tapawudyny görersiňiz: putget
import java.util.*;
class Main {
  public static void main(String[] arguments) {
    List<String> list = new ArrayList<>();
    List<String> decorated = Collections.checkedList(list, String.class);
    decorated.add("2");
    list.add("3");
    System.out.println(decorated);
  }
}
Proksi-den tapawutlylykda, bezegçi giriş hökmünde geçýän bir zady gurşap alýar. Proksi proksi edilmeli zatlary hem kabul edip biler, şeýle hem proksi obýektiň ömrüni dolandyryp biler (mysal üçin, proksi obýekti dörediň). Anotherene bir gyzykly nagyş bar - “ Adapter ”. Bezegçä meňzeýär - bezegçi bir obýekti giriş hökmünde alýar we bu obýektiň üstünden örtük gaýtaryp berýär. Tapawut, maksat funksiýany üýtgetmek däl-de, bir interfeýsi beýlekisine uýgunlaşdyrmakdyr. Java-da munuň aýdyň mysaly bar:
import java.util.*;
class Main {
  public static void main(String[] arguments) {
    String[] array = {"One", "Two", "Three"};
    List<String> strings = Arrays.asList(array);
    strings.set(0, "1");
    System.out.println(Arrays.toString(array));
  }
}
Girişde bir massiw bar. Ondan soň massiw interfeýsine getirýän adapter döredýäris List. Munuň bilen işleşenimizde, aslynda bir massiw bilen işleýäris. Şonuň üçin elementleri goşmak işlemez, sebäbi ... Asyl massiwi üýtgedip bolmaz. Bu ýagdaýda alarys UnsupportedOperationException. Synp gurluşyny ösdürmäge indiki gyzykly çemeleşme Kompozit nagyşdyr . Bir interfeýsi ulanýan elementleriň belli bir toplumynyň agaç ýaly iýerarhiýada ýerleşdirilendigi gyzykly. Ene elementine usuly çagyrmak bilen, ähli zerur çaga elementleri boýunça bu usula jaň edýäris. Bu nagşyň esasy mysaly UI (java.awt bolsun ýa-da JSF bolsun):
import java.awt.*;
class Main {
  public static void main(String[] arguments) {
    Container container = new Container();
    Component component = new java.awt.Component(){};
    System.out.println(component.getComponentOrientation().isLeftToRight());
    container.add(component);
    container.applyComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);
    System.out.println(component.getComponentOrientation().isLeftToRight());
  }
}
Görşümiz ýaly, konteýnerde bir komponent goşduk. Soň bolsa konteýnerden komponentleriň täze ugruny ulanmagyny haýyş etdik. Konteýner, haýsy böleklerden ybaratdygyny bilip, bu buýrugyň ýerine ýetirilişini ähli çaga komponentlerine tabşyrdy. Anotherene bir gyzykly nagyş, “ Köpri ” nagşy. Iki dürli synp iýerarhiýasynyň arasyndaky baglanyşygy ýa-da köprini beýan edýändigi üçin oňa şeýle diýilýär. Bu iýerarhiýalaryň biri abstraksiýa, beýlekisi durmuşa geçirmek hasaplanýar. Abstraksiýanyň özi hereketleri ýerine ýetirmeýänligi sebäpli bu ýerine ýetirilişi ýerine ýetirýär. Bu nagyş köplenç "gözegçilik" synplary we birnäçe "platforma" synplary (mysal üçin, Windows, Linux we ş.m.) bolanda ulanylýar. Bu çemeleşme bilen bu iýerarhiýalardan biri (abstraksiýa) başga bir iýerarhiýanyň (durmuşa geçirmegiň) obýektlerine salgylanma alar we esasy işi olara tabşyrar. Implementationshli ýerine ýetirişler umumy interfeýsi berjaý etjekdigi sebäpli, abstraksiýanyň içinde çalşylyp bilner. Java-da munuň aýdyň mysaly java.awt:
Java-da dizaýn nagyşlary - 5
Has giňişleýin maglumat üçin " Java AWT-de nagyşlar " makalasyna serediň . Gurluş nagyşlarynyň arasynda “ Fasad ” nagşyny hem belläsim gelýär . Onuň manysy, amatly we gysga interfeýsiň aňyrsynda bu API-iň arkasyndaky kitaphanalary / çarçuwalary ulanmagyň çylşyrymlylygyny gizlemekdir. Mysal üçin, JPA-dan JSF ýa-da EntityManager ulanyp bilersiňiz. " Uçuş " atly başga bir nagyş hem bar . Onuň düýp manysy, dürli obýektleriň birmeňzeş ýagdaýy bar bolsa, umumylaşdyrylyp, her bir obýektde däl-de, bir ýerde saklanyp bilner. Soň bolsa, her bir obýekt saklamak üçin ýat çykdajylaryny azaldýan umumy bir bölüme salgylanyp biler. Bu nagyş köplenç deslapky keş ýa-da obýektleriň howuzuny saklamagy öz içine alýar. Gyzykly tarapy, bu nagşy ilkibaşdan bilýäris:
Java-da dizaýn nagyşlary - 6
Şol bir meňzeşlik boýunça bu ýere setirler basseýni hem girizilip bilner. Bu mowzukdaky makalany okap bilersiňiz: " Uçuş dizaýnynyň nusgasy ".
Java-da dizaýn nagyşlary - 7

Özüňi alyp baryş usullary

Şeýlelik bilen, obýektleriň nädip döredilip bilinjekdigini we synplaryň arasyndaky baglanyşyklary nädip tertipläp boljakdygyny kesgitledik. Galan iň gyzykly zat, obýektleriň özüni alyp barşyny üýtgetmekde çeýeligi üpjün etmekdir. Özüňi alyp barşyň nagyşlary bu meselede bize kömek eder. Mostygy-ýygydan agzalýan nagyşlaryň biri " Strategiýa " nagşy. “ Ilki bilen başyň. Dizaýn nagyşlary ” kitabynda nagyşlary öwrenmek şu ýerden başlaýar. “Strategiýa” nagşyny ulanyp, hereketi nädip ýerine ýetirjekdigimizi bir obýektiň içinde saklap bileris. içindäki obýekt kod ýerine ýetirilende üýtgedilip bilinjek strategiýany saklaýar. Deňeşdiriji ulananymyzda köplenç ulanýan görnüşimiz:
import java.util.*;
class Main {
  public static void main(String[] args) {
    List<String> data = Arrays.asList("Moscow", "Paris", "NYC");
    Comparator<String> comparator = Comparator.comparingInt(String::length);
    Set dataSet = new TreeSet(comparator);
    dataSet.addAll(data);
    System.out.println("Dataset : " + dataSet);
  }
}
Biziň öňümizde - TreeSet. TreeSetElementleriň tertibini saklamak häsiýetine eýe , ýagny tertipleşdirýär (SortedSet bolany üçin). Bu özüňi alyp barşyň, JavaDoc-da görýän adaty strategiýamyz bar: "tebigy tertipde" tertiplemek (setirler üçin bu leksikografiki tertip). Bu parametrsiz konstruktor ulansaňyz bolýar. Emma strategiýany üýtgetmek islesek, geçip bileris Comparator. Bu mysalda toplumymyzy döredip bileris new TreeSet(comparator), soň elementleri saklamagyň tertibi (saklaýyş strategiýasy) deňeşdirijide görkezilenine üýtgär. Gyzykly tarapy, " Döwlet " diýen ýaly nagyş bar . “Döwlet” nagşy, esasy obýektde bu obýektiň ýagdaýyna bagly käbir hereketlerimiz bar bolsa, döwletiň özüni obýekt hökmünde suratlandyryp we döwlet obýektini üýtgedip biljekdigimizi aýdýar. Esasy obýektden döwlete jaň ediň. Java diliniň esaslaryny öwrenmekden bize mälim bolan başga bir nagyş, “ Buýruk ” nagşydyr. Bu dizaýn nagşy, dürli buýruklaryň dürli synplar hökmünde görkezilip bilinjekdigini görkezýär. Bu nagyş, Strategiýa görnüşine gaty meňzeýär. Emma Strategiýa görnüşinde, belli bir hereketiň nähili ediljekdigini täzeden kesgitleýärdik (mysal üçin, tertiplemek TreeSet). “Buýruk” görnüşinde haýsy hereketiň ediljekdigini täzeden kesgitleýäris. Nusga buýrugy her gün sapaklary ulananymyzda ýanymyzda:
import java.util.*;
class Main {
  public static void main(String[] args) {
    Runnable command = () -> {
      System.out.println("Command action");
    };
    Thread th = new Thread(command);
    th.start();
  }
}
Görşüňiz ýaly, buýruk täze sapakda ýerine ýetiriljek hereketi ýa-da buýrugy kesgitleýär. “ Jogapkärçilik zynjyry” görnüşini hem göz öňünde tutmalydyrys . Bu nagyş hem gaty ýönekeý. Bu nagyş, bir zady gaýtadan işlemeli bolsa, zynjyrda işleýänleri ýygnap boljakdygyny aýdýar. Mysal üçin, bu nagyş köplenç web serwerlerinde ulanylýar. Girişde, serwerde ulanyjydan käbir haýyş bar. Bu haýyş soňra gaýtadan işlemek zynjyryndan geçýär. Bu işleýjiler zynjyryna süzgüçler girýär (mysal üçin, IP adresleriň gara sanawyndan gelen haýyşlary kabul etmeýär), tassyklamak işleýjileri (diňe ygtyýarly ulanyjylara rugsat beriň), haýyş sözbaşy işleýjisi, keş keşi we ş.m. Javaöne Java-da has ýönekeý we düşnükli mysal bar java.util.logging:
import java.util.logging.*;
class Main {
  public static void main(String[] args) {
    Logger logger = Logger.getLogger(Main.class.getName());
    ConsoleHandler consoleHandler = new ConsoleHandler(){
		@Override
            public void publish(LogRecord record) {
                System.out.println("LogRecord обработан");
            }
        };
    logger.addHandler(consoleHandler);
    logger.info("test");
  }
}
Görşüňiz ýaly, işleýänler sanaw ýazýanlaryň sanawyna goşulýar. logger.getHandlersAurnal ýazyjy gaýtadan işlemek üçin habar alanda, şeýle habarlaryň her biri şol ýazgy üçin işleýän zynjyrdan geçýär . Her gün görýän başga bir görnüşimiz “ Iterator ”. Onuň manysy obýektleriň ýygyndysyny (meselem, maglumat gurluşyny görkezýän synp. Mysal üçin List) we bu ýygyndydan geçmekdir.
import java.util.*;
class Main {
  public static void main(String[] args) {
    List<String> data = Arrays.asList("Moscow", "Paris", "NYC");
    Iterator<String> iterator = data.iterator();
    while (iterator.hasNext()) {
      System.out.println(iterator.next());
    }
  }
}
Görşüňiz ýaly, iterator kolleksiýanyň bir bölegi däl, kolleksiýany kesip geçýän aýratyn synp tarapyndan görkezilýär. Iteratoryň ulanyjysy, haýsy kolleksiýanyň gaýtalanýandygyny hem bilmez. haýsy kolleksiýa baryp görýär? “Visitor” nagşyny hem göz öňünde tutmalydyrys . Myhman nagşy iterator nagşyna gaty meňzeýär. Bu nagyş, obýektleriň gurluşyndan aýlanmaga we bu obýektlerde hereketleri ýerine ýetirmäge kömek edýär. Düşünjesi boýunça tapawutlanýar. Iterator kolleksiýany kesýär, şonuň üçin iteratory ulanýan müşderi kolleksiýanyň içindäki zatlara üns bermez, diňe yzygiderlilik elementleri möhümdir. Myhman, baryp görýän obýektlerimiziň belli bir iýerarhiýasynyň ýa-da gurluşynyň bardygyny aňladýar. Mysal üçin, aýratyn katalog işleýşini we aýratyn faýl işleýşini ulanyp bileris. Java-da bu nagyşyň daşynda ýerine ýetirilişi bar java.nio.file.FileVisitor:
import java.nio.file.*;
import java.nio.file.attribute.*;
import java.io.*;
class Main {
  public static void main(String[] args) {
    SimpleFileVisitor visitor = new SimpleFileVisitor() {
      @Override
      public FileVisitResult visitFile(Object file, BasicFileAttributes attrs) throws IOException {
        System.out.println("File:" + file.toString());
        return FileVisitResult.CONTINUE;
      }
    };
    Path pathSource = Paths.get(System.getProperty("java.io.tmpdir"));
    try {
      Files.walkFileTree(pathSource, visitor);
    } catch (AccessDeniedException e) {
      // skip
    } catch (IOException e) {
      // Do something
    }
  }
}
Käwagt käbir obýektleriň beýleki obýektleriň üýtgemegine reaksiýa bildirmegi zerur bolýar, soň bolsa "Synçy" nagşy bize kömek eder . Iň amatly usul, käbir obýektlere beýleki obýektlerde bolup geçýän wakalara gözegçilik etmäge we jogap bermäge mümkinçilik berýän abunalyk mehanizmini üpjün etmekdir. Bu nagyş köplenç dürli hadysalara reaksiýa berýän dürli diňleýjilerde we synçylarda ulanylýar. Simpleönekeý mysal hökmünde JDK-nyň birinji wersiýasyndan bu nagşyň ýerine ýetirilişini ýatlap bileris:
import java.util.*;
class Main {
  public static void main(String[] args) {
    Observer observer = (obj, arg) -> {
      System.out.println("Arg: " + arg);
    };
    Observable target = new Observable(){
      @Override
      public void notifyObservers(Object arg) {
        setChanged();
        super.notifyObservers(arg);
      }
    };
    target.addObserver(observer);
    target.notifyObservers("Hello, World!");
  }
}
Anotherene bir peýdaly özüni alyp barş usuly bar - “ Araçy ”. Peýdaly, sebäbi çylşyrymly ulgamlarda dürli obýektleriň arasyndaky baglanyşygy aýyrmaga we obýektleriň arasyndaky ähli täsirleri araçy bolan käbir obýektlere tabşyrmaga kömek edýär. Bu nagşyň iň täsir galdyryjy goşundylaryndan biri, bu nagşy ulanýan Bahar MVC. Bu hakda has giňişleýin maglumaty şu ýerden okap bilersiňiz: " Bahar: araçy nagşy ". Muny mysallarda köplenç görüp bilersiňiz java.util.Timer:
import java.util.*;
class Main {
  public static void main(String[] args) {
    Timer mediator = new Timer("Mediator");
    TimerTask command = new TimerTask() {
      @Override
      public void run() {
        System.out.println("Command pattern");
        mediator.cancel();
      }
    };
    mediator.schedule(command, 1000);
  }
}
Mysal buýruk görnüşine has meňzeýär. "Araçy" nagşynyň düýp manysy, Timera. Taymeriň içinde ýumuş nobaty bar TaskQueue, sapak bar TimerThread. Biz, bu synpyň müşderileri hökmünde olar bilen aragatnaşyk saklamaýarys, ýöne Timeronuň usullaryna çagyryşymyza jogap edip, araçy bolýan beýleki obýektleriň usullaryna girýän obýekt bilen aragatnaşyk saklaýarys. Daşardan "Fasad" -a gaty meňzeýän bolup biler. Theöne tapawut, “Fasad” ulanylanda, komponentler fasadyň bardygyny we biri-biri bilen gürleşýändigini bilmeýärler. "Araçy" ulanylanda, komponentler araçyny bilýärler we ulanýarlar, ýöne göni biri-biri bilen habarlaşmaýarlar. “ Şablon usuly ” nagşyny göz öňünde tutmalydyrys , nagyş onuň adyndan düşnüklidir. Iň esasy, kod ulanyjylara (işläp düzüjilere) käbir algoritm şablony bilen üpjün edilip, ädimleri täzeden kesgitlenmäge rugsat berilýär. Bu kod ulanyjylaryna tutuş algoritmi ýazmaga däl-de, diňe bu algoritmiň bir ýa-da başga bir ädimini nädip dogry ýerine ýetirmelidigi barada pikirlenmäge mümkinçilik berýär. AbstractListMysal üçin, Java-da iteratoryň özüni alyp barşyny kesgitleýän abstrakt synp bar List. Şeýle - de bolsa, iteratoryň özi: get,,, ýaly ýaprak usullaryny ulanýar . Bu usullaryň özüni alyp barşyny nesilleriň döredijisi kesgitleýär . Şeýlelik bilen, iterator - bir sahypanyň üstünde gaýtalamak algoritminiň şablonydyr. Specificörite durmuşa geçirijileri döredijiler, belli ädimleriň özüni alyp barşyny kesgitlemek bilen bu gaýtalamagyň özüni alyp barşyny üýtgedýärler. Derňeýän nagyşlarymyzyň iň soňkusy “ Snapshot ” (Momento). Onuň düýp manysy, bu ýagdaýy dikeltmek ukyby bilen obýektiň belli bir ýagdaýyny goramakdyr. JDK-dan iň tanalýan mysal obýektleriň seriallaşdyrylmagy, ýagny. . Bir mysala seredeliň: setremoveAbstractListAbstractListAbstractListjava.io.Serializable
import java.io.*;
import java.util.*;
class Main {
  public static void main(String[] args) throws IOException {
    ArrayList<String> list = new ArrayList<>();
    list.add("test");
    // Save State
    ByteArrayOutputStream stream = new ByteArrayOutputStream();
    try (ObjectOutputStream out = new ObjectOutputStream(stream)) {
      out.writeObject(list);
    }
    // Load state
    byte[] bytes = stream.toByteArray();
    InputStream inputStream = new ByteArrayInputStream(bytes);
    try (ObjectInputStream in = new ObjectInputStream(inputStream)) {
      List<String> listNew = (List<String>) in.readObject();
      System.out.println(listNew.get(0));
    } catch (ClassNotFoundException e) {
      // Do something. Can't find class fpr saved state
    }
  }
}
Java-da dizaýn nagyşlary - 8

Netije

Syndan görşümiz ýaly, dürli nagyşlar bar. Olaryň hersi öz meselesini çözýär. Bu nagyşlary bilmek, ulgamyňyzy çeýe, durnukly we üýtgemelere çydamly edip nädip ýazmalydygyna düşünmäge kömek edip biler. Netijede, has çuňňur çümmek üçin käbir baglanyşyklar: # Wiaçeslaw
Teswirler
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION