├── .gitignore
├── BasePatterns.iml
└── src
└── net
└── proselyte
└── basepatterns
├── AboutPatterns.txt
├── CourseStrucure.txt
├── OOP.txt
├── behavioral
├── chain
│ ├── BugTracker.java
│ ├── ChainOfResponsibility.txt
│ ├── EmailNotifier.java
│ ├── Notifier.java
│ ├── Priority.java
│ ├── SMSNotifier.java
│ └── SimpleReportNotifier.java
├── command
│ ├── Command.java
│ ├── Command.txt
│ ├── Database.java
│ ├── DatabaseRunner.java
│ ├── DeleteCommand.java
│ ├── Developer.java
│ ├── InsertCommand.java
│ ├── SelectCommand.java
│ └── UpdateCommand.java
├── interpreter
│ ├── AndExpression.java
│ ├── Expression.java
│ ├── Interpreter.txt
│ ├── InterpreterRunner.java
│ ├── OrExpression.java
│ └── TerminalExpression.java
├── iterator
│ ├── Collection.java
│ ├── Iterator.java
│ ├── Iterator.txt
│ ├── JavaDeveloper.java
│ └── JavaDeveloperRunner.java
├── mediator
│ ├── Admin.java
│ ├── Chat.java
│ ├── Mediator.txt
│ ├── SimpleChatRunner.java
│ ├── SimpleTextChat.java
│ ├── SimpleUser.java
│ └── User.java
├── memento
│ ├── GithubRepo.java
│ ├── Menento.txt
│ ├── Project.java
│ ├── Save.java
│ └── SaveProjectRunner.java
├── observer
│ ├── JavaDeveloperJobSite.java
│ ├── JobSearch.java
│ ├── Observed.java
│ ├── Observer.java
│ ├── Observer.txt
│ └── Subscriber.java
├── state
│ ├── Activity.java
│ ├── Coding.java
│ ├── Developer.java
│ ├── DeveloperDay.java
│ ├── Reading.java
│ ├── Sleeping.java
│ ├── State.txt
│ └── Training.java
├── strategy
│ ├── Activity.java
│ ├── Coding.java
│ ├── Developer.java
│ ├── DeveloperRunner.java
│ ├── Reading.java
│ ├── Sleeping.java
│ ├── Strategy.txt
│ └── Training.java
├── template
│ ├── NewsPage.java
│ ├── Template.txt
│ ├── WebsiteRunner.java
│ ├── WebsiteTemplate.java
│ └── WelcomePage.java
└── visitor
│ ├── Database.java
│ ├── Developer.java
│ ├── JuniorDeveloper.java
│ ├── Project.java
│ ├── ProjectClass.java
│ ├── ProjectElement.java
│ ├── ProjectRunner.java
│ ├── SeniorDeveloper.java
│ ├── Test.java
│ └── Visitor.txt
├── creational
├── abstractfactory
│ ├── AbstractFactory.txt
│ ├── AuctionWebsite.java
│ ├── Developer.java
│ ├── ProjectManger.java
│ ├── ProjectTeamFactory.java
│ ├── SuperBankSystem.java
│ ├── Tester.java
│ ├── banking
│ │ ├── BankTeamFactory.java
│ │ ├── BankingPM.java
│ │ ├── JavaDeveloper.java
│ │ └── QATester.java
│ └── website
│ │ ├── ManualTester.java
│ │ ├── PhpDeveloper.java
│ │ ├── WebsitePM.java
│ │ └── WebsiteTeamFactory.java
├── builder
│ ├── BuildWebsiteRunner.java
│ ├── Builder.txt
│ ├── Cms.java
│ ├── Director.java
│ ├── EnterpriseWebsiteBuilder.java
│ ├── VisitCardWebsiteBuilder.java
│ ├── Website.java
│ └── WebsiteBuilder.java
├── factory
│ ├── CppDeveloper.java
│ ├── CppDeveloperFactory.java
│ ├── Developer.java
│ ├── DeveloperFactory.java
│ ├── FactoryMethod.txt
│ ├── JavaDeveloper.java
│ ├── JavaDeveloperFactory.java
│ ├── PhpDeveloper.java
│ ├── PhpDeveloperFactory.java
│ └── Program.java
├── prototype
│ ├── Copyable.java
│ ├── Project.java
│ ├── ProjectFactory.java
│ ├── Prototype.txt
│ └── VersionControlRunner.java
└── singleton
│ ├── ProgramLogger.java
│ ├── ProgramRunner.java
│ └── Singleton.txt
└── structural
├── adapter
├── Adapter.txt
├── AdapterJavaToDatabase.java
├── Database.java
├── DatabaseRunner.java
└── JavaApplication.java
├── bridge
├── BankSystem.java
├── Bridge.txt
├── CppDeveloper.java
├── Developer.java
├── JavaDeveloper.java
├── Program.java
├── ProgramCreator.java
└── StockExchange.java
├── composite
├── Composite.txt
├── CppDeveloper.java
├── Developer.java
├── JavaDeveloper.java
├── Project.java
└── Team.java
├── decorator
├── Decorator.txt
├── Developer.java
├── DeveloperDecorator.java
├── JavaDeveloper.java
├── JavaTeamLead.java
├── SeniorJavaDeveloper.java
└── Task.java
├── facade
├── BugTracker.java
├── Developer.java
├── Facade.txt
├── Job.java
├── SprintRunner.java
└── Workflow.java
├── flyweight
├── CppDeveloper.java
├── Developer.java
├── DeveloperFactory.java
├── Flyweight.txt
├── JavaDeveloper.java
└── ProjectRunner.java
└── proxy
├── Project.java
├── ProjectRunner.java
├── Proxy.txt
├── ProxyProject.java
└── RealProject.java
/.gitignore:
--------------------------------------------------------------------------------
1 | .idea/
2 | out/
3 | target/
4 |
5 | *.class
6 |
7 | *.jar
8 | *.war
9 | *.ear
--------------------------------------------------------------------------------
/BasePatterns.iml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/src/net/proselyte/basepatterns/AboutPatterns.txt:
--------------------------------------------------------------------------------
1 | Курс Шаблоны проектирования на языке Java
2 | ==============================================================================================================
3 | Цель курса:
4 | Дать понимание основных шаблонов проектирования и привести примеры их использования.
5 |
6 | Для кого:
7 | Для людей, имеющих базовые знания Java Core и основ ООП.
8 |
9 | ==============================================================================================================
10 | Шаблон проектирования - это именованое эффективное решение характерной задачи проектирования программного
11 | обеспечения.
--------------------------------------------------------------------------------
/src/net/proselyte/basepatterns/CourseStrucure.txt:
--------------------------------------------------------------------------------
1 | Структура курса:
2 |
3 | 1. Введение в шаблоны проектирования.
4 | 2. Основные понятия ООП.
5 | 3. Порождающие шаблоны.
6 | 4. Стуктурные шаблоны.
7 | 5. Шаблоны поведения.
8 | 6. Заключение.
--------------------------------------------------------------------------------
/src/net/proselyte/basepatterns/OOP.txt:
--------------------------------------------------------------------------------
1 | ООП - парадигма программирования, в которой ключевым блоком является объект, который соотносится
2 | с объектом в конкретной задаче.
3 | ==========================================================================================================================
4 | Главные аспекты:
5 | - любая система состоит из объектов;
6 | - каждый объект имеет состояние и поведение;
7 | - объекты взаимодействуют между собой опредлённым способом;
8 | ==========================================================================================================================
9 | Принципы ООП:
10 | - Инкапсуляция;
11 | - Наследование;
12 | - Полиморфизм;
13 | ==========================================================================================================================
14 | Инкапсуляция:
15 | - механизм, благодаря которому любой класс или часть системы рассматриваются как отдельный модуль
16 | и пользователь этого модуля может взаимодействовать с ним только определёнными способами и не видит
17 | реализации этого модуля.
18 | - сводит к минимуму количество связей между частями системы, тем самым,
19 | упрощая изменение модулей (рефакторинг).
20 | ==========================================================================================================================
21 | Наследование:
22 | - механизм создания одного класса с помощью другого с использованием всех свойств и методов
23 | суперкласса добавляя новые свойства и методы при необходимости.
24 | - отображает иерархичность окружающего мира.
25 | ==========================================================================================================================
26 | Полиморфизм:
27 | - механизм, благодаря которому подклассы могут изменять реализацию методов суперкласса, сохраняя
28 | его сигнатуру, благодаря чему интерфейс суперкласса остаётся неизменным.
29 | - позволяет работать с объектами подклассов как с объектами суперкласса, даже с учётом того,
30 | что реализация определённых методов у подклассов может отличаться от реализации методов суперкласса.
31 | ==========================================================================================================================
32 | UML
33 |
34 | Unified Modeling Language
35 | Универсальный язык моделирования
36 | ==========================================================================================================================
--------------------------------------------------------------------------------
/src/net/proselyte/basepatterns/behavioral/chain/BugTracker.java:
--------------------------------------------------------------------------------
1 | package net.proselyte.basepatterns.behavioral.chain;
2 |
3 | public class BugTracker {
4 | public static void main(String[] args) {
5 | Notifier reportNotifier = new SimpleReportNotifier(Priority.ROUTINE);
6 | Notifier emailNotifier = new EmailNotifier(Priority.IMPORTANT);
7 | Notifier smsNotifier = new SMSNotifier(Priority.ASAP);
8 |
9 | reportNotifier.setNextNotifier(emailNotifier);
10 | emailNotifier.setNextNotifier(smsNotifier);
11 |
12 | reportNotifier.notifyManager("Everything is OK.", Priority.ROUTINE);
13 | reportNotifier.notifyManager("Something went wrong!", Priority.IMPORTANT);
14 | reportNotifier.notifyManager("Houston, we've had a problem here!!!", Priority.ASAP);
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/src/net/proselyte/basepatterns/behavioral/chain/ChainOfResponsibility.txt:
--------------------------------------------------------------------------------
1 | Шаблон: Цепочка ответственности (Chain Of Responsibility)
2 | =======================================================================================================
3 | Цель:
4 |
5 | Связывание объектов-получаетлей в цепочку и передача запроса по ней.
6 |
7 | =======================================================================================================
8 |
9 | Для чего используется:
10 |
11 | Помогает избежать привязки отправителя запроса к его получателю, что даёт возможность обработать
12 | данный запрос нескольким объектам.
13 |
14 | =======================================================================================================
15 | Пример использования:
16 |
17 | - ослабление привязанности (объект не должен знать, кто именно обработает его запрос);
18 | - дополнительная гибкость при распределении обязанностей между объектами;
19 |
20 | =======================================================================================================
--------------------------------------------------------------------------------
/src/net/proselyte/basepatterns/behavioral/chain/EmailNotifier.java:
--------------------------------------------------------------------------------
1 | package net.proselyte.basepatterns.behavioral.chain;
2 |
3 | public class EmailNotifier extends Notifier {
4 |
5 | public EmailNotifier(int priority) {
6 | super(priority);
7 | }
8 |
9 | @Override
10 | public void write(String message) {
11 | System.out.println("Sending email: " + message);
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/src/net/proselyte/basepatterns/behavioral/chain/Notifier.java:
--------------------------------------------------------------------------------
1 | package net.proselyte.basepatterns.behavioral.chain;
2 |
3 | public abstract class Notifier {
4 | private int priority;
5 | private Notifier nextNotifier;
6 |
7 | public Notifier(int priority) {
8 | this.priority = priority;
9 | }
10 |
11 | public void setNextNotifier(Notifier nextNotifier) {
12 | this.nextNotifier = nextNotifier;
13 | }
14 |
15 | public void notifyManager(String message, int level) {
16 | if (level >= priority) {
17 | write(message);
18 | }
19 | if (nextNotifier != null) {
20 | nextNotifier.notifyManager(message, level);
21 | }
22 | }
23 |
24 | public abstract void write(String message);
25 | }
26 |
--------------------------------------------------------------------------------
/src/net/proselyte/basepatterns/behavioral/chain/Priority.java:
--------------------------------------------------------------------------------
1 | package net.proselyte.basepatterns.behavioral.chain;
2 |
3 | public class Priority {
4 | public static final int ROUTINE = 1;
5 | public static final int IMPORTANT = 2;
6 | public static final int ASAP = 3;
7 | }
8 |
--------------------------------------------------------------------------------
/src/net/proselyte/basepatterns/behavioral/chain/SMSNotifier.java:
--------------------------------------------------------------------------------
1 | package net.proselyte.basepatterns.behavioral.chain;
2 |
3 | public class SMSNotifier extends Notifier {
4 |
5 | public SMSNotifier(int priority) {
6 | super(priority);
7 | }
8 |
9 | @Override
10 | public void write(String message) {
11 | System.out.println("Sending SMS to manager:" + message);
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/src/net/proselyte/basepatterns/behavioral/chain/SimpleReportNotifier.java:
--------------------------------------------------------------------------------
1 | package net.proselyte.basepatterns.behavioral.chain;
2 |
3 | public class SimpleReportNotifier extends Notifier {
4 |
5 | public SimpleReportNotifier(int priority) {
6 | super(priority);
7 | }
8 |
9 | @Override
10 | public void write(String message) {
11 | System.out.println("Notifying using simple report: " + message);
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/src/net/proselyte/basepatterns/behavioral/command/Command.java:
--------------------------------------------------------------------------------
1 | package net.proselyte.basepatterns.behavioral.command;
2 |
3 | public interface Command {
4 | public void execute();
5 | }
6 |
--------------------------------------------------------------------------------
/src/net/proselyte/basepatterns/behavioral/command/Command.txt:
--------------------------------------------------------------------------------
1 | Шаблон: Команда (Command)
2 | =======================================================================================================
3 | Цель:
4 |
5 | Инкапсулирование запроса в объект.
6 |
7 | =======================================================================================================
8 |
9 | Для чего используется:
10 |
11 | Чтобы задать параметры клиентов для обработки определённых запросов, создание очереди из этих запросов
12 | или их контроля и поддержки отмены операций.
13 |
14 | =======================================================================================================
15 | Пример использования:
16 |
17 | - параметризация объектов выполняемым дейтсвием;
18 | - определять запрос, ставить его в очередь или выполнять его в разное время
19 |
20 | =======================================================================================================
--------------------------------------------------------------------------------
/src/net/proselyte/basepatterns/behavioral/command/Database.java:
--------------------------------------------------------------------------------
1 | package net.proselyte.basepatterns.behavioral.command;
2 |
3 | public class Database {
4 | public void insert(){
5 | System.out.println("Inserting record...");
6 | }
7 |
8 | public void update(){
9 | System.out.println("Updating record...");
10 | }
11 |
12 | public void select(){
13 | System.out.println("Reading record...");
14 | }
15 |
16 | public void delete(){
17 | System.out.println("Deleting record...");
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/src/net/proselyte/basepatterns/behavioral/command/DatabaseRunner.java:
--------------------------------------------------------------------------------
1 | package net.proselyte.basepatterns.behavioral.command;
2 |
3 | public class DatabaseRunner {
4 | public static void main(String[] args) {
5 | Database database = new Database();
6 |
7 | Developer developer = new Developer(
8 | new InsertCommand(database),
9 | new UpdateCommand(database),
10 | new SelectCommand(database),
11 | new DeleteCommand(database)
12 | );
13 |
14 | developer.insertRecord();
15 | developer.updateRecord();
16 | developer.selectRecord();
17 | developer.deleteRecord();
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/src/net/proselyte/basepatterns/behavioral/command/DeleteCommand.java:
--------------------------------------------------------------------------------
1 | package net.proselyte.basepatterns.behavioral.command;
2 |
3 | public class DeleteCommand implements Command {
4 | Database database;
5 |
6 | public DeleteCommand(Database database) {
7 | this.database = database;
8 | }
9 |
10 | @Override
11 | public void execute() {
12 | database.delete();
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/src/net/proselyte/basepatterns/behavioral/command/Developer.java:
--------------------------------------------------------------------------------
1 | package net.proselyte.basepatterns.behavioral.command;
2 |
3 | public class Developer {
4 | Command insert;
5 | Command update;
6 | Command select;
7 | Command delete;
8 |
9 | public Developer(Command insert, Command update, Command select, Command delete) {
10 | this.insert = insert;
11 | this.update = update;
12 | this.select = select;
13 | this.delete = delete;
14 | }
15 |
16 | public void insertRecord(){
17 | insert.execute();
18 | }
19 |
20 | public void updateRecord(){
21 | update.execute();
22 | }
23 |
24 | public void selectRecord(){
25 | select.execute();
26 | }
27 |
28 | public void deleteRecord(){
29 | delete.execute();
30 | }
31 | }
32 |
--------------------------------------------------------------------------------
/src/net/proselyte/basepatterns/behavioral/command/InsertCommand.java:
--------------------------------------------------------------------------------
1 | package net.proselyte.basepatterns.behavioral.command;
2 |
3 | public class InsertCommand implements Command {
4 | Database database;
5 |
6 | public InsertCommand(Database database) {
7 | this.database = database;
8 | }
9 |
10 | @Override
11 | public void execute() {
12 | database.insert();
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/src/net/proselyte/basepatterns/behavioral/command/SelectCommand.java:
--------------------------------------------------------------------------------
1 | package net.proselyte.basepatterns.behavioral.command;
2 |
3 | public class SelectCommand implements Command {
4 | Database database;
5 |
6 | public SelectCommand(Database database) {
7 | this.database = database;
8 | }
9 |
10 | @Override
11 | public void execute() {
12 | database.select();
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/src/net/proselyte/basepatterns/behavioral/command/UpdateCommand.java:
--------------------------------------------------------------------------------
1 | package net.proselyte.basepatterns.behavioral.command;
2 |
3 | public class UpdateCommand implements Command {
4 | Database database;
5 |
6 | public UpdateCommand(Database database) {
7 | this.database = database;
8 | }
9 |
10 | @Override
11 | public void execute() {
12 | database.update();
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/src/net/proselyte/basepatterns/behavioral/interpreter/AndExpression.java:
--------------------------------------------------------------------------------
1 | package net.proselyte.basepatterns.behavioral.interpreter;
2 |
3 | public class AndExpression implements Expression{
4 | private Expression expression1;
5 | private Expression expression2;
6 |
7 | public AndExpression(Expression expression1, Expression expression2) {
8 | this.expression1 = expression1;
9 | this.expression2 = expression2;
10 | }
11 |
12 | @Override
13 | public boolean interpret(String context) {
14 | return expression1.interpret(context) && expression2.interpret(context);
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/src/net/proselyte/basepatterns/behavioral/interpreter/Expression.java:
--------------------------------------------------------------------------------
1 | package net.proselyte.basepatterns.behavioral.interpreter;
2 |
3 | public interface Expression {
4 | public boolean interpret(String context);
5 | }
6 |
--------------------------------------------------------------------------------
/src/net/proselyte/basepatterns/behavioral/interpreter/Interpreter.txt:
--------------------------------------------------------------------------------
1 | Шаблон: Интерпретатор (Interpreter)
2 | =======================================================================================================
3 | Цель:
4 |
5 | Определение представления грамматики объекта
6 |
7 | =======================================================================================================
8 |
9 | Для чего используется:
10 |
11 | Используется для определения представления грамматики заданного языка и интерпретации его предложений
12 |
13 | =======================================================================================================
14 | Пример использования:
15 |
16 | - упрощение иерархии классов с помощью интерпретирования.
17 |
18 | =======================================================================================================
--------------------------------------------------------------------------------
/src/net/proselyte/basepatterns/behavioral/interpreter/InterpreterRunner.java:
--------------------------------------------------------------------------------
1 | package net.proselyte.basepatterns.behavioral.interpreter;
2 |
3 | public class InterpreterRunner {
4 | public static void main(String[] args) {
5 | Expression isJava = getJavaExpression();
6 | Expression isJavaEEDeveloper = getJavaEEExpression();
7 |
8 | System.out.println("Does developer knows Java Core: " + isJava.interpret("Java Core"));
9 | System.out.println("Does developer knows Java EE: " + isJavaEEDeveloper.interpret("Java Spring"));
10 | }
11 |
12 | public static Expression getJavaExpression() {
13 | Expression java = new TerminalExpression("Java");
14 | Expression javaCore = new TerminalExpression("Java Core");
15 |
16 | return new OrExpression(java, javaCore);
17 | }
18 |
19 | public static Expression getJavaEEExpression() {
20 | Expression java = new TerminalExpression("Java");
21 | Expression spring = new TerminalExpression("Spring");
22 |
23 | return new AndExpression(java, spring);
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/src/net/proselyte/basepatterns/behavioral/interpreter/OrExpression.java:
--------------------------------------------------------------------------------
1 | package net.proselyte.basepatterns.behavioral.interpreter;
2 |
3 | public class OrExpression implements Expression{
4 | private Expression expression1;
5 | private Expression expression2;
6 |
7 | public OrExpression(Expression expression1, Expression expression2) {
8 | this.expression1 = expression1;
9 | this.expression2 = expression2;
10 | }
11 |
12 | @Override
13 | public boolean interpret(String context) {
14 | return expression1.interpret(context) || expression2.interpret(context);
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/src/net/proselyte/basepatterns/behavioral/interpreter/TerminalExpression.java:
--------------------------------------------------------------------------------
1 | package net.proselyte.basepatterns.behavioral.interpreter;
2 |
3 | public class TerminalExpression implements Expression {
4 | private String data;
5 |
6 | public TerminalExpression(String data) {
7 | this.data = data;
8 | }
9 |
10 | @Override
11 | public boolean interpret(String context) {
12 | if (context.contains(data)) {
13 | return true;
14 | }
15 | return false;
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/src/net/proselyte/basepatterns/behavioral/iterator/Collection.java:
--------------------------------------------------------------------------------
1 | package net.proselyte.basepatterns.behavioral.iterator;
2 |
3 | public interface Collection {
4 | Iterator getIterator();
5 | }
6 |
--------------------------------------------------------------------------------
/src/net/proselyte/basepatterns/behavioral/iterator/Iterator.java:
--------------------------------------------------------------------------------
1 | package net.proselyte.basepatterns.behavioral.iterator;
2 |
3 | public interface Iterator {
4 | public boolean hasNext();
5 |
6 | public Object next();
7 | }
8 |
--------------------------------------------------------------------------------
/src/net/proselyte/basepatterns/behavioral/iterator/Iterator.txt:
--------------------------------------------------------------------------------
1 | Шаблон: Итератор (Iterator)
2 | =======================================================================================================
3 | Цель:
4 |
5 | Получение последовательного доступа ко всем элементам составного объекта.
6 |
7 | =======================================================================================================
8 |
9 | Для чего используется:
10 |
11 | Для получения последовательного доступа ко всем элементам составного объекта, скрывая его
12 | внутреннее представление.
13 |
14 | =======================================================================================================
15 | Пример использования:
16 |
17 | - различные виды обхода составного объекта;
18 | - упрощённый доступ к составному объекту.
19 |
20 | =======================================================================================================
--------------------------------------------------------------------------------
/src/net/proselyte/basepatterns/behavioral/iterator/JavaDeveloper.java:
--------------------------------------------------------------------------------
1 | package net.proselyte.basepatterns.behavioral.iterator;
2 |
3 | public class JavaDeveloper implements Collection {
4 | private String name;
5 | private String[] skills;
6 |
7 | public JavaDeveloper(String name, String[] skills) {
8 | this.name = name;
9 | this.skills = skills;
10 | }
11 |
12 | public String getName() {
13 | return name;
14 | }
15 |
16 | public void setName(String name) {
17 | this.name = name;
18 | }
19 |
20 | public String[] getSkills() {
21 | return skills;
22 | }
23 |
24 | public void setSkills(String[] skills) {
25 | this.skills = skills;
26 | }
27 |
28 | @Override
29 | public Iterator getIterator() {
30 | return new SkillIterator();
31 | }
32 |
33 | private class SkillIterator implements Iterator {
34 | int index;
35 |
36 | @Override
37 | public boolean hasNext() {
38 | if (index < skills.length) {
39 | return true;
40 | }
41 | return false;
42 | }
43 |
44 | @Override
45 | public Object next() {
46 | return skills[index++];
47 | }
48 | }
49 | }
50 |
--------------------------------------------------------------------------------
/src/net/proselyte/basepatterns/behavioral/iterator/JavaDeveloperRunner.java:
--------------------------------------------------------------------------------
1 | package net.proselyte.basepatterns.behavioral.iterator;
2 |
3 | public class JavaDeveloperRunner {
4 | public static void main(String[] args) {
5 | String[] skills = {"Java", "Spring", "Hibernate", "Maven", "PostgreSQL"};
6 |
7 | JavaDeveloper javaDeveloper = new JavaDeveloper("Eugene Suleiamnov", skills);
8 |
9 | Iterator iterator = javaDeveloper.getIterator();
10 | System.out.println("Developer: " + javaDeveloper.getName());
11 | System.out.println("Skills: ");
12 |
13 | while (iterator.hasNext()) {
14 | System.out.print(iterator.next().toString() + " ");
15 | }
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/src/net/proselyte/basepatterns/behavioral/mediator/Admin.java:
--------------------------------------------------------------------------------
1 | package net.proselyte.basepatterns.behavioral.mediator;
2 |
3 | public class Admin implements User {
4 | Chat chat;
5 | String name;
6 |
7 | public Admin(Chat chat, String name) {
8 | this.chat = chat;
9 | this.name = name;
10 | }
11 |
12 | public String getName() {
13 | return name;
14 | }
15 |
16 | public void setName(String name) {
17 | this.name = name;
18 | }
19 |
20 | @Override
21 | public void sendMessage(String message) {
22 | chat.sendMessage(message, this);
23 | }
24 |
25 | @Override
26 | public void getMessage(String message) {
27 | System.out.println(this.name + " receiving message: " + message + ".");
28 | }
29 | }
30 |
--------------------------------------------------------------------------------
/src/net/proselyte/basepatterns/behavioral/mediator/Chat.java:
--------------------------------------------------------------------------------
1 | package net.proselyte.basepatterns.behavioral.mediator;
2 |
3 | public interface Chat {
4 | public void sendMessage(String message, User user);
5 | }
6 |
--------------------------------------------------------------------------------
/src/net/proselyte/basepatterns/behavioral/mediator/Mediator.txt:
--------------------------------------------------------------------------------
1 | Шаблон: Посредник (Mediator)
2 | =======================================================================================================
3 | Цель:
4 |
5 | Инкапсуляция способа взаимодейтсвия множества объектов
6 |
7 | =======================================================================================================
8 |
9 | Для чего используется:
10 |
11 | Для определения объекта, который инкапсулирует способ взаимодействия множества объектов и обеспечения
12 | слабой связи между этими объектами.
13 |
14 | =======================================================================================================
15 | Пример использования:
16 |
17 | - связи между объектами сложны и чётко определены;
18 | - нельзя повторно использовать объект, так как он обменивается информацией с другими объектами;
19 | - поведение, распределённое между несколькими классами должно легко настраиваться без создания
20 | подклассов.
21 |
22 | =======================================================================================================
--------------------------------------------------------------------------------
/src/net/proselyte/basepatterns/behavioral/mediator/SimpleChatRunner.java:
--------------------------------------------------------------------------------
1 | package net.proselyte.basepatterns.behavioral.mediator;
2 |
3 | public class SimpleChatRunner {
4 | public static void main(String[] args) {
5 | SimpleTextChat chat = new SimpleTextChat();
6 |
7 | User admin = new Admin(chat, "Admin");
8 | User user1 = new SimpleUser(chat, "User 1");
9 | User user2 = new SimpleUser(chat, "User 2");
10 |
11 | chat.setAdmin(admin);
12 | chat.addUserToChat(user1);
13 | chat.addUserToChat(user2);
14 |
15 | user1.sendMessage("Hello, I am User 1!!!");
16 | admin.sendMessage("Roger that. I am admin!!!");
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/src/net/proselyte/basepatterns/behavioral/mediator/SimpleTextChat.java:
--------------------------------------------------------------------------------
1 | package net.proselyte.basepatterns.behavioral.mediator;
2 |
3 | import java.util.ArrayList;
4 | import java.util.List;
5 |
6 | public class SimpleTextChat implements Chat {
7 | User admin;
8 | List users = new ArrayList<>();
9 |
10 | public void setAdmin(User admin) {
11 | this.admin = admin;
12 | }
13 |
14 | public void addUserToChat(User user) {
15 | this.users.add(user);
16 | }
17 |
18 | @Override
19 | public void sendMessage(String message, User user) {
20 | for (User u : users) {
21 | if (u != user) {
22 | u.getMessage(message);
23 | }
24 | }
25 | admin.getMessage(message);
26 | }
27 | }
28 |
--------------------------------------------------------------------------------
/src/net/proselyte/basepatterns/behavioral/mediator/SimpleUser.java:
--------------------------------------------------------------------------------
1 | package net.proselyte.basepatterns.behavioral.mediator;
2 |
3 | public class SimpleUser implements User {
4 | Chat chat;
5 | String name;
6 |
7 | public SimpleUser(Chat chat, String name) {
8 | this.chat = chat;
9 | this.name = name;
10 | }
11 |
12 | public String getName() {
13 | return name;
14 | }
15 |
16 | public void setName(String name) {
17 | this.name = name;
18 | }
19 |
20 | @Override
21 | public void sendMessage(String message) {
22 | chat.sendMessage(message, this);
23 | }
24 |
25 | @Override
26 | public void getMessage(String message) {
27 | System.out.println(this.name + " receiving message: " + message + ".");
28 | }
29 | }
30 |
--------------------------------------------------------------------------------
/src/net/proselyte/basepatterns/behavioral/mediator/User.java:
--------------------------------------------------------------------------------
1 | package net.proselyte.basepatterns.behavioral.mediator;
2 |
3 | public interface User {
4 | public void sendMessage(String message);
5 |
6 | public void getMessage(String message);
7 | }
8 |
--------------------------------------------------------------------------------
/src/net/proselyte/basepatterns/behavioral/memento/GithubRepo.java:
--------------------------------------------------------------------------------
1 | package net.proselyte.basepatterns.behavioral.memento;
2 |
3 | public class GithubRepo {
4 | private Save save;
5 |
6 | public Save getSave() {
7 | return save;
8 | }
9 |
10 | public void setSave(Save save) {
11 | this.save = save;
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/src/net/proselyte/basepatterns/behavioral/memento/Menento.txt:
--------------------------------------------------------------------------------
1 | Шаблон: Хранитель (Memento)
2 | =======================================================================================================
3 | Цель:
4 |
5 | Сохранить внутренне состояние объекта за его пределы.
6 |
7 | =======================================================================================================
8 |
9 | Для чего используется:
10 |
11 | Фиксирование внутреннего состояния объекта за его пределами не нарушая инкапсуляцию
12 | и восстановления объекта в случае необходимости.
13 |
14 | =======================================================================================================
15 | Пример использования:
16 |
17 | - необходимо сохранить текущее состояние объекта или его части и восстановление в будущем, но
18 | прямое получение состояния раскрывает детали реализации и нарушает инкапсуляцию объекта.
19 |
20 | =======================================================================================================
--------------------------------------------------------------------------------
/src/net/proselyte/basepatterns/behavioral/memento/Project.java:
--------------------------------------------------------------------------------
1 | package net.proselyte.basepatterns.behavioral.memento;
2 |
3 | import java.util.Date;
4 |
5 | public class Project {
6 | private String version;
7 | private Date date;
8 |
9 | public void setVersionAndDate(String version) {
10 | this.version = version;
11 | this.date = new Date();
12 | }
13 |
14 | public Save save() {
15 | return new Save(version);
16 | }
17 |
18 | public void load(Save save) {
19 | version = save.getVersion();
20 | date = save.getDate();
21 | }
22 |
23 | @Override
24 | public String toString() {
25 | return "Project:\n" +
26 | "\nVersion: " + version +
27 | "\nDate: " + date + "\n";
28 | }
29 | }
30 |
--------------------------------------------------------------------------------
/src/net/proselyte/basepatterns/behavioral/memento/Save.java:
--------------------------------------------------------------------------------
1 | package net.proselyte.basepatterns.behavioral.memento;
2 |
3 | import java.util.Date;
4 |
5 | public class Save {
6 | private final String version;
7 | private final Date date;
8 |
9 | public Save(String version) {
10 | this.version = version;
11 | this.date = new Date();
12 | }
13 |
14 | public String getVersion() {
15 | return version;
16 | }
17 |
18 | public Date getDate() {
19 | return date;
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/src/net/proselyte/basepatterns/behavioral/memento/SaveProjectRunner.java:
--------------------------------------------------------------------------------
1 | package net.proselyte.basepatterns.behavioral.memento;
2 |
3 | public class SaveProjectRunner {
4 | public static void main(String[] args) throws InterruptedException {
5 | Project project = new Project();
6 | GithubRepo github = new GithubRepo();
7 |
8 | System.out.println("Creating new project. Version 1.0");
9 | project.setVersionAndDate("Version 1.0");
10 |
11 | System.out.println(project);
12 |
13 | System.out.println("Saving current version to github...");
14 | github.setSave(project.save());
15 |
16 | System.out.println("Updating project to Version 1.1");
17 |
18 | System.out.println("Writing poor code...");
19 | Thread.sleep(5000);
20 | project.setVersionAndDate("Version 1.1.");
21 |
22 | System.out.println(project);
23 |
24 | System.out.println("Something went wrong...");
25 |
26 | System.out.println("Rolling back to Version 1.0");
27 | project.load(github.getSave());
28 |
29 | System.out.println("Project after rollback:");
30 | System.out.println(project);
31 | }
32 | }
33 |
--------------------------------------------------------------------------------
/src/net/proselyte/basepatterns/behavioral/observer/JavaDeveloperJobSite.java:
--------------------------------------------------------------------------------
1 | package net.proselyte.basepatterns.behavioral.observer;
2 |
3 | import java.util.ArrayList;
4 | import java.util.List;
5 |
6 | public class JavaDeveloperJobSite implements Observed {
7 | List vacancies = new ArrayList<>();
8 |
9 | List subscribers = new ArrayList<>();
10 |
11 | public void addVacancy(String vacancy) {
12 | this.vacancies.add(vacancy);
13 | notifyObservers();
14 | }
15 |
16 | public void removeVacancy(String vacancy) {
17 | this.vacancies.remove(vacancy);
18 | notifyObservers();
19 | }
20 |
21 | @Override
22 | public void addObserver(Observer observer) {
23 | this.subscribers.add(observer);
24 | }
25 |
26 | @Override
27 | public void removeObserver(Observer observer) {
28 | this.subscribers.remove(observer);
29 | }
30 |
31 | @Override
32 | public void notifyObservers() {
33 | for (Observer observer : subscribers) {
34 | observer.handleEvent(this.vacancies);
35 | }
36 | }
37 | }
38 |
--------------------------------------------------------------------------------
/src/net/proselyte/basepatterns/behavioral/observer/JobSearch.java:
--------------------------------------------------------------------------------
1 | package net.proselyte.basepatterns.behavioral.observer;
2 |
3 | public class JobSearch {
4 | public static void main(String[] args) {
5 | JavaDeveloperJobSite jobSite = new JavaDeveloperJobSite();
6 |
7 | jobSite.addVacancy("First Java Position");
8 | jobSite.addVacancy("Second Java Position");
9 |
10 | Observer firstSubscriber = new Subscriber("Eugene Suleimanov");
11 | Observer secondSubscriber = new Subscriber("Peter Romanenko");
12 |
13 | jobSite.addObserver(firstSubscriber);
14 | jobSite.addObserver(secondSubscriber);
15 |
16 | jobSite.addVacancy("Third Java Position");
17 |
18 | jobSite.removeVacancy("First Java Position");
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/src/net/proselyte/basepatterns/behavioral/observer/Observed.java:
--------------------------------------------------------------------------------
1 | package net.proselyte.basepatterns.behavioral.observer;
2 |
3 | public interface Observed {
4 | public void addObserver(Observer observer);
5 |
6 | public void removeObserver(Observer observer);
7 |
8 | public void notifyObservers();
9 | }
10 |
--------------------------------------------------------------------------------
/src/net/proselyte/basepatterns/behavioral/observer/Observer.java:
--------------------------------------------------------------------------------
1 | package net.proselyte.basepatterns.behavioral.observer;
2 |
3 | import java.util.List;
4 |
5 | public interface Observer {
6 | public void handleEvent(List vacancies);
7 | }
8 |
--------------------------------------------------------------------------------
/src/net/proselyte/basepatterns/behavioral/observer/Observer.txt:
--------------------------------------------------------------------------------
1 | Шаблон: Наблюдатель (Observer)
2 | =======================================================================================================
3 | Цель:
4 |
5 | Определение зависимости "один ко многим" между объектами.
6 |
7 | =======================================================================================================
8 |
9 | Для чего используется:
10 |
11 | Определение зависимости "один ко многим" между объектами таким образом, что при
12 | изменении состояния одного объекта все зависящие от него объекты были уведомлены
13 | об этом и обновились.
14 |
15 | =======================================================================================================
16 | Пример использования:
17 |
18 | - когда у модели имеются два аспекта, один из которых зависит от другого. Инкапсулирование
19 | этих аспектов в разные классы позволяют использовать их независимо друг от друга;
20 | - когда один объект должен оповещать другие и не делать предположений об этих объектах;
21 | - ослабление связи между объектами.
22 |
23 | =======================================================================================================
--------------------------------------------------------------------------------
/src/net/proselyte/basepatterns/behavioral/observer/Subscriber.java:
--------------------------------------------------------------------------------
1 | package net.proselyte.basepatterns.behavioral.observer;
2 |
3 | import java.util.List;
4 |
5 | public class Subscriber implements Observer {
6 | String name;
7 |
8 | public Subscriber(String name) {
9 | this.name = name;
10 | }
11 |
12 | @Override
13 | public void handleEvent(List vacancies) {
14 | System.out.println("Dear " + name + "\nWe have some changes in vacancies:\n" + vacancies +
15 | "\n===============================================\n");
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/src/net/proselyte/basepatterns/behavioral/state/Activity.java:
--------------------------------------------------------------------------------
1 | package net.proselyte.basepatterns.behavioral.state;
2 |
3 | public interface Activity {
4 | public void justDoIt();
5 | }
6 |
--------------------------------------------------------------------------------
/src/net/proselyte/basepatterns/behavioral/state/Coding.java:
--------------------------------------------------------------------------------
1 | package net.proselyte.basepatterns.behavioral.state;
2 |
3 | public class Coding implements Activity {
4 | @Override
5 | public void justDoIt() {
6 | System.out.println("Writing code...");
7 | }
8 | }
9 |
--------------------------------------------------------------------------------
/src/net/proselyte/basepatterns/behavioral/state/Developer.java:
--------------------------------------------------------------------------------
1 | package net.proselyte.basepatterns.behavioral.state;
2 |
3 | public class Developer {
4 | Activity activity;
5 |
6 | public void setActivity(Activity activity) {
7 | this.activity = activity;
8 | }
9 |
10 | public void changeActivity() {
11 | if (activity instanceof Sleeping) {
12 | setActivity(new Training());
13 | } else if (activity instanceof Training) {
14 | setActivity(new Coding());
15 | } else if (activity instanceof Coding) {
16 | setActivity(new Reading());
17 | } else if (activity instanceof Reading) {
18 | setActivity(new Sleeping());
19 | }
20 | }
21 |
22 | public void justDoIt() {
23 | activity.justDoIt();
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/src/net/proselyte/basepatterns/behavioral/state/DeveloperDay.java:
--------------------------------------------------------------------------------
1 | package net.proselyte.basepatterns.behavioral.state;
2 |
3 | public class DeveloperDay {
4 | public static void main(String[] args) {
5 | Activity activity = new Sleeping();
6 | Developer developer = new Developer();
7 |
8 | developer.setActivity(activity);
9 |
10 | for (int i = 0; i < 10; i++) {
11 | developer.justDoIt();
12 | developer.changeActivity();
13 | }
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/src/net/proselyte/basepatterns/behavioral/state/Reading.java:
--------------------------------------------------------------------------------
1 | package net.proselyte.basepatterns.behavioral.state;
2 |
3 | public class Reading implements Activity {
4 | @Override
5 | public void justDoIt() {
6 | System.out.println("Reading book...");
7 | }
8 | }
9 |
--------------------------------------------------------------------------------
/src/net/proselyte/basepatterns/behavioral/state/Sleeping.java:
--------------------------------------------------------------------------------
1 | package net.proselyte.basepatterns.behavioral.state;
2 |
3 | public class Sleeping implements Activity {
4 | @Override
5 | public void justDoIt() {
6 | System.out.println("Sleeping...");
7 | }
8 | }
9 |
--------------------------------------------------------------------------------
/src/net/proselyte/basepatterns/behavioral/state/State.txt:
--------------------------------------------------------------------------------
1 | Шаблон: Состояние (State)
2 | =======================================================================================================
3 | Цель:
4 |
5 | Управление поведением объекта в зависимости от состояния.
6 |
7 | =======================================================================================================
8 |
9 | Для чего используется:
10 |
11 | Позволяет нам управлять поведением объекта в зависимости от внутреннего состояние объекта.
12 |
13 | =======================================================================================================
14 | Пример использования:
15 |
16 | - поведение объекта зависит от его состояние и изменяется во время выполнения;
17 | - когда встречается большое количество условных операторов, когда выбор ветви
18 | зависит от состояния объекта.
19 |
20 | =======================================================================================================
--------------------------------------------------------------------------------
/src/net/proselyte/basepatterns/behavioral/state/Training.java:
--------------------------------------------------------------------------------
1 | package net.proselyte.basepatterns.behavioral.state;
2 |
3 | public class Training implements Activity {
4 | @Override
5 | public void justDoIt() {
6 | System.out.println("Training...");
7 | }
8 | }
9 |
--------------------------------------------------------------------------------
/src/net/proselyte/basepatterns/behavioral/strategy/Activity.java:
--------------------------------------------------------------------------------
1 | package net.proselyte.basepatterns.behavioral.strategy;
2 |
3 | public interface Activity {
4 | public void justDoIt();
5 | }
6 |
--------------------------------------------------------------------------------
/src/net/proselyte/basepatterns/behavioral/strategy/Coding.java:
--------------------------------------------------------------------------------
1 | package net.proselyte.basepatterns.behavioral.strategy;
2 |
3 | class Coding implements Activity {
4 | @Override
5 | public void justDoIt() {
6 | System.out.println("Coding...");
7 | }
8 | }
9 |
--------------------------------------------------------------------------------
/src/net/proselyte/basepatterns/behavioral/strategy/Developer.java:
--------------------------------------------------------------------------------
1 | package net.proselyte.basepatterns.behavioral.strategy;
2 |
3 | public class Developer {
4 | Activity activity;
5 |
6 | public void setActivity(Activity activity) {
7 | this.activity = activity;
8 | }
9 |
10 | public void executeActivity() {
11 | activity.justDoIt();
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/src/net/proselyte/basepatterns/behavioral/strategy/DeveloperRunner.java:
--------------------------------------------------------------------------------
1 | package net.proselyte.basepatterns.behavioral.strategy;
2 |
3 | public class DeveloperRunner {
4 | public static void main(String[] args) {
5 | Developer developer = new Developer();
6 |
7 | developer.setActivity(new Sleeping());
8 | developer.executeActivity();
9 |
10 | developer.setActivity(new Training());
11 | developer.executeActivity();
12 |
13 | developer.setActivity(new Coding());
14 | developer.executeActivity();
15 |
16 | developer.setActivity(new Reading());
17 | developer.executeActivity();
18 |
19 | developer.setActivity(new Sleeping());
20 | developer.executeActivity();
21 | }
22 | }
--------------------------------------------------------------------------------
/src/net/proselyte/basepatterns/behavioral/strategy/Reading.java:
--------------------------------------------------------------------------------
1 | package net.proselyte.basepatterns.behavioral.strategy;
2 |
3 | public class Reading implements Activity {
4 | @Override
5 | public void justDoIt() {
6 | System.out.println("Reading...");
7 | }
8 | }
9 |
--------------------------------------------------------------------------------
/src/net/proselyte/basepatterns/behavioral/strategy/Sleeping.java:
--------------------------------------------------------------------------------
1 | package net.proselyte.basepatterns.behavioral.strategy;
2 |
3 | public class Sleeping implements Activity {
4 | @Override
5 | public void justDoIt() {
6 | System.out.println("Sleeping...");
7 | }
8 | }
9 |
--------------------------------------------------------------------------------
/src/net/proselyte/basepatterns/behavioral/strategy/Strategy.txt:
--------------------------------------------------------------------------------
1 | Шаблон: Стратегия (Strategy)
2 | =======================================================================================================
3 | Цель:
4 |
5 | Взаимозаменяемость семейства классов
6 |
7 | =======================================================================================================
8 |
9 | Для чего используется:
10 |
11 | Опредление семейства классов, инкапсулирование каждого из них и организация
12 | их взаимозаменяемости.
13 |
14 | =======================================================================================================
15 | Пример использования:
16 |
17 | - есть несколько родственных классов, которые отличаются поведением;
18 | - необходимо иметь несколько вариантов поведения;
19 | - в классе есть данные, о которых не должен знать клиент;
20 | - с помощью условных операторов в классе определено большое количество возможных поведений.
21 |
22 | =======================================================================================================
--------------------------------------------------------------------------------
/src/net/proselyte/basepatterns/behavioral/strategy/Training.java:
--------------------------------------------------------------------------------
1 | package net.proselyte.basepatterns.behavioral.strategy;
2 |
3 | public class Training implements Activity {
4 | @Override
5 | public void justDoIt() {
6 | System.out.println("Training...");
7 | }
8 | }
9 |
--------------------------------------------------------------------------------
/src/net/proselyte/basepatterns/behavioral/template/NewsPage.java:
--------------------------------------------------------------------------------
1 | package net.proselyte.basepatterns.behavioral.template;
2 |
3 | public class NewsPage extends WebsiteTemplate {
4 | @Override
5 | public void showPageContent() {
6 | System.out.println("News");
7 | }
8 | }
9 |
--------------------------------------------------------------------------------
/src/net/proselyte/basepatterns/behavioral/template/Template.txt:
--------------------------------------------------------------------------------
1 | Шаблон: Шаблонный метод (Template method)
2 | =======================================================================================================
3 | Цель:
4 |
5 | Определение основы класса и создание возможности подклассам переопределять его части.
6 |
7 | =======================================================================================================
8 |
9 | Для чего используется:
10 |
11 | Определяет основу класса и позволяет подклассам переопределять некоторые его части
12 | не изменяя его структуру в целом.
13 |
14 | =======================================================================================================
15 | Пример использования:
16 |
17 | - однократное использование различных частей класса, оставляя реализацию изменяющегося
18 | поведения на усмотрение подклассов;
19 | - вычленение и локализация общего для всех подклассов поведения в родительском;
20 | - управление расширениями подклассов.
21 |
22 | =======================================================================================================
--------------------------------------------------------------------------------
/src/net/proselyte/basepatterns/behavioral/template/WebsiteRunner.java:
--------------------------------------------------------------------------------
1 | package net.proselyte.basepatterns.behavioral.template;
2 |
3 | public class WebsiteRunner {
4 | public static void main(String[] args) {
5 | WebsiteTemplate welcomePage = new WelcomePage();
6 | WebsiteTemplate newsPage = new NewsPage();
7 |
8 | welcomePage.showPage();
9 |
10 | System.out.println("\n================================\n");
11 |
12 | newsPage.showPage();
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/src/net/proselyte/basepatterns/behavioral/template/WebsiteTemplate.java:
--------------------------------------------------------------------------------
1 | package net.proselyte.basepatterns.behavioral.template;
2 |
3 | public abstract class WebsiteTemplate {
4 | public void showPage() {
5 | System.out.println("Header");
6 | showPageContent();
7 | System.out.println("Footer");
8 | }
9 |
10 | public abstract void showPageContent();
11 | }
12 |
--------------------------------------------------------------------------------
/src/net/proselyte/basepatterns/behavioral/template/WelcomePage.java:
--------------------------------------------------------------------------------
1 | package net.proselyte.basepatterns.behavioral.template;
2 |
3 | public class WelcomePage extends WebsiteTemplate{
4 |
5 | @Override
6 | public void showPageContent() {
7 | System.out.println("Welcome");
8 | }
9 | }
10 |
--------------------------------------------------------------------------------
/src/net/proselyte/basepatterns/behavioral/visitor/Database.java:
--------------------------------------------------------------------------------
1 | package net.proselyte.basepatterns.behavioral.visitor;
2 |
3 | public class Database implements ProjectElement{
4 | @Override
5 | public void beWritten(Developer developer) {
6 | developer.create(this);
7 | }
8 | }
9 |
--------------------------------------------------------------------------------
/src/net/proselyte/basepatterns/behavioral/visitor/Developer.java:
--------------------------------------------------------------------------------
1 | package net.proselyte.basepatterns.behavioral.visitor;
2 |
3 | public interface Developer {
4 | public void create(ProjectClass projectClass);
5 |
6 | public void create(Database database);
7 |
8 | public void create(Test test);
9 | }
10 |
--------------------------------------------------------------------------------
/src/net/proselyte/basepatterns/behavioral/visitor/JuniorDeveloper.java:
--------------------------------------------------------------------------------
1 | package net.proselyte.basepatterns.behavioral.visitor;
2 |
3 | public class JuniorDeveloper implements Developer {
4 | @Override
5 | public void create(ProjectClass projectClass) {
6 | System.out.println("Writing poor class...");
7 | }
8 |
9 | @Override
10 | public void create(Database database) {
11 | System.out.println("Drop database...");
12 | }
13 |
14 | @Override
15 | public void create(Test test) {
16 | System.out.println("Creating not reliable test...");
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/src/net/proselyte/basepatterns/behavioral/visitor/Project.java:
--------------------------------------------------------------------------------
1 | package net.proselyte.basepatterns.behavioral.visitor;
2 |
3 | public class Project implements ProjectElement {
4 | ProjectElement[] projectElements;
5 |
6 | public Project() {
7 | this.projectElements = new ProjectElement[]{
8 | new ProjectClass(),
9 | new Database(),
10 | new Test()
11 | };
12 | }
13 |
14 | @Override
15 | public void beWritten(Developer developer) {
16 | for (ProjectElement element : projectElements) {
17 | element.beWritten(developer);
18 | }
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/src/net/proselyte/basepatterns/behavioral/visitor/ProjectClass.java:
--------------------------------------------------------------------------------
1 | package net.proselyte.basepatterns.behavioral.visitor;
2 |
3 | public class ProjectClass implements ProjectElement {
4 | @Override
5 | public void beWritten(Developer developer) {
6 | developer.create(this);
7 | }
8 | }
9 |
--------------------------------------------------------------------------------
/src/net/proselyte/basepatterns/behavioral/visitor/ProjectElement.java:
--------------------------------------------------------------------------------
1 | package net.proselyte.basepatterns.behavioral.visitor;
2 |
3 | public interface ProjectElement {
4 | public void beWritten(Developer developer);
5 | }
6 |
--------------------------------------------------------------------------------
/src/net/proselyte/basepatterns/behavioral/visitor/ProjectRunner.java:
--------------------------------------------------------------------------------
1 | package net.proselyte.basepatterns.behavioral.visitor;
2 |
3 | public class ProjectRunner {
4 | public static void main(String[] args) {
5 | Project project = new Project();
6 |
7 | Developer junior = new JuniorDeveloper();
8 | Developer senior = new SeniorDeveloper();
9 |
10 | System.out.println("Junior in Action...");
11 | project.beWritten(junior);
12 |
13 | System.out.println("\n============================\n");
14 |
15 | System.out.println("Senior in Action...");
16 | project.beWritten(senior);
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/src/net/proselyte/basepatterns/behavioral/visitor/SeniorDeveloper.java:
--------------------------------------------------------------------------------
1 | package net.proselyte.basepatterns.behavioral.visitor;
2 |
3 | public class SeniorDeveloper implements Developer {
4 | @Override
5 | public void create(ProjectClass projectClass) {
6 | System.out.println("Rewriting class after junior...");
7 | }
8 |
9 | @Override
10 | public void create(Database database) {
11 | System.out.println("Fixing database...");
12 | }
13 |
14 | @Override
15 | public void create(Test test) {
16 | System.out.println("Creating reliable test...");
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/src/net/proselyte/basepatterns/behavioral/visitor/Test.java:
--------------------------------------------------------------------------------
1 | package net.proselyte.basepatterns.behavioral.visitor;
2 |
3 | public class Test implements ProjectElement {
4 | @Override
5 | public void beWritten(Developer developer) {
6 | developer.create(this);
7 | }
8 | }
9 |
--------------------------------------------------------------------------------
/src/net/proselyte/basepatterns/behavioral/visitor/Visitor.txt:
--------------------------------------------------------------------------------
1 | Шаблон: Посетитель (Visitor)
2 | =======================================================================================================
3 | Цель:
4 |
5 | Описание действий, которые выполняются с каждым объектом в некоторой структуре
6 |
7 | =======================================================================================================
8 |
9 | Для чего используется:
10 |
11 | Описание операций, которые выполняются с каждым объектом из некоторой структуры.
12 | Позволяет определить новую операцию без изменения классов этих объектов.
13 |
14 | =======================================================================================================
15 | Пример использования:
16 |
17 | - в структуре присутствуют объекты многих классов с различными интерфейсами и нам
18 | необходимо выполнить над ними операции, которые зависят от конкретных классов;
19 | - необходимо выполнять не связанные между собой операции над объектами, которые
20 | входят в состав структуры и мы не хотим добавлять эти операции в классы;
21 | - классы, которые утсанавливают структуру объектов редко изменяются, но часто
22 | добавляются новые операции над этой структурой.
23 |
24 | =======================================================================================================
--------------------------------------------------------------------------------
/src/net/proselyte/basepatterns/creational/abstractfactory/AbstractFactory.txt:
--------------------------------------------------------------------------------
1 | Шаблон: Абстрактная фабрика (Abstract Factory)
2 | =======================================================================================================
3 | Цель:
4 |
5 | Создание интерфейса, для создания множества взаимосвязанных или взаимозависимых объектов, без жёсткой
6 | привязке к конкретным классам.
7 |
8 | =======================================================================================================
9 |
10 | Для чего используется:
11 |
12 | Для создания множеств взаимосвязанных объектов.
13 |
14 | =======================================================================================================
15 | Пример использования:
16 |
17 | - система не должна зависеть от метода создания, компоновки и представления входящих в неё объектов;
18 | - входящие взаимосвязанные объекты должны использоваться вместе;
19 | - система должна конфигурироваться одним из множеств объектов, из которых она состоит;
20 | - нам необходимо предоставить множество объектов, раскрывая только их интерфейсы но не реализацию.
21 |
22 | =======================================================================================================
--------------------------------------------------------------------------------
/src/net/proselyte/basepatterns/creational/abstractfactory/AuctionWebsite.java:
--------------------------------------------------------------------------------
1 | package net.proselyte.basepatterns.creational.abstractfactory;
2 |
3 | import net.proselyte.basepatterns.creational.abstractfactory.website.WebsiteTeamFactory;
4 |
5 | public class AuctionWebsite {
6 | public static void main(String[] args) {
7 | ProjectTeamFactory projectTeamFactory = new WebsiteTeamFactory();
8 | Developer teamLead = projectTeamFactory.getFirstDeveloper();
9 | Developer developer = projectTeamFactory.getSecondDeveloper();
10 | Tester tester = projectTeamFactory.getTester();
11 | ProjectManger projectManger = projectTeamFactory.getProjectManager();
12 |
13 | System.out.println("Creating website project...");
14 | teamLead.writeCode();
15 | developer.writeCode();
16 | tester.testCode();
17 | projectManger.manageProject();
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/src/net/proselyte/basepatterns/creational/abstractfactory/Developer.java:
--------------------------------------------------------------------------------
1 | package net.proselyte.basepatterns.creational.abstractfactory;
2 |
3 | public interface Developer {
4 | void writeCode();
5 | }
6 |
--------------------------------------------------------------------------------
/src/net/proselyte/basepatterns/creational/abstractfactory/ProjectManger.java:
--------------------------------------------------------------------------------
1 | package net.proselyte.basepatterns.creational.abstractfactory;
2 |
3 | public interface ProjectManger {
4 | void manageProject();
5 | }
6 |
--------------------------------------------------------------------------------
/src/net/proselyte/basepatterns/creational/abstractfactory/ProjectTeamFactory.java:
--------------------------------------------------------------------------------
1 | package net.proselyte.basepatterns.creational.abstractfactory;
2 |
3 | public interface ProjectTeamFactory {
4 | Developer getFirstDeveloper();
5 |
6 | Developer getSecondDeveloper();
7 |
8 | Tester getTester();
9 |
10 | ProjectManger getProjectManager();
11 | }
12 |
--------------------------------------------------------------------------------
/src/net/proselyte/basepatterns/creational/abstractfactory/SuperBankSystem.java:
--------------------------------------------------------------------------------
1 | package net.proselyte.basepatterns.creational.abstractfactory;
2 |
3 | import net.proselyte.basepatterns.creational.abstractfactory.banking.BankTeamFactory;
4 |
5 | public class SuperBankSystem {
6 | public static void main(String[] args) {
7 | ProjectTeamFactory projectTeamFactory = new BankTeamFactory();
8 | Developer teamLead = projectTeamFactory.getFirstDeveloper();
9 | Developer developer = projectTeamFactory.getSecondDeveloper();
10 | Tester tester = projectTeamFactory.getTester();
11 | ProjectManger projectManger = projectTeamFactory.getProjectManager();
12 |
13 | System.out.println("Creating banking project...");
14 |
15 | teamLead.writeCode();
16 | developer.writeCode();
17 | tester.testCode();
18 | projectManger.manageProject();
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/src/net/proselyte/basepatterns/creational/abstractfactory/Tester.java:
--------------------------------------------------------------------------------
1 | package net.proselyte.basepatterns.creational.abstractfactory;
2 |
3 | public interface Tester {
4 | void testCode();
5 | }
6 |
--------------------------------------------------------------------------------
/src/net/proselyte/basepatterns/creational/abstractfactory/banking/BankTeamFactory.java:
--------------------------------------------------------------------------------
1 | package net.proselyte.basepatterns.creational.abstractfactory.banking;
2 |
3 | import net.proselyte.basepatterns.creational.abstractfactory.Developer;
4 | import net.proselyte.basepatterns.creational.abstractfactory.ProjectManger;
5 | import net.proselyte.basepatterns.creational.abstractfactory.ProjectTeamFactory;
6 | import net.proselyte.basepatterns.creational.abstractfactory.Tester;
7 |
8 | public class BankTeamFactory implements ProjectTeamFactory{
9 | @Override
10 | public Developer getFirstDeveloper() {
11 | return new JavaDeveloper();
12 | }
13 |
14 | @Override
15 | public Developer getSecondDeveloper() {
16 | return new JavaDeveloper();
17 | }
18 |
19 | @Override
20 | public Tester getTester() {
21 | return new QATester();
22 | }
23 |
24 | @Override
25 | public ProjectManger getProjectManager() {
26 | return new BankingPM();
27 | }
28 | }
29 |
--------------------------------------------------------------------------------
/src/net/proselyte/basepatterns/creational/abstractfactory/banking/BankingPM.java:
--------------------------------------------------------------------------------
1 | package net.proselyte.basepatterns.creational.abstractfactory.banking;
2 |
3 | import net.proselyte.basepatterns.creational.abstractfactory.ProjectManger;
4 |
5 | public class BankingPM implements ProjectManger{
6 | @Override
7 | public void manageProject() {
8 | System.out.println("Banking PM manages banking project...");
9 | }
10 | }
11 |
--------------------------------------------------------------------------------
/src/net/proselyte/basepatterns/creational/abstractfactory/banking/JavaDeveloper.java:
--------------------------------------------------------------------------------
1 | package net.proselyte.basepatterns.creational.abstractfactory.banking;
2 |
3 | import net.proselyte.basepatterns.creational.abstractfactory.Developer;
4 |
5 | public class JavaDeveloper implements Developer{
6 |
7 | @Override
8 | public void writeCode() {
9 | System.out.println("Java developer writes Java code...");
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/src/net/proselyte/basepatterns/creational/abstractfactory/banking/QATester.java:
--------------------------------------------------------------------------------
1 | package net.proselyte.basepatterns.creational.abstractfactory.banking;
2 |
3 | import net.proselyte.basepatterns.creational.abstractfactory.Tester;
4 |
5 | public class QATester implements Tester{
6 | @Override
7 | public void testCode() {
8 | System.out.println("QA tester tests banking project...");
9 | }
10 | }
11 |
--------------------------------------------------------------------------------
/src/net/proselyte/basepatterns/creational/abstractfactory/website/ManualTester.java:
--------------------------------------------------------------------------------
1 | package net.proselyte.basepatterns.creational.abstractfactory.website;
2 |
3 | import net.proselyte.basepatterns.creational.abstractfactory.Tester;
4 |
5 | public class ManualTester implements Tester{
6 | @Override
7 | public void testCode() {
8 | System.out.println("Manual tester tests website...");
9 | }
10 | }
11 |
--------------------------------------------------------------------------------
/src/net/proselyte/basepatterns/creational/abstractfactory/website/PhpDeveloper.java:
--------------------------------------------------------------------------------
1 | package net.proselyte.basepatterns.creational.abstractfactory.website;
2 |
3 | import net.proselyte.basepatterns.creational.abstractfactory.Developer;
4 |
5 | public class PhpDeveloper implements Developer{
6 | @Override
7 | public void writeCode() {
8 | System.out.println("Php developer writes php code...");
9 | }
10 | }
11 |
--------------------------------------------------------------------------------
/src/net/proselyte/basepatterns/creational/abstractfactory/website/WebsitePM.java:
--------------------------------------------------------------------------------
1 | package net.proselyte.basepatterns.creational.abstractfactory.website;
2 |
3 | import net.proselyte.basepatterns.creational.abstractfactory.ProjectManger;
4 |
5 | public class WebsitePM implements ProjectManger{
6 | @Override
7 | public void manageProject() {
8 | System.out.println("Website PM manages website project...");
9 | }
10 | }
11 |
--------------------------------------------------------------------------------
/src/net/proselyte/basepatterns/creational/abstractfactory/website/WebsiteTeamFactory.java:
--------------------------------------------------------------------------------
1 | package net.proselyte.basepatterns.creational.abstractfactory.website;
2 |
3 | import net.proselyte.basepatterns.creational.abstractfactory.Developer;
4 | import net.proselyte.basepatterns.creational.abstractfactory.ProjectManger;
5 | import net.proselyte.basepatterns.creational.abstractfactory.ProjectTeamFactory;
6 | import net.proselyte.basepatterns.creational.abstractfactory.Tester;
7 |
8 | public class WebsiteTeamFactory implements ProjectTeamFactory{
9 | @Override
10 | public Developer getFirstDeveloper() {
11 | return new PhpDeveloper();
12 | }
13 |
14 | @Override
15 | public Developer getSecondDeveloper() {
16 | return new PhpDeveloper();
17 | }
18 |
19 | @Override
20 | public Tester getTester() {
21 | return new ManualTester();
22 | }
23 |
24 | @Override
25 | public ProjectManger getProjectManager() {
26 | return new WebsitePM();
27 | }
28 | }
29 |
--------------------------------------------------------------------------------
/src/net/proselyte/basepatterns/creational/builder/BuildWebsiteRunner.java:
--------------------------------------------------------------------------------
1 | package net.proselyte.basepatterns.creational.builder;
2 |
3 | public class BuildWebsiteRunner {
4 | public static void main(String[] args) {
5 | Director director = new Director();
6 |
7 | director.setBuilder(new EnterpriseWebsiteBuilder());
8 | Website website = director.buildWebsite();
9 |
10 | System.out.println(website);
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/src/net/proselyte/basepatterns/creational/builder/Builder.txt:
--------------------------------------------------------------------------------
1 | Шаблон: Строитель (Builder)
2 | =======================================================================================================
3 | Цель:
4 |
5 | Отделить конструирование сложного объекта от его представления таким образом, чтобы в результате
6 | одного и того же конструирования мы могли получить разные представления.
7 | =======================================================================================================
8 |
9 | Для чего используется:
10 |
11 | Для создания различных объектов из одного набора данных.
12 |
13 | =======================================================================================================
14 | Пример использования:
15 |
16 | - порядок создания сложного объекта не должен зависеть от того, из каких частей состоит объект и
17 | того, как эти объекты взаимосвязаны;
18 | - процесс конструирования объекта должен предоставлять различные представления объекта, который мы
19 | конструируем.
20 | =======================================================================================================
--------------------------------------------------------------------------------
/src/net/proselyte/basepatterns/creational/builder/Cms.java:
--------------------------------------------------------------------------------
1 | package net.proselyte.basepatterns.creational.builder;
2 |
3 | public enum Cms {
4 | WORDPRESS, ALIFRESCO;
5 | }
6 |
--------------------------------------------------------------------------------
/src/net/proselyte/basepatterns/creational/builder/Director.java:
--------------------------------------------------------------------------------
1 | package net.proselyte.basepatterns.creational.builder;
2 |
3 | public class Director {
4 | WebsiteBuilder builder;
5 |
6 | public void setBuilder(WebsiteBuilder builder) {
7 | this.builder = builder;
8 | }
9 |
10 | Website buildWebsite() {
11 | builder.createWebsite();
12 | builder.buildName();
13 | builder.buildCms();
14 | builder.buildPrice();
15 |
16 | Website website = builder.getWebsite();
17 |
18 | return website;
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/src/net/proselyte/basepatterns/creational/builder/EnterpriseWebsiteBuilder.java:
--------------------------------------------------------------------------------
1 | package net.proselyte.basepatterns.creational.builder;
2 |
3 | public class EnterpriseWebsiteBuilder extends WebsiteBuilder {
4 | @Override
5 | void buildName() {
6 | website.setName("Enterprise web site");
7 | }
8 |
9 | @Override
10 | void buildCms() {
11 | website.setCms(Cms.ALIFRESCO);
12 | }
13 |
14 | @Override
15 | void buildPrice() {
16 | website.setPrice(10000);
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/src/net/proselyte/basepatterns/creational/builder/VisitCardWebsiteBuilder.java:
--------------------------------------------------------------------------------
1 | package net.proselyte.basepatterns.creational.builder;
2 |
3 | public class VisitCardWebsiteBuilder extends WebsiteBuilder{
4 | @Override
5 | void buildName() {
6 | website.setName("Visit card");
7 | }
8 |
9 | @Override
10 | void buildCms() {
11 | website.setCms(Cms.WORDPRESS);
12 | }
13 |
14 | @Override
15 | void buildPrice() {
16 | website.setPrice(500);
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/src/net/proselyte/basepatterns/creational/builder/Website.java:
--------------------------------------------------------------------------------
1 | package net.proselyte.basepatterns.creational.builder;
2 |
3 | public class Website {
4 | private String name;
5 | private Cms cms;
6 | private int price;
7 |
8 | public void setName(String name) {
9 | this.name = name;
10 | }
11 |
12 | public void setCms(Cms cms) {
13 | this.cms = cms;
14 | }
15 |
16 | public void setPrice(int price) {
17 | this.price = price;
18 | }
19 |
20 | @Override
21 | public String toString() {
22 | return "Website{" +
23 | "price=" + price +
24 | ", cms=" + cms +
25 | ", name='" + name + '\'' +
26 | '}';
27 | }
28 | }
29 |
--------------------------------------------------------------------------------
/src/net/proselyte/basepatterns/creational/builder/WebsiteBuilder.java:
--------------------------------------------------------------------------------
1 | package net.proselyte.basepatterns.creational.builder;
2 |
3 | public abstract class WebsiteBuilder {
4 | Website website;
5 |
6 | void createWebsite() {
7 | website = new Website();
8 | }
9 |
10 | abstract void buildName();
11 |
12 | abstract void buildCms();
13 |
14 | abstract void buildPrice();
15 |
16 | Website getWebsite() {
17 | return website;
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/src/net/proselyte/basepatterns/creational/factory/CppDeveloper.java:
--------------------------------------------------------------------------------
1 | package net.proselyte.basepatterns.creational.factory;
2 |
3 | public class CppDeveloper implements Developer{
4 | @Override
5 | public void writeCode() {
6 | System.out.println("C++ developer writes C++ code...");
7 | }
8 | }
9 |
--------------------------------------------------------------------------------
/src/net/proselyte/basepatterns/creational/factory/CppDeveloperFactory.java:
--------------------------------------------------------------------------------
1 | package net.proselyte.basepatterns.creational.factory;
2 |
3 | public class CppDeveloperFactory implements DeveloperFactory{
4 | @Override
5 | public Developer createDeveloper() {
6 | return new CppDeveloper();
7 | }
8 | }
9 |
--------------------------------------------------------------------------------
/src/net/proselyte/basepatterns/creational/factory/Developer.java:
--------------------------------------------------------------------------------
1 | package net.proselyte.basepatterns.creational.factory;
2 |
3 | public interface Developer {
4 | void writeCode();
5 | }
6 |
--------------------------------------------------------------------------------
/src/net/proselyte/basepatterns/creational/factory/DeveloperFactory.java:
--------------------------------------------------------------------------------
1 | package net.proselyte.basepatterns.creational.factory;
2 |
3 | public interface DeveloperFactory {
4 | Developer createDeveloper();
5 | }
6 |
--------------------------------------------------------------------------------
/src/net/proselyte/basepatterns/creational/factory/FactoryMethod.txt:
--------------------------------------------------------------------------------
1 | Шаблон: Фабрика (Factory Method)
2 | =======================================================================================================
3 | Цель:
4 |
5 | Создание интерфейса, который создаёт объект. При этом, выбор того, экземпляр какого класса создавать
6 | остаётся за классами, которые имплементируют данный интерфейс.
7 | =======================================================================================================
8 |
9 | Для чего используется:
10 |
11 | Для делигирования создания экземпляров, другому классу.
12 |
13 | =======================================================================================================
14 | Пример использования:
15 |
16 | - заранее неизвестно, экземпляры, какого класса нужно будет создавать;
17 | - класс спроектирован таким образом, что создаваемые им объекты имеют свойства определённого класса.
18 |
19 | =======================================================================================================
--------------------------------------------------------------------------------
/src/net/proselyte/basepatterns/creational/factory/JavaDeveloper.java:
--------------------------------------------------------------------------------
1 | package net.proselyte.basepatterns.creational.factory;
2 |
3 | public class JavaDeveloper implements Developer {
4 | @Override
5 | public void writeCode() {
6 | System.out.println("Java developer writes Java code...");
7 | }
8 | }
9 |
--------------------------------------------------------------------------------
/src/net/proselyte/basepatterns/creational/factory/JavaDeveloperFactory.java:
--------------------------------------------------------------------------------
1 | package net.proselyte.basepatterns.creational.factory;
2 |
3 | public class JavaDeveloperFactory implements DeveloperFactory{
4 | @Override
5 | public Developer createDeveloper() {
6 | return new JavaDeveloper();
7 | }
8 | }
9 |
--------------------------------------------------------------------------------
/src/net/proselyte/basepatterns/creational/factory/PhpDeveloper.java:
--------------------------------------------------------------------------------
1 | package net.proselyte.basepatterns.creational.factory;
2 |
3 | public class PhpDeveloper implements Developer{
4 | @Override
5 | public void writeCode() {
6 | System.out.println("Php developer writes Php code...");
7 | }
8 | }
9 |
--------------------------------------------------------------------------------
/src/net/proselyte/basepatterns/creational/factory/PhpDeveloperFactory.java:
--------------------------------------------------------------------------------
1 | package net.proselyte.basepatterns.creational.factory;
2 |
3 | public class PhpDeveloperFactory implements DeveloperFactory{
4 | @Override
5 | public Developer createDeveloper() {
6 | return new PhpDeveloper();
7 | }
8 | }
9 |
--------------------------------------------------------------------------------
/src/net/proselyte/basepatterns/creational/factory/Program.java:
--------------------------------------------------------------------------------
1 | package net.proselyte.basepatterns.creational.factory;
2 |
3 | public class Program {
4 | public static void main(String[] args) {
5 | DeveloperFactory developerFactory = new JavaDeveloperFactory();
6 | Developer developer = developerFactory.createDeveloper();
7 |
8 | developer.writeCode();
9 | }
10 |
11 | }
12 |
--------------------------------------------------------------------------------
/src/net/proselyte/basepatterns/creational/prototype/Copyable.java:
--------------------------------------------------------------------------------
1 | package net.proselyte.basepatterns.creational.prototype;
2 |
3 | public interface Copyable {
4 | Object copy();
5 | }
6 |
--------------------------------------------------------------------------------
/src/net/proselyte/basepatterns/creational/prototype/Project.java:
--------------------------------------------------------------------------------
1 | package net.proselyte.basepatterns.creational.prototype;
2 |
3 | public class Project implements Copyable{
4 | private int id;
5 | private String projectName;
6 | private String sourceCode;
7 |
8 | public Project(int id, String projectName, String sourceCode) {
9 | this.id = id;
10 | this.projectName = projectName;
11 | this.sourceCode = sourceCode;
12 | }
13 |
14 | public int getId() {
15 | return id;
16 | }
17 |
18 | public void setId(int id) {
19 | this.id = id;
20 | }
21 |
22 | public String getProjectName() {
23 | return projectName;
24 | }
25 |
26 | public void setProjectName(String projectName) {
27 | this.projectName = projectName;
28 | }
29 |
30 | public String getSourceCode() {
31 | return sourceCode;
32 | }
33 |
34 | public void setSourceCode(String sourceCode) {
35 | this.sourceCode = sourceCode;
36 | }
37 |
38 | @Override
39 | public Object copy() {
40 | Project copy = new Project(id, projectName, sourceCode);
41 | return copy;
42 | }
43 |
44 | @Override
45 | public String toString() {
46 | return "Project{" +
47 | "id=" + id +
48 | ", projectName='" + projectName + '\'' +
49 | ", sourceCode='" + sourceCode + '\'' +
50 | '}';
51 | }
52 | }
53 |
--------------------------------------------------------------------------------
/src/net/proselyte/basepatterns/creational/prototype/ProjectFactory.java:
--------------------------------------------------------------------------------
1 | package net.proselyte.basepatterns.creational.prototype;
2 |
3 | public class ProjectFactory {
4 | Project project;
5 |
6 | public ProjectFactory(Project project) {
7 | this.project = project;
8 | }
9 |
10 | public void setProject(Project project) {
11 | this.project = project;
12 | }
13 |
14 | Project cloneProject() {
15 | return (Project) project.copy();
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/src/net/proselyte/basepatterns/creational/prototype/Prototype.txt:
--------------------------------------------------------------------------------
1 | Шаблон: Прототип (Prototype)
2 | =======================================================================================================
3 | Цель:
4 |
5 | Определить вид создаваемых объектов с помощью экземпляра - прототипа и создавать новые объекты,
6 | копируя этот прототип.
7 | =======================================================================================================
8 |
9 | Для чего используется:
10 |
11 | Для создания копий заданного объекта.
12 |
13 | =======================================================================================================
14 | Пример использования:
15 |
16 | - классы, экземпляры которых необходимо создать определяются во время выполнения программы;
17 | - для избежания построения иерархии классов, фабрик или параллельных иерархий классов;
18 | - экземпляры класса могут находиться в одном из немногих возможных состояний.
19 | =======================================================================================================
--------------------------------------------------------------------------------
/src/net/proselyte/basepatterns/creational/prototype/VersionControlRunner.java:
--------------------------------------------------------------------------------
1 | package net.proselyte.basepatterns.creational.prototype;
2 |
3 | public class VersionControlRunner {
4 | public static void main(String[] args) {
5 | Project master = new Project(1, "SuperProject", "SourceCode sourceCode = new SourceCode();");
6 |
7 | System.out.println(master);
8 |
9 | ProjectFactory factory = new ProjectFactory(master);
10 | Project masterClone = factory.cloneProject();
11 |
12 | System.out.println("\n=======================\n");
13 | System.out.println(masterClone);
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/src/net/proselyte/basepatterns/creational/singleton/ProgramLogger.java:
--------------------------------------------------------------------------------
1 | package net.proselyte.basepatterns.creational.singleton;
2 |
3 | public class ProgramLogger {
4 | private static ProgramLogger programLogger;
5 | private static String logFile = "This is log file. \n\n";
6 |
7 | public static synchronized ProgramLogger getProgramLogger(){
8 | if(programLogger == null){
9 | programLogger = new ProgramLogger();
10 | }
11 |
12 | return programLogger;
13 | }
14 |
15 | private ProgramLogger(){
16 |
17 | }
18 |
19 | public void addLogInfo(String logInfo){
20 | logFile += logInfo + "\n";
21 | }
22 |
23 | public void showLogFile(){
24 | System.out.println(logFile);
25 | }
26 | }
--------------------------------------------------------------------------------
/src/net/proselyte/basepatterns/creational/singleton/ProgramRunner.java:
--------------------------------------------------------------------------------
1 | package net.proselyte.basepatterns.creational.singleton;
2 |
3 | public class ProgramRunner {
4 | public static void main(String[] args) {
5 | ProgramLogger.getProgramLogger().addLogInfo("First log...");
6 | ProgramLogger.getProgramLogger().addLogInfo("Second log...");
7 | ProgramLogger.getProgramLogger().addLogInfo("Third log...");
8 |
9 | ProgramLogger.getProgramLogger().showLogFile();
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/src/net/proselyte/basepatterns/creational/singleton/Singleton.txt:
--------------------------------------------------------------------------------
1 | Шаблон: Одиночка (Singleton)
2 | =======================================================================================================
3 | Цель:
4 |
5 | Гарантировать, что у класса будет только один единственный экземпляр и к нему будет предоставлена
6 | глобальная точка доступа.
7 |
8 | =======================================================================================================
9 |
10 | Для чего используется:
11 |
12 | Для создания единственного экземпляра опредлённого класса.
13 |
14 | =======================================================================================================
15 | Пример использования:
16 |
17 | - необходим только один экземпляр конкретного класса, который доступен для всех клиентов;
18 | - единственный экземпляр должен наследоваться путём порождения подклассов, при этом, клиенты
19 | имеют возможность работать с классом-неследником без модификации своего кода.
20 |
21 | =======================================================================================================
--------------------------------------------------------------------------------
/src/net/proselyte/basepatterns/structural/adapter/Adapter.txt:
--------------------------------------------------------------------------------
1 | Шаблон: Адаптер (Adapter)
2 | =======================================================================================================
3 | Цель:
4 |
5 | Преобразование интерфейса одного класса в интерфейс того класса, который необходим клиенту.
6 |
7 | =======================================================================================================
8 |
9 | Для чего используется:
10 |
11 | Для обеспечения совместной работы классов, интерфейсы которых не совместимы.
12 |
13 | =======================================================================================================
14 | Пример использования:
15 |
16 | - интерфейс класса, который мы хотим использовать не соответствует нашим потребностям;
17 | - необходим класс, который должен взаимодействовать с классами, которые ему неизвестны
18 | или не связаны с ним;
19 | - необходимо использовать несколько существующих подклассов, но нецелесообразно использовать
20 | методы этих классов создавая их новые подклассы.
21 |
22 | =======================================================================================================
--------------------------------------------------------------------------------
/src/net/proselyte/basepatterns/structural/adapter/AdapterJavaToDatabase.java:
--------------------------------------------------------------------------------
1 | package net.proselyte.basepatterns.structural.adapter;
2 |
3 | public class AdapterJavaToDatabase extends JavaApplication implements Database {
4 | @Override
5 | public void insert() {
6 | saveObject();
7 | }
8 |
9 | @Override
10 | public void update() {
11 | updateObject();
12 | }
13 |
14 | @Override
15 | public void select() {
16 | loadObject();
17 | }
18 |
19 | @Override
20 | public void remove() {
21 | deleteObject();
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/src/net/proselyte/basepatterns/structural/adapter/Database.java:
--------------------------------------------------------------------------------
1 | package net.proselyte.basepatterns.structural.adapter;
2 |
3 | public interface Database {
4 | public void insert();
5 |
6 | public void update();
7 |
8 | public void select();
9 |
10 | public void remove();
11 | }
12 |
--------------------------------------------------------------------------------
/src/net/proselyte/basepatterns/structural/adapter/DatabaseRunner.java:
--------------------------------------------------------------------------------
1 | package net.proselyte.basepatterns.structural.adapter;
2 |
3 | public class DatabaseRunner {
4 | public static void main(String[] args) {
5 | Database database = new AdapterJavaToDatabase();
6 |
7 | database.insert();
8 | database.update();
9 | database.select();
10 | database.remove();
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/src/net/proselyte/basepatterns/structural/adapter/JavaApplication.java:
--------------------------------------------------------------------------------
1 | package net.proselyte.basepatterns.structural.adapter;
2 |
3 | public class JavaApplication {
4 | public void saveObject(){
5 | System.out.println("Saving Java object...");
6 | }
7 |
8 | public void updateObject(){
9 | System.out.println("Updating Java object...");
10 | }
11 |
12 | public void loadObject(){
13 | System.out.println("Loading Java object...");
14 | }
15 |
16 | public void deleteObject(){
17 | System.out.println("Deleting Java object...");
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/src/net/proselyte/basepatterns/structural/bridge/BankSystem.java:
--------------------------------------------------------------------------------
1 | package net.proselyte.basepatterns.structural.bridge;
2 |
3 | public class BankSystem extends Program{
4 |
5 | protected BankSystem(Developer developer) {
6 | super(developer);
7 | }
8 |
9 | @Override
10 | public void developProgram() {
11 | System.out.println("Bank System development in progress...");
12 | developer.writeCode();
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/src/net/proselyte/basepatterns/structural/bridge/Bridge.txt:
--------------------------------------------------------------------------------
1 | Шаблон: Мост (Bridge)
2 | =======================================================================================================
3 | Цель:
4 |
5 | Отделить абстракцию от её реализации таким образом, чтобы мы могли изменять независимо друг от друга
6 | и то и другое.
7 |
8 | =======================================================================================================
9 |
10 | Для чего используется:
11 |
12 | Для получения преимуществ наследования без потери гибкости.
13 |
14 | =======================================================================================================
15 | Пример использования:
16 |
17 | - предотвращения жёсткого привязки абстракции к реализации (например, реализацию необходимо выбрать
18 | во время выполнения программы);
19 | - в будущем мы хотим расширять с помощью подклассов и реализацию и абстракцию;
20 | - если изменения в реализации не должны отражаться на клиентах абстракции;
21 | - для разделения одной реализации между несколькими оъектами и не показывать это клиенту.
22 |
23 | =======================================================================================================
--------------------------------------------------------------------------------
/src/net/proselyte/basepatterns/structural/bridge/CppDeveloper.java:
--------------------------------------------------------------------------------
1 | package net.proselyte.basepatterns.structural.bridge;
2 |
3 | public class CppDeveloper implements Developer{
4 | @Override
5 | public void writeCode() {
6 | System.out.println("C++ developer writes C++ code...");
7 | }
8 | }
9 |
--------------------------------------------------------------------------------
/src/net/proselyte/basepatterns/structural/bridge/Developer.java:
--------------------------------------------------------------------------------
1 | package net.proselyte.basepatterns.structural.bridge;
2 |
3 | public interface Developer {
4 | public void writeCode();
5 | }
6 |
--------------------------------------------------------------------------------
/src/net/proselyte/basepatterns/structural/bridge/JavaDeveloper.java:
--------------------------------------------------------------------------------
1 | package net.proselyte.basepatterns.structural.bridge;
2 |
3 | public class JavaDeveloper implements Developer{
4 | @Override
5 | public void writeCode() {
6 | System.out.println("Java developer writes Java code...");
7 | }
8 | }
9 |
--------------------------------------------------------------------------------
/src/net/proselyte/basepatterns/structural/bridge/Program.java:
--------------------------------------------------------------------------------
1 | package net.proselyte.basepatterns.structural.bridge;
2 |
3 | public abstract class Program {
4 | protected Developer developer;
5 |
6 | protected Program(Developer developer) {
7 | this.developer = developer;
8 | }
9 |
10 | public abstract void developProgram();
11 | }
--------------------------------------------------------------------------------
/src/net/proselyte/basepatterns/structural/bridge/ProgramCreator.java:
--------------------------------------------------------------------------------
1 | package net.proselyte.basepatterns.structural.bridge;
2 |
3 | public class ProgramCreator {
4 | public static void main(String[] args) {
5 | Program [] programs = {
6 | new BankSystem(new CppDeveloper()),
7 | new StockExchange(new JavaDeveloper())
8 | };
9 |
10 | for(Program program: programs){
11 | program.developProgram();
12 | }
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/src/net/proselyte/basepatterns/structural/bridge/StockExchange.java:
--------------------------------------------------------------------------------
1 | package net.proselyte.basepatterns.structural.bridge;
2 |
3 | public class StockExchange extends Program{
4 |
5 | protected StockExchange(Developer developer) {
6 | super(developer);
7 | }
8 |
9 | @Override
10 | public void developProgram() {
11 | System.out.println("Stock Exchange development in progress...");
12 | developer.writeCode();
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/src/net/proselyte/basepatterns/structural/composite/Composite.txt:
--------------------------------------------------------------------------------
1 | Шаблон: Компоновщик (Composite)
2 | =======================================================================================================
3 | Цель:
4 |
5 | Скомпонировать объекты в структуры по типу "дерева", позволяя клиентам единообразно трактовать
6 | отдельные и составные объекты.
7 |
8 | =======================================================================================================
9 |
10 | Для чего используется:
11 |
12 | Для группировки мелких компонентов в более крупные, которые, в свою очередь, могут стать основой для
13 | ещё более крупных стуктур.
14 |
15 | =======================================================================================================
16 | Пример использования:
17 |
18 | - для представления иерархии "часть-целое";
19 | - мы хотим, чтобы клиенты одним способом трактовали как отдельные, так и составные объекты.
20 |
21 | =======================================================================================================
--------------------------------------------------------------------------------
/src/net/proselyte/basepatterns/structural/composite/CppDeveloper.java:
--------------------------------------------------------------------------------
1 | package net.proselyte.basepatterns.structural.composite;
2 |
3 | public class CppDeveloper implements Developer{
4 | @Override
5 | public void writeCode() {
6 | System.out.println("C++ developer writes C++ code...");
7 | }
8 | }
9 |
--------------------------------------------------------------------------------
/src/net/proselyte/basepatterns/structural/composite/Developer.java:
--------------------------------------------------------------------------------
1 | package net.proselyte.basepatterns.structural.composite;
2 |
3 | public interface Developer {
4 | public void writeCode();
5 | }
6 |
--------------------------------------------------------------------------------
/src/net/proselyte/basepatterns/structural/composite/JavaDeveloper.java:
--------------------------------------------------------------------------------
1 | package net.proselyte.basepatterns.structural.composite;
2 |
3 | public class JavaDeveloper implements Developer{
4 | @Override
5 | public void writeCode() {
6 | System.out.println("Java developer writes Java code...");
7 | }
8 | }
9 |
--------------------------------------------------------------------------------
/src/net/proselyte/basepatterns/structural/composite/Project.java:
--------------------------------------------------------------------------------
1 | package net.proselyte.basepatterns.structural.composite;
2 |
3 | public class Project {
4 | public static void main(String[] args) {
5 | Team team = new Team();
6 |
7 | Developer firstJavaDeveloper = new JavaDeveloper();
8 | Developer secondJavaDeveloper = new JavaDeveloper();
9 | Developer cppDeveloper = new CppDeveloper();
10 |
11 | team.addDeveloper(firstJavaDeveloper);
12 | team.addDeveloper(secondJavaDeveloper);
13 | team.addDeveloper(cppDeveloper);
14 |
15 | team.createProject();
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/src/net/proselyte/basepatterns/structural/composite/Team.java:
--------------------------------------------------------------------------------
1 | package net.proselyte.basepatterns.structural.composite;
2 |
3 | import java.util.ArrayList;
4 | import java.util.List;
5 |
6 | public class Team {
7 | private List developers = new ArrayList();
8 |
9 | public void addDeveloper(Developer developer){
10 | developers.add(developer);
11 | }
12 |
13 | public void removeDeveloper(Developer developer){
14 | developers.remove(developer);
15 | }
16 |
17 | public void createProject(){
18 | System.out.println("Team creates project...\n");
19 | for(Developer developer: developers){
20 | developer.writeCode();
21 | }
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/src/net/proselyte/basepatterns/structural/decorator/Decorator.txt:
--------------------------------------------------------------------------------
1 | Шаблон: Декоратор(Decorator)
2 | =======================================================================================================
3 | Цель:
4 |
5 | Динамическое добавление новых обязанностей объекту.
6 |
7 | =======================================================================================================
8 |
9 | Для чего используется:
10 |
11 | Используется в качестве альтернативы порождению подклассов для расширения функциональности.
12 |
13 | =======================================================================================================
14 | Пример использования:
15 |
16 | - динамическое и понятное клиентам добавления обязанностей объектам;
17 | - реализация обязанностей, которые могут быть сняты с объекта;
18 | - расширение класса путём порождения подклассов невозможно по каким-либо причинам.
19 |
20 | =======================================================================================================
--------------------------------------------------------------------------------
/src/net/proselyte/basepatterns/structural/decorator/Developer.java:
--------------------------------------------------------------------------------
1 | package net.proselyte.basepatterns.structural.decorator;
2 |
3 | public interface Developer {
4 | public String makeJob();
5 | }
6 |
--------------------------------------------------------------------------------
/src/net/proselyte/basepatterns/structural/decorator/DeveloperDecorator.java:
--------------------------------------------------------------------------------
1 | package net.proselyte.basepatterns.structural.decorator;
2 |
3 | public class DeveloperDecorator implements Developer{
4 |
5 | Developer developer;
6 |
7 | public DeveloperDecorator(Developer developer) {
8 | this.developer = developer;
9 | }
10 |
11 | @Override
12 | public String makeJob() {
13 | return developer.makeJob();
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/src/net/proselyte/basepatterns/structural/decorator/JavaDeveloper.java:
--------------------------------------------------------------------------------
1 | package net.proselyte.basepatterns.structural.decorator;
2 |
3 | public class JavaDeveloper implements Developer{
4 | @Override
5 | public String makeJob() {
6 | return "Write Java code.";
7 | }
8 | }
9 |
--------------------------------------------------------------------------------
/src/net/proselyte/basepatterns/structural/decorator/JavaTeamLead.java:
--------------------------------------------------------------------------------
1 | package net.proselyte.basepatterns.structural.decorator;
2 |
3 | public class JavaTeamLead extends DeveloperDecorator {
4 |
5 | public JavaTeamLead(Developer developer) {
6 | super(developer);
7 | }
8 |
9 | public String sendWeekReport() {
10 | return "Send week report to customer.";
11 | }
12 |
13 | @Override
14 | public String makeJob() {
15 | return super.makeJob() + sendWeekReport();
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/src/net/proselyte/basepatterns/structural/decorator/SeniorJavaDeveloper.java:
--------------------------------------------------------------------------------
1 | package net.proselyte.basepatterns.structural.decorator;
2 |
3 | public class SeniorJavaDeveloper extends DeveloperDecorator{
4 |
5 | public SeniorJavaDeveloper(Developer developer) {
6 | super(developer);
7 | }
8 |
9 | public String makeCodeReview(){
10 | return " Make code review.";
11 | }
12 |
13 | @Override
14 | public String makeJob() {
15 | return super.makeJob() + makeCodeReview();
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/src/net/proselyte/basepatterns/structural/decorator/Task.java:
--------------------------------------------------------------------------------
1 | package net.proselyte.basepatterns.structural.decorator;
2 |
3 | public class Task {
4 | public static void main(String[] args) {
5 | Developer developer = new JavaTeamLead(new SeniorJavaDeveloper(new JavaDeveloper()));
6 |
7 | System.out.println(developer.makeJob());
8 | }
9 | }
10 |
--------------------------------------------------------------------------------
/src/net/proselyte/basepatterns/structural/facade/BugTracker.java:
--------------------------------------------------------------------------------
1 | package net.proselyte.basepatterns.structural.facade;
2 |
3 | public class BugTracker {
4 | private boolean activeSprint;
5 |
6 | public boolean isActiveSprint() {
7 | return activeSprint;
8 | }
9 |
10 | public void startSprint() {
11 | System.out.println("Sprint is active.");
12 | activeSprint = true;
13 | }
14 |
15 | public void finishSprint() {
16 | System.out.println("Sprint is not active.");
17 | activeSprint = false;
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/src/net/proselyte/basepatterns/structural/facade/Developer.java:
--------------------------------------------------------------------------------
1 | package net.proselyte.basepatterns.structural.facade;
2 |
3 | public class Developer {
4 | public void doJobBeforeDeadline(BugTracker bugTracker){
5 | if(bugTracker.isActiveSprint()){
6 | System.out.println("Developer is solving problems...");
7 | }else {
8 | System.out.println("Developer is reading Habrahabr...");
9 | }
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/src/net/proselyte/basepatterns/structural/facade/Facade.txt:
--------------------------------------------------------------------------------
1 | Шаблон: Фасад (Facade)
2 | =======================================================================================================
3 | Цель:
4 |
5 | Предоставить унифицированный интерфейс вместо нескольких интерфейсов подститсемы.
6 |
7 | =======================================================================================================
8 |
9 | Для чего используется:
10 |
11 | Используется для опредления интерфейса высокого уровня, который упрощает использование подсистемы.
12 |
13 | =======================================================================================================
14 | Пример использования:
15 |
16 | - изолирование клиентов от компонентов подсистемы, упрощая работу с ней;
17 | - необходимость ослабления связанности подсистемы с клиентами;
18 |
19 | =======================================================================================================
--------------------------------------------------------------------------------
/src/net/proselyte/basepatterns/structural/facade/Job.java:
--------------------------------------------------------------------------------
1 | package net.proselyte.basepatterns.structural.facade;
2 |
3 | public class Job {
4 | public void doJob(){
5 | System.out.println("Job in progress...");
6 | }
7 | }
8 |
--------------------------------------------------------------------------------
/src/net/proselyte/basepatterns/structural/facade/SprintRunner.java:
--------------------------------------------------------------------------------
1 | package net.proselyte.basepatterns.structural.facade;
2 |
3 | public class SprintRunner {
4 | public static void main(String[] args) {
5 | Workflow workflow = new Workflow();
6 |
7 | workflow.solveProblems();
8 | }
9 | }
10 |
--------------------------------------------------------------------------------
/src/net/proselyte/basepatterns/structural/facade/Workflow.java:
--------------------------------------------------------------------------------
1 | package net.proselyte.basepatterns.structural.facade;
2 |
3 | public class Workflow {
4 | Developer developer = new Developer();
5 | Job job = new Job();
6 | BugTracker bugTracker = new BugTracker();
7 |
8 | public void solveProblems(){
9 | job.doJob();
10 | bugTracker.startSprint();
11 | developer.doJobBeforeDeadline(bugTracker);
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/src/net/proselyte/basepatterns/structural/flyweight/CppDeveloper.java:
--------------------------------------------------------------------------------
1 | package net.proselyte.basepatterns.structural.flyweight;
2 |
3 | public class CppDeveloper implements Developer{
4 | @Override
5 | public void writeCode() {
6 | System.out.println("C++ developer writes C++ code...");
7 | }
8 | }
9 |
--------------------------------------------------------------------------------
/src/net/proselyte/basepatterns/structural/flyweight/Developer.java:
--------------------------------------------------------------------------------
1 | package net.proselyte.basepatterns.structural.flyweight;
2 |
3 | public interface Developer {
4 | public void writeCode();
5 | }
6 |
--------------------------------------------------------------------------------
/src/net/proselyte/basepatterns/structural/flyweight/DeveloperFactory.java:
--------------------------------------------------------------------------------
1 | package net.proselyte.basepatterns.structural.flyweight;
2 |
3 | import java.util.HashMap;
4 | import java.util.Map;
5 |
6 | public class DeveloperFactory {
7 | private static final Map developers = new HashMap<>();
8 |
9 | public Developer getDeveloperBySpecialty(String specialty) {
10 | Developer developer = developers.get(specialty);
11 |
12 | if (developer == null) {
13 | switch (specialty) {
14 | case "java":
15 | System.out.println("Hiring Java developer...");
16 | developer = new JavaDeveloper();
17 | break;
18 | case "c++":
19 | System.out.println("Hiring C++ developer...");
20 | developer = new CppDeveloper();
21 | }
22 | developers.put(specialty, developer);
23 | }
24 | return developer;
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/src/net/proselyte/basepatterns/structural/flyweight/Flyweight.txt:
--------------------------------------------------------------------------------
1 | Шаблон: Приспособленец (Flyweight)
2 | =======================================================================================================
3 | Цель:
4 |
5 | Поддержка множества мелких объектов.
6 |
7 | =======================================================================================================
8 |
9 | Для чего используется:
10 |
11 | Использует разделение для того, чтобы поддерживать много мелких объектов.
12 |
13 | =======================================================================================================
14 | Пример использования:
15 |
16 | - когда используется большое число объектов;
17 | - большую часть состояния объектов можно вынести наружу;
18 | - приложение не зависит от идентичности объекта.
19 |
20 | =======================================================================================================
--------------------------------------------------------------------------------
/src/net/proselyte/basepatterns/structural/flyweight/JavaDeveloper.java:
--------------------------------------------------------------------------------
1 | package net.proselyte.basepatterns.structural.flyweight;
2 |
3 | public class JavaDeveloper implements Developer{
4 | @Override
5 | public void writeCode() {
6 | System.out.println("Java developer writes Java code...");
7 | }
8 | }
9 |
--------------------------------------------------------------------------------
/src/net/proselyte/basepatterns/structural/flyweight/ProjectRunner.java:
--------------------------------------------------------------------------------
1 | package net.proselyte.basepatterns.structural.flyweight;
2 |
3 | import java.util.ArrayList;
4 | import java.util.List;
5 |
6 | public class ProjectRunner {
7 | public static void main(String[] args) {
8 | DeveloperFactory developerFactory = new DeveloperFactory();
9 |
10 | List developers = new ArrayList<>();
11 |
12 | developers.add(developerFactory.getDeveloperBySpecialty("java"));
13 | developers.add(developerFactory.getDeveloperBySpecialty("java"));
14 | developers.add(developerFactory.getDeveloperBySpecialty("java"));
15 | developers.add(developerFactory.getDeveloperBySpecialty("java"));
16 | developers.add(developerFactory.getDeveloperBySpecialty("java"));
17 | developers.add(developerFactory.getDeveloperBySpecialty("java"));
18 | developers.add(developerFactory.getDeveloperBySpecialty("java"));
19 | developers.add(developerFactory.getDeveloperBySpecialty("c++"));
20 | developers.add(developerFactory.getDeveloperBySpecialty("c++"));
21 | developers.add(developerFactory.getDeveloperBySpecialty("c++"));
22 | developers.add(developerFactory.getDeveloperBySpecialty("c++"));
23 | developers.add(developerFactory.getDeveloperBySpecialty("c++"));
24 | developers.add(developerFactory.getDeveloperBySpecialty("c++"));
25 | developers.add(developerFactory.getDeveloperBySpecialty("c++"));
26 | developers.add(developerFactory.getDeveloperBySpecialty("c++"));
27 |
28 | for(Developer developer: developers){
29 | developer.writeCode();
30 | }
31 | }
32 | }
33 |
--------------------------------------------------------------------------------
/src/net/proselyte/basepatterns/structural/proxy/Project.java:
--------------------------------------------------------------------------------
1 | package net.proselyte.basepatterns.structural.proxy;
2 |
3 | public interface Project {
4 | public void run();
5 | }
6 |
--------------------------------------------------------------------------------
/src/net/proselyte/basepatterns/structural/proxy/ProjectRunner.java:
--------------------------------------------------------------------------------
1 | package net.proselyte.basepatterns.structural.proxy;
2 |
3 | public class ProjectRunner {
4 | public static void main(String[] args) {
5 | Project project = new ProxyProject("https://www.github.com/proselytear/realProject");
6 |
7 | project.run();
8 | }
9 | }
10 |
--------------------------------------------------------------------------------
/src/net/proselyte/basepatterns/structural/proxy/Proxy.txt:
--------------------------------------------------------------------------------
1 | Шаблон: Прокси (Proxy)
2 | =======================================================================================================
3 | Цель:
4 |
5 | Для замещения другого объекта и контроля доступа к нему.
6 |
7 | =======================================================================================================
8 |
9 | Для чего используется:
10 |
11 | Для обеспечения контроля досутпа к опредленному объекту.
12 |
13 | =======================================================================================================
14 | Пример использования:
15 |
16 | - когда есть необходимость ссылаться на объект способом отличным от обычного указателя;
17 | * удалённое замещение - локалный представитель вместо объекта в другом
18 | адресном пространстве.
19 |
20 | * виртуальное замещение - создание "тяжёлых объектов" при необходимости.
21 |
22 | * защищённое замещение - контроль доступа к указанному объекту
23 |
24 | * "умная" ссылка - замена обычного указателя
25 | (подсчёт числа ссылок, установка блокировки ит.д.)
26 |
27 | =======================================================================================================
--------------------------------------------------------------------------------
/src/net/proselyte/basepatterns/structural/proxy/ProxyProject.java:
--------------------------------------------------------------------------------
1 | package net.proselyte.basepatterns.structural.proxy;
2 |
3 | public class ProxyProject implements Project {
4 | private String url;
5 | private RealProject realProject;
6 |
7 |
8 | public ProxyProject(String url) {
9 | this.url = url;
10 | }
11 |
12 | @Override
13 | public void run() {
14 | if (realProject == null) {
15 | realProject = new RealProject(url);
16 | }
17 | realProject.run();
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/src/net/proselyte/basepatterns/structural/proxy/RealProject.java:
--------------------------------------------------------------------------------
1 | package net.proselyte.basepatterns.structural.proxy;
2 |
3 | public class RealProject implements Project {
4 | private String url;
5 |
6 | public RealProject(String url) {
7 | this.url = url;
8 | load();
9 | }
10 |
11 | public void load() {
12 | System.out.println("Loading project from " + url + "...");
13 | }
14 |
15 | @Override
16 | public void run() {
17 | System.out.println("Running project " + url + "...");
18 | }
19 | }
20 |
--------------------------------------------------------------------------------