├── .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 | --------------------------------------------------------------------------------