JavaRush /Блоги Java /Random-TG /Намунаҳои тарроҳӣ дар Java
Viacheslav
Сатҳи

Намунаҳои тарроҳӣ дар Java

Дар гурӯҳ нашр шудааст
Намунаҳо ё намунаҳои тарроҳӣ қисми аксаран нодида гирифташудаи кори таҳиягар мебошанд, ки нигоҳдорӣ ва мутобиқ шудан ба талаботи навро душвор мегардонад. Ман тавсия медиҳам, ки ба шумо бубинед, ки он чӣ гуна аст ва он дар JDK чӣ гуна истифода мешавад. Табиист, ки ҳама намунаҳои асосӣ дар ин ё он шакл муддати тӯлонӣ дар атрофи мо буданд. Биёед онҳоро дар ин баррасӣ бубинем.
Намунаҳои тарроҳӣ дар Java - 1
Мундариҷа:

Шаблонҳо

Яке аз талаботҳои маъмултарин дар ҷойҳои холӣ ин "Донистани намунаҳо" мебошад. Пеш аз ҳама, ба саволи оддӣ ҷавоб додан бамаврид аст - "Намунаи тарроҳӣ чист?" Pattern аз забони англисӣ ҳамчун "шаблон" тарҷума шудааст. Яъне, ин як намунаи муайянест, ки мо мувофиқи он коре мекунем. Дар барномасозӣ низ ҳамин тавр аст. Якчанд таҷриба ва усулҳои беҳтарин барои ҳалли мушкилоти умумӣ вуҷуд доранд. Ҳар як барномасоз меъмор аст. Ҳатто вақте ки шумо танҳо якчанд синф ё ҳатто як синф эҷод мекунед, он аз шумо вобаста аст, ки code дар шароити тағйирёбанда то чӣ андоза зинда монад ва аз ҷониби дигарон истифода бурдани он то чӣ андоза қулай аст. Ва дар ин ҷо дониши қолибҳо кӯмак хоҳад кард, зеро... Ин ба шумо имкон медиҳад, ки зуд фаҳмед, ки чӣ гуна codeро бе азнавнависӣ беҳтар нависед. Тавре ки шумо медонед, барномасозон танбал ҳастанд ва дарҳол навиштани чизе осонтар аст, назар ба чанд маротиба такрор кардани он) Намунаҳо низ метавонанд ба алгоритмҳо монанд бошанд. Аммо онҳо фарқият доранд. Алгоритм аз қадамҳои мушаххас иборат аст, ки амалҳои заруриро тавсиф мекунанд. Намунаҳо танҳо равишро тавсиф мекунанд, аммо қадамҳои татбиқро тавсиф намекунанд. Намунаҳо гуногунанд, зеро ... масъалахои гуногунро хал кунанд. Одатан категорияҳои зерин фарқ мекунанд:
  • Генератив

    Ин намунаҳо масъалаи чандир сохтани an objectро ҳал мекунанд

  • Сохторӣ

    Ин намунаҳо масъалаи самаранок сохтани робитаҳои байни an objectҳоро ҳал мекунанд

  • Рафтор

    Ин намунаҳо масъалаи таъсири самарабахши байни an objectҳоро ҳал мекунанд

Барои баррасии мисолҳо ман тавсия медиҳам, ки codeи онлайни compiler repl.it -ро истифода барем.
Намунаҳои тарроҳӣ дар Java - 2

Намунаҳои эҷодӣ

