Мо аллакай гузаштем чунин схема истифодаи объекти классро, монанди Singleton, аммо мумкин аст, ту ҳанӯз намедонӣ, ки ин яке аз паттернҳои тарроҳӣ аст, ва яке аз бештар истифодашаванда.
Дар ҳақиқат бисёр аз ин паттернҳо вуҷуд доранд, ғайр аз ин — онҳо иерархия доранд, ва ҳар як паттерн — мақсади худро дорад.
Классификатсияи паттернҳо
Намуди паттерн | Истифодаи он |
---|---|
Порождающие | Намуде, ки мушкили эҷоди объектҳоро ҳал мекунад |
Структурные | Паттернҳое, ки имконияти сохтани иерархияи дуруст ва тамдидшавандаи класҳоро дар архитектураи мо медиҳанд |
Поведенческие | Ин кластер паттернҳо барои муносибати бехатар ва бароҳати байни объектҳои барнома имконият медиҳад |
Одатан паттерн бо мушкилие, ки онро ҳал мекунад, тавсиф мешавад. Биёед, якчанд паттернҳоро дида мебароем, ки бо онҳо барномаи Java кор мекунем:
Паттерн | Мақсад |
---|---|
Singleton | Бо он аллакай шинос ҳастем ва онро барои эҷод ва муроҷиати ба класс, ки аз як намуна зиёдтар наметавонад бошад, истифода мебарем. |
Iterator | Мо, албатта, бо он шинос ҳастем ва медонем, ки ин паттерн ба мо имконият медиҳад объектро вобаста накарда диққатти дохилиро тағйир диҳем. Бо коллексияҳо истифода мешавад. |
Adapter | Объектҳои номутобиқро барои коркарди ҳамҷоя пайваст мекунад. Фикр мекунам, ки гап дар бораи адаптер рафта истодааст, ҳар кас аниқ медонад, ки чӣ тавр кор мекунад ин паттерн. Масалан, гидравлика - адаптери USB - вилка дар розетка. |
Template Method | Паттерни рафтории барномасозӣ, ки мушкили интегратсияро ҳалли мекунад ва ба шумо имконият медиҳад, ки сохтори алгоритмро тағйир надиҳед, аммо қадамҳои онро тағйир диҳед. Тасаввур кунед, ки мо алгоритми бозмонди автомобилро дар шакли пайдарпаии ҷамъоварӣ дорем: Шасси -> Корпус -> Двигатель -> ҷамъоварии салон Агар мо рамкаи қавӣ, двигатель пуриқтидор ё салон бо равшании иловагӣ насб кунем, мо ҳанӯз алгоритмро тағйир намедиҳем ва пайдарпаии абстраксиён ҳамин монанди мемонад. |
Decorator | Ба объектҳо "обертка" эҷод мекунад, ки ба онҳо функсионалияти муфид илова кунад. Мо онро дар доираи ин мақола баррасӣ мекунем. |
Дар Java.io паттернҳо дар классҳои зерин татбиқ мешаванд:
Паттерн | Куҷо истифода мешавад дар Java.io |
---|---|
Adapter |
|
Template Method | |
Decorator |
Паттерни Декоратор
Биёед тасаввур кунем, ки мо модели тарроҳӣ кардани хона тасвир мекунем.
Дар маҷмӯъ схема чунин хоҳад буд:
Ибтидо мо якчанд намуди хонаҳо дорем. Конфигуратсияи минималӣ — як ошёна бо сақф, баъдан — бо ёрии декораторҳо ҳар яке аз намудҳоро бо параметрҳои иловагӣ тағйир дода метавонем, ва ин ба нархи хона таъсир хоҳад расонд.
Класси абстрактии хона эҷод мекунем:
public abstract class House {
String info;
public String getInfo(){
return info;
}
public abstract int getPrice();
}
Инҷо мо 2 метод дорем:
- getInfo() маълумотро дар бораи ном ва конфигуратсияи хонаи мо бармегардонад;
- getPrice() — нархи хонаро дар конфигуратсияи ҷорӣ бармегардонад.
Ҳамчунин мо стандарт иҷроиши хонаҳо — хонаи сангпуштил ва чӯбин дорем:
public class BrickHouse extends House {
public BrickHouse() {
info = "Хонаи сангпуштил";
}
@Override
public int getPrice() {
return 20_000;
}
}
public class WoodenHouse extends House {
public WoodenHouse() {
info = "Хонаи чӯбин";
}
@Override
public int getPrice() {
return 25_000;
}
}
Ҳарду классҳо аз класс House мерос гирифта шудаанд ва методи нархро аз нав месозанд, ки нархи фардии хонаи стандартиро медиҳад. Дар конструктор номро таъин мекунем.
Баъдан мо бояд классҳои — декораторҳо нависем. Ин классҳое, ки аз класс House низ мерос гирифта шудаанд. Барои ин мо як класси абстрактии декоратор эҷод мекунем.
Дар он мо метавонем мантиқе барои тағйири объект гузорем. Дар ҳолати мо мантиқи иловагӣ нахоҳад буд ва класси абстрактӣ холӣ хоҳад буд.
abstract class HouseDecorator extends House {
}
Баъдан классҳои амалишавии декораторҳоро эҷод мекунем. Мо чанд классҳо эҷод мекунем, ки ба хона параметрҳои иловагӣ илова карда метавонанд:
public class SecondFloor extends HouseDecorator {
House house;
public SecondFloor(House house) {
this.house = house;
}
@Override
public int getPrice() {
return house.getPrice() + 20_000;
}
@Override
public String getInfo() {
return house.getInfo() + " + ошёнаи дуюм";
}
}
Декораторе, ки ба хонаи мо ошёнаи дуюм илова мекунад |
Дар конструктори декоратор ба хона, ки мо тағйироти декораторро истифода мекунем, қабул карда мешавад. Ва методҳои getPrice() ва getInfo(), ки мо аз нав месозем, маълумотро дар бораи хонаи навтаҷдидшуда, ки дар асоси кӯҳна тартиб дода шудааст, бармегардонанд.
public class Garage extends HouseDecorator {
House house;
public Garage(House house) {
this.house = house;
}
@Override
public int getPrice() {
return house.getPrice() + 5_000;
}
@Override
public String getInfo() {
return house.getInfo() + " + гараж";
}
}
Декораторе, ки ба хонаи мо гараж илова мекунад |
Ҳоло мо метавонем хонаи худро бо ёрии декораторҳо тағйир диҳем. Барои ин бояд хона созем:
House brickHouse = new BrickHouse();
Баъдан мо ба тағйирёбандаи худ house арзиши навро дар шакли декоратор, ки дар он хонаи худро мегузорем, медиҳем:
brickHouse = new SecondFloor(brickHouse);
Таъғирёбандаи мо house аллакай хона бо ошёнаи дуюм дорад.
Биёед, ҳолатҳои истифодаи декораторҳоро баррасӣ кунем:
Намунаи код | Натиҷа |
---|---|
|
Хонаи сангпуштил 20000 |
|
Хонаи сангпуштил + ошёнаи дуюм 40000 |
|
Хонаи сангпуштил + ошёнаи дуюм + гараж 45000 |
|
Хонаи чӯбин + гараж + ошёнаи дуюм 50000 |
|
Хонаи чӯбин 25000 Хонаи чӯбин + гараж 30000 |
Дар ин мисол мо бартарии тағйир додани объект бо ёрии декораторро мебинем. Маълум мешавад, ки мо худи объектро дигар намекунем woodenHouse, балки як объекти навро дар асоси он месозем. Аммо дар ин бартарӣ метавонад мо камбудиҳо бинем: ҳар дафъа мо объекти навро дар хотира месозем, ки ба он бори иловагӣ медиҳад.
Биёед, диаграммаи UML-и барномаи худро баррасӣ кунем:

Декоратор хеле осон татбиқ мешавад ва барои тағйири динамикии объектҳо, тағйироти онҳо истифода мешавад. Декораторро аз рӯи конструкторҳое, ки объектҳои ҳамон типи абстрактӣ ё интерфейси мавҷударо қабул мекунанд, шинохтан мумкин аст. Дар Java ин паттерн дар классҳои ворид/хориҷ васеъ истифода мешавад.
Масалан, чунон ки аллакай қайд кардем, ҳамаи зерсинфаҳои java.io.InputStream, OutputStream, Reader ва Writer конструктор доранд, ки объектҳои ин ҳамон синфҳоро қабул мекунанд.
GO TO FULL VERSION