Биёед аз ибтидои давраи зиндагии an objectҳо - аз эҷоди an objectҳо оғоз кунем. Шаблонҳои тавлидкунанда барои осонтар сохтани an objectҳо кӯмак мекунанд ва дар ин раванд чандириро таъмин мекунанд. Яке аз машхуртаринаш « Строитель » мебошад. Ин намуна ба шумо имкон медиҳад, ки қадам ба қадам an objectҳои мураккаб эҷод кунед. Дар Java, намунаи машҳуртарин ин аст : 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());
  }
}
Равиши дигари маъруфи эҷоди an object ин интиқол додани эҷод ба усули алоҳида мебошад. Ин усул, гуё ба заводи an object табдил меёбад. Барои хамин хам намунаро « Усули фабрикй » меноманд. Масалан, дар Java, таъсири онро дар синф дидан мумкин аст . Худи синф абстрактист ва барои сохтани он усул истифода мешавад : java.util.CalendarCalendargetInstance
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());
  }
}
Ин аксар вақт аз он сабаб аст, ки мантиқи эҷоди an object метавонад мураккаб бошад. Масалан, дар ҳолати боло, мо ба синфи асосӣ дастрасӣ пайдо мекунем Calendarва синф сохта мешавад GregorianCalendar. Агар мо ба конструктор назар кунем, мо мебинем, ки вобаста ба шароит татбиқҳои гуногун сохта мешаванд Calendar. Аммо баъзан як усули завод кифоя нест. Баъзан ба шумо лозим меояд, ки an objectҳои гуногун эҷод кунед, то онҳо ба ҳам мувофиқат кунанд. Шаблони дигар дар ин бобат ба мо кумак мекунад - “ Заводи абстрактӣ ”. Ва баъд бояд дар як чо заводхои гуногун барпо кунем. Дар баробари ин, бартарии он аст, ки тафсилоти татбиқ барои мо муҳим нест, яъне. фарк надорад, ки мо кадом заводи мушаххасро гирем. Муҳим он аст, ки он татбиқи дурустро эҷод мекунад. Намунаи супер:
Намунаҳои тарроҳӣ дар Java - 3
Яъне, вобаста ба муҳити зист (системаи амалиётӣ) мо як корхонаи муайяне мегирем, ки унсурҳои мувофиқро эҷод мекунад. Ҳамчун алтернатива ба равиши эҷод тавассути ягон каси дигар, мо метавонем намунаи " Прототип " -ро истифода барем. Моҳияти он оддӣ аст - an objectҳои нав дар тасвир ва шабоҳати an objectҳои аллакай мавҷуда офарида мешаванд, яъне. аз рӯи прототипи худ. Дар Java, ҳама бо ин намуна дучор омадаанд - ин истифодаи интерфейс аст 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
    }
  }
}
Тавре ки шумо мебинед, зангзан намедонад, ки чӣ тавр clone. Яъне, сохтани an object дар асоси прототип масъулияти худи an object аст. Ин муфид аст, зеро он корбарро ба татбиқи an objectи шаблон намепайвандад. Хуб, охирин дар ин рӯйхат намунаи "Singleton" аст. Мақсади он оддӣ аст - пешниҳоди як мисоли an object барои тамоми барнома. Ин намуна ҷолиб аст, зеро он аксар вақт мушкилоти гуногунҷабҳаро нишон медиҳад. Барои дидани амиқтар, ин мақолаҳоро санҷед:
Намунаҳои тарроҳӣ дар Java - 4

Намунаҳои сохторӣ

Бо офаридани an objectхо равшантар гардид. Ҳоло вақти он аст, ки ба намунаҳои сохторӣ назар кунем. Ҳадафи онҳо сохтани иерархияи синфҳои ба осонӣ дастгирӣшаванда ва муносибатҳои онҳост. Яке аз намунаҳои аввалин ва маъруф ин " Депутат " (прокси) мебошад. Прокси интерфейси ҳамон an objectи воқеӣ дорад, аз ин рӯ барои муштарӣ кор кардани тавассути прокси ё мустақим фарқият надорад. Намунаи соддатарин 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"));
  }
}
Тавре ки шумо мебинед, мо дар мисоли аслӣ дорем - ин ҳамонест HashMap, ки интерфейсро амалӣ мекунад Map. Минбаъд мо проксиеро эҷод мекунем, ки проксии аслиро HashMapбарои қисми муштарӣ иваз мекунад, ки putва методҳоро даъват мекунад getва дар вақти занг мантиқи шахсии худро илова мекунад. Тавре ки мо мебинем, мутақобила дар намуна тавассути интерфейсҳо сурат мегирад. Аммо баъзан ивазкунанда кофӣ нест. Ва он гоҳ намунаи " Декоратор " метавонад истифода шавад. Ороишгарро парпеч ё печанда низ меноманд. Прокси ва ороишгар хеле монанданд, аммо агар шумо ба мисол нигаред, фарқиятро хоҳед дид:
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);
  }
}
Баръакси прокси, ороишгар худро дар атрофи чизе мепечад, ки ҳамчун вуруд дода мешавад. Прокси метавонад ҳам он чизеро, ки бояд прокси карда шавад, қабул кунад ва инчунин ҳаёти an objectи проксиро идора кунад (масалан, an objectи проксиро эҷод кунед). Боз як намунаи ҷолиб вуҷуд дорад - " Адаптер ". Он ба ороишгар шабоҳат дорад - ороишгар як an objectро ҳамчун вуруд қабул мекунад ва парпечро дар болои ин an object бармегардонад. Фарқият дар он аст, ки ҳадаф тағир додани функсия нест, балки мутобиқ кардани як интерфейс ба интерфейси дигар аст. Java як мисоли хеле равшани ин дорад:
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));
  }
}
Дар вуруд мо массив дорем. Баъдан, мо адаптер эҷод мекунем, ки массивро ба интерфейс меорад List. Ҳангоми кор бо он, мо воқеан бо массив кор мекунем. Аз ин рӯ, илова кардани элементҳо кор намекунад, зеро... Массиви аслиро тағир додан мумкин нест. Ва дар ин ҳолат мо ба даст меорем UnsupportedOperationException. Равиши навбатии ҷолиб барои таҳияи сохтори синфӣ намунаи таркибӣ мебошад . Ҷолиб он аст, ки маҷмӯи муайяни элементҳо бо истифода аз як интерфейс дар иерархияи муайяни ба дарахт монанд ҷойгир карда шудаанд. Бо даъват кардани усул дар унсури волидайн, мо ба ин усул дар ҳама унсурҳои зарурии кӯдак занг мезанем. Намунаи асосии ин намуна UI мебошад (хоҳ java.awt ё JSF):
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());
  }
}
Тавре ки мо мебинем, мо ба контейнер компонент илова кардем. Ва он гоҳ мо аз контейнер хоҳиш кардем, ки самти нави ҷузъҳоро татбиқ кунад. Ва контейнер бо донистани он, ки аз кадом ҷузъҳо иборат аст, иҷрои ин фармонро ба ҳамаи ҷузъҳои кӯдак вогузор кардааст. Намунаи дигари ҷолиб ин намунаи " Пул " аст. Ин номида мешавад, зеро он робита ё пули байни ду иерархияи гуногуни синфро тавсиф мекунад. Яке аз ин иерархияҳо абстраксия ва дигаре амалӣ ҳисобида мешаванд. Ин таъкид карда мешавад, зеро худи абстраксия амалҳоро иҷро намекунад, балки ин иҷроишро ба иҷроиш вогузор мекунад. Ин намуна аксар вақт ҳангоми мавҷуд будани синфҳои «назорат» ва якчанд намуди синфҳои «платформа» (масалан, Windows, Linux ва ғайра) истифода мешавад. Бо ин равиш, яке аз ин иерархияҳо (абстраксия) ба an objectҳои иерархияи дигар (иҷрокунӣ) истинод гирифта, кори асосиро ба онҳо вогузор мекунад. Азбаски ҳамаи татбиқҳо интерфейси умумиро пайравӣ мекунанд, онҳоро дар дохor абстраксия иваз кардан мумкин аст. Дар Java, як мисоли равшани ин аст java.awt:
Намунаҳои тарроҳӣ дар Java - 5
Барои маълумоти иловагӣ, ба мақолаи " Намунаҳо дар Java AWT " нигаред. Дар байни намунаҳои сохторӣ, ман мехоҳам намунаи " фасад " -ро низ қайд кунам. Моҳияти он пинҳон кардани мураккабии истифодаи китобхонаҳо/чаҳорчӯба дар паси ин API дар паси интерфейси қулай ва мухтасар аст. Масалан, шумо метавонед JSF ё EntityManager-ро аз JPA ҳамчун намуна истифода баред. Инчунин як намунаи дигаре вуҷуд дорад, ки " Вазни парвоз " ном дорад. Мохияти он дар он аст, ки агар предметхои гуногун холати якхела дошта бошанд, он гох онро умуми карда, на дар хар як an object, балки дар як чо нигох доштан мумкин аст. Ва он гоҳ ҳар як an object метавонад ба як қисми умумӣ муроҷиат кунад, ки хароҷоти хотираро барои нигоҳдорӣ кам мекунад. Ин намуна аксар вақт пеш аз кэшкунӣ ё нигоҳдории ҳавзи an objectҳоро дар бар мегирад. Ҷолиб он аст, ки мо низ ин намунаро аз аввал медонем:
Намунаҳои тарроҳӣ дар Java - 6
Ба ҳамин монанд, як ҳавзи сатрҳоро метавон дар ин ҷо дохил кард. Шумо метавонед мақоларо дар ин мавзӯъ хонед: " Намунаи тарроҳии Flyweight ".
Намунаҳои тарроҳӣ дар Java - 7

Намунаҳои рафтор

Ҳамин тавр, мо фаҳмидем, ки чӣ гуна an objectҳоро эҷод кардан мумкин аст ва робитаҳои байни синфҳоро чӣ гуна ташкил кардан мумкин аст. Аз ҳама ҷолибтарин чизе, ки боқӣ мондааст, таъмини чандирӣ дар тағир додани рафтори an objectҳост. Ва намунаҳои рафтор ба мо дар ин кор кӯмак хоҳанд кард. Яке аз намунаҳои маъмултарин намунаи " Стратегия " мебошад. Ин аст, ки омӯзиши намунаҳо дар китоби " Дар аввал сар. Намунаҳои тарроҳӣ " оғоз меёбад. Бо истифода аз намунаи "Стратегия" мо метавонем дар дохor an object нигоҳ дорем, ки чӣ гуна амалро иҷро мекунем, яъне. an object дар дохor мағозаҳо стратегияи, ки мумкин аст дар давоми иҷрои рамз тағйир. Ин намунаест, ки мо одатан ҳангоми истифодаи муқоисакунанда истифода мебарем:
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);
  }
}
Пеш аз мо - TreeSet. Он дорои рафтори TreeSetнигоҳ доштани тартиби элементҳо, яъне. онҳоро ба навъҳо ҷудо мекунад (зеро он SortedSet аст). Ин рафтор стратегияи пешфарз дорад, ки мо онро дар JavaDoc мебинем: мураттабсозӣ дар "тартиби табиӣ" (барои сатрҳо ин тартиби лексикографӣ аст). Ин ҳодиса рӯй медиҳад, агар шумо конструктори бепараметрро истифода баред. Аммо агар мо хоҳем, ки стратегияро тағир диҳем, мо метавонем Comparator. Дар ин мисол, мо метавонем маҷмӯи худро ҳамчун new TreeSet(comparator), созем ва он гоҳ тартиби нигоҳдории элементҳо (стратегияи нигоҳдорӣ) ба тартиби дар муқоисакунанда нишондодашуда тағир меёбад. Ҷолиб он аст, ки тақрибан як қолаб бо номи " Давлат " вуҷуд дорад. Намунаи «Давлат» мегӯяд, ки агар мо дар an objectи асосӣ ягон рафторе дошта бошем, ки ба ҳолати ин an object вобаста бошад, мо метавонем худи ҳолатро ҳамчун an object тавсиф кунем ва an objectи ҳолатро тағир диҳем. Ва даъват аз an objectи асосй ба давлат. Намунаи дигаре, ки аз омӯзиши асосҳои забони Java ба мо маълум аст, намунаи " Фармон " мебошад. Ин намунаи тарроҳӣ нишон медиҳад, ки фармонҳои гуногун метавонанд ҳамчун синфҳои гуногун муаррифӣ шаванд. Ин намуна ба намунаи Стратегия хеле монанд аст. Аммо дар намунаи Стратегия, мо аз нав муайян мекардем, ки чӣ гуна амали мушаххас иҷро карда мешавад (масалан, ҷудокунӣ дар TreeSet). Дар намунаи "Фармон" мо аз нав муайян мекунем, ки кадом амал иҷро мешавад. Фармони намуна ҳар рӯз ҳангоми истифодаи риштаҳо бо мост:
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();
  }
}
Тавре ки шумо мебинед, фармон амал ё фармонеро муайян мекунад, ки дар риштаи нав иҷро карда мешавад. Намунаи «Занҷири масъулият » -ро низ баррасӣ кардан лозим аст . Ин намуна низ хеле содда аст. Ин намуна мегӯяд, ки агар чизе коркард карда шавад, шумо метавонед коркардкунандагонро дар як занҷир ҷамъ кунед. Масалан, ин намуна аксар вақт дар serverҳои веб истифода мешавад. Дар вуруд, server як дархости корбар дорад. Ин дархост пас аз занҷири коркард мегузарад. Ин силсилаи коркардкунандагон филтрҳоро дар бар мегирад (масалан, дархостҳоро аз рӯйхати сиёҳи суроғаҳои IP қабул накунед), коркардкунандагони аутентификатсия (танҳо ба корбарони ваколатдор иҷозат диҳед), коркарди сарлавҳаи дархост, коркарди кэш ва ғайра. Аммо дар Java як мисоли соддатар ва фаҳмотар вуҷуд дорад 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");
  }
}
Тавре ки шумо мебинед, Handlers ба рӯйхати коркардкунандагони logger илова карда мешаванд. Вақте ки сабткунанда паёмро барои коркард қабул мекунад, ҳар як чунин паём аз занҷири коркардкунандагон (аз logger.getHandlers) барои он сабтгоҳҳ мегузарад. Намунаи дигаре, ки мо ҳар рӯз мебинем " Итератор " аст. Моҳияти он аз ҷудо кардани коллексияи an objectҳо (яъне синфе, ки сохтори маълумотро ифода мекунад. Масалан, List) ва гузариши ин коллексия мебошад.
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());
    }
  }
}
Тавре ки шумо мебинед, итератор қисми коллексия нест, балки аз ҷониби як синфи алоҳида, ки коллексияро мегузарад, муаррифӣ мешавад. Истифодабарии итератор ҳатто намедонад, ки он дар кадом коллексия такрор мешавад, яъне. вай ба кадом коллексия ташриф меорад? Қобor таваҷҷӯҳи намунаи " Меҳмон " аст. Намунаи меҳмонон ба намунаи итератор хеле монанд аст. Ин намуна ба шумо барои гузаштан аз сохтори an objectҳо ва иҷрои амалҳо дар ин an objectҳо кӯмак мекунад. Онҳо дар консепсия хеле фарқ мекунанд. Итератор коллексияро убур мекунад, то мизоҷе, ки итераторро истифода мебарад, парвое надорад, ки коллексия дар дохor он чӣ аст, танҳо унсурҳои пайдарпай муҳиманд. Меҳмон маънои онро дорад, ки иерархия ё сохтори муайяни an objectҳое, ки мо дидан мекунем, вуҷуд дорад. Масалан, мо метавонем коркарди алоҳидаи директория ва коркарди файлҳои алоҳидаро истифода барем. Java татбиқи берун аз қуттии ин намунаро дар шакл дорад 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
    }
  }
}
Баъзан лозим меояд, ки баъзе an objectҳо ба тағирёбии an objectҳои дигар вокуниш нишон диҳанд ва он гоҳ намунаи "Нозир" ба мо кӯмак мекунад . Роҳи аз ҳама мувофиқ ин пешниҳоди механизми обуна мебошад, ки ба баъзе an objectҳо имкон медиҳад, ки рӯйдодҳои дар an objectҳои дигар рухдода назорат ва посух диҳанд. Ин намуна аксар вақт дар шунавандагон ва нозирони гуногун истифода мешавад, ки ба рӯйдодҳои гуногун вокуниш нишон медиҳанд. Ҳамчун мисоли оддӣ, мо метавонем татбиқи ин намунаро аз versionи якуми JDK ба ёд орем:
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!");
  }
}
Намунаи дигари муфиди рафтор вуҷуд дорад - " Миёнаравӣ ". Ин муфид аст, зеро дар системаҳои мураккаб он барои аз байн бурдани алоқаи байни an objectҳои гуногун ва додани ҳама таъсироти байни an objectҳо ба ягон an object, ки миёнарав аст, кӯмак мекунад. Яке аз барномаҳои ҷолиби ин намуна Spring MVC мебошад, ки ин намунаро истифода мебарад. Шумо метавонед дар ин ҷо маълумоти бештар гиред: " Баҳор: Намунаи миёнарав ". Шумо аксар вақт инро дар мисолҳо мебинед 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);
  }
}
Намуна бештар ба намунаи фармон монанд аст. Ва мохияти намунаи «Миёнарав» дар татбики Timer'а. Дар дохor таймер навбати супориш мавҷуд аст TaskQueue, ришта вуҷуд дорад TimerThread. Мо, ҳамчун мизоҷони ин синф, на бо онҳо, балки бо an objectе ҳамкорӣ мекунем Timer, ки дар посух ба даъвати мо ба усулҳои он ба усулҳои дигар an objectҳое, ки миёнарави онҳост, дастрасӣ пайдо мекунад. Аз берун он метавонад хеле монанд ба "Facade" ба назар мерасад. Аммо фарқият дар он аст, ки вақте ки фасад истифода мешавад, ҷузъҳо намедонанд, ки фасад вуҷуд дорад ва бо ҳамдигар сӯҳбат мекунанд. Ва ҳангоме ки "Миёнарав" истифода мешавад, ҷузъҳо миёнаравро медонанд ва истифода мебаранд, аммо мустақиман бо ҳамдигар тамос намегиранд. Қобor таваҷҷуҳ ба намунаи “ Усули Шаблон ” аст . Намуна аз номи он равшан аст. Хулоса ин аст, ки code тавре навишта шудааст, ки ба корбарони code (таҳиягарон) ягон қолаби алгоритмӣ дода мешавад, ки қадамҳои онҳо барои аз нав муайян кардани онҳо иҷозат дода мешаванд. Ин ба корбарони code имкон медиҳад, ки тамоми алгоритмро нанависанд, балки танҳо дар бораи чӣ гуна дуруст иҷро кардани ин ё он қадами ин алгоритм фикр кунанд. Масалан, Java дорои синфи абстрактӣ мебошад AbstractList, ки рафтори итераторро тавассути List. Аммо худи итератор усулҳои баргро истифода мебарад, ба монанди: get, set, remove. Рафтори ин усулҳо аз ҷониби таҳиягари наслҳо муайян карда мешавад AbstractList. Ҳамин тариқ, итератор дар AbstractList- қолаби алгоритми такрори варақ аст. Ва таҳиягарони татбиқи мушаххас AbstractListрафтори ин итератсияро тавассути муайян кардани рафтори қадамҳои мушаххас тағир медиҳанд. Намунаҳои охирине, ки мо таҳлил мекунем, намунаи " Snapshot " (Momento) мебошад. Моҳияти он нигоҳ доштани ҳолати муайяни an object бо қобorяти барқарор кардани ин ҳолат мебошад. Намунаи маъмултарин аз JDK силсилаи an objectҳост, яъне. java.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 - 8

Хулоса

Тавре ки мо аз баррасии дидем, навъҳои зиёди намунаҳо мавҷуданд. Ҳар яке аз онҳо мушкилоти худро ҳал мекунад. Ва дониш дар бораи ин намунаҳо метавонад ба шумо кӯмак кунад, ки сари вақт фаҳмед, ки чӣ гуна системаи худро нависед, то он чандир, нигоҳдорӣ ва тобовар ба тағирот бошад. Ва дар ниҳоят, баъзе истинодҳо барои ғарқи амиқтар: #Вячеслав
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION