diff --git a/README.md b/README.md
new file mode 100644
index 0000000..bc192a3
--- /dev/null
+++ b/README.md
@@ -0,0 +1,6 @@
+# Design Pattern
+This repo's code is written by following the Design Pattern youtube video tutorials which are created by Sir Derek banas (Youtube Channel:Derek Banas).
+
You can found those video tutorials at : https://www.youtube.com/user/derekbanas (Don't forget to like or dislike, if you like please subscribe).
+
You can also follow him on Facebook: https://web.facebook.com/dbanas2
+
+N.B: Code content for each video tutorial for this series has been placed at branch having the name of the video tutorial
diff --git a/src/org/java/derekBanas/adapterDP/Adapter_DP_1.jpg b/src/org/java/derekBanas/adapterDP/Adapter_DP_1.jpg
new file mode 100644
index 0000000..22f8eae
Binary files /dev/null and b/src/org/java/derekBanas/adapterDP/Adapter_DP_1.jpg differ
diff --git a/src/org/java/derekBanas/adapterDP/Adapter_DP_UML.jpg b/src/org/java/derekBanas/adapterDP/Adapter_DP_UML.jpg
new file mode 100644
index 0000000..5fd14f8
Binary files /dev/null and b/src/org/java/derekBanas/adapterDP/Adapter_DP_UML.jpg differ
diff --git a/src/org/java/derekBanas/adapterDP/EnemyAttacker.java b/src/org/java/derekBanas/adapterDP/EnemyAttacker.java
new file mode 100644
index 0000000..3029d78
--- /dev/null
+++ b/src/org/java/derekBanas/adapterDP/EnemyAttacker.java
@@ -0,0 +1,9 @@
+package org.java.derekBanas.adapterDP;
+
+public interface EnemyAttacker {
+
+ public void fireWeapon();
+ public void driveForward();
+ public void assignDriver(String driver);
+
+}
diff --git a/src/org/java/derekBanas/adapterDP/EnemyRobot.java b/src/org/java/derekBanas/adapterDP/EnemyRobot.java
new file mode 100644
index 0000000..c232533
--- /dev/null
+++ b/src/org/java/derekBanas/adapterDP/EnemyRobot.java
@@ -0,0 +1,31 @@
+package org.java.derekBanas.adapterDP;
+
+import java.util.Random;
+
+public class EnemyRobot {
+
+Random generator = new Random();
+
+
+ public void smashWithHand() {
+ int attackDamage = generator.nextInt(7)+1;
+ System.out.println("Enemy Robot Does :"+ attackDamage+" Damage by smashing with hands");
+
+ }
+
+
+ public void walkForward() {
+ int movement = generator.nextInt(5)+1;
+ System.out.println("Enemy Robot Walk Forward :"+ movement+" Spaces");
+
+
+ }
+
+
+ public void reactToHuman(String human) {
+
+ System.out.println(" Enemy Robot tramps on :"+ human);
+ }
+
+
+}
diff --git a/src/org/java/derekBanas/adapterDP/EnemyRobotAdapter.java b/src/org/java/derekBanas/adapterDP/EnemyRobotAdapter.java
new file mode 100644
index 0000000..7084155
--- /dev/null
+++ b/src/org/java/derekBanas/adapterDP/EnemyRobotAdapter.java
@@ -0,0 +1,28 @@
+package org.java.derekBanas.adapterDP;
+
+public class EnemyRobotAdapter implements EnemyAttacker {
+
+ EnemyRobot theRobot;
+
+ public EnemyRobotAdapter(EnemyRobot newRobot) {
+ theRobot = newRobot;
+ }
+ @Override
+ public void fireWeapon() {
+ theRobot.smashWithHand();
+
+ }
+
+ @Override
+ public void driveForward() {
+ theRobot.walkForward();
+
+ }
+
+ @Override
+ public void assignDriver(String driver) {
+ theRobot.reactToHuman(driver);
+
+ }
+
+}
diff --git a/src/org/java/derekBanas/adapterDP/EnemyTank.java b/src/org/java/derekBanas/adapterDP/EnemyTank.java
new file mode 100644
index 0000000..1ec9b02
--- /dev/null
+++ b/src/org/java/derekBanas/adapterDP/EnemyTank.java
@@ -0,0 +1,30 @@
+package org.java.derekBanas.adapterDP;
+
+import java.util.Random;
+
+public class EnemyTank implements EnemyAttacker {
+
+ Random generator = new Random();
+
+ @Override
+ public void fireWeapon() {
+ int attackDamage = generator.nextInt(10)+1;
+ System.out.println("Enemy Tank Does :"+ attackDamage+" Damage");
+
+ }
+
+ @Override
+ public void driveForward() {
+ int movement = generator.nextInt(5)+1;
+ System.out.println("Enemy Tank Moves :"+ movement+" Spaces");
+
+
+ }
+
+ @Override
+ public void assignDriver(String driverName) {
+
+ System.out.println(driverName + " is driving the tank");
+ }
+
+}
diff --git a/src/org/java/derekBanas/adapterDP/TestEnemyAttacker.java b/src/org/java/derekBanas/adapterDP/TestEnemyAttacker.java
new file mode 100644
index 0000000..f58eaa8
--- /dev/null
+++ b/src/org/java/derekBanas/adapterDP/TestEnemyAttacker.java
@@ -0,0 +1,30 @@
+package org.java.derekBanas.adapterDP;
+
+public class TestEnemyAttacker {
+
+ public static void main(String[] args){
+
+ EnemyTank rx7Tank = new EnemyTank();
+
+ EnemyRobot fredTheRobot = new EnemyRobot();
+
+ EnemyAttacker robotAdapter = new EnemyRobotAdapter(fredTheRobot);
+
+ System.out.println("The Robot");
+ fredTheRobot.reactToHuman("Paul");
+ fredTheRobot.walkForward();
+ fredTheRobot.smashWithHand();
+
+ System.out.println("The Enemy tank");
+ rx7Tank.assignDriver("Frank");
+ rx7Tank.driveForward();
+ rx7Tank.fireWeapon();
+
+
+ System.out.println("The Robot Adapter");
+ robotAdapter.assignDriver("Mark");
+ robotAdapter.driveForward();
+ robotAdapter.fireWeapon();
+ }
+
+}
diff --git a/src/org/java/derekBanas/commandDP/Command.java b/src/org/java/derekBanas/commandDP/Command.java
new file mode 100644
index 0000000..563788a
--- /dev/null
+++ b/src/org/java/derekBanas/commandDP/Command.java
@@ -0,0 +1,9 @@
+package org.java.derekBanas.commandDP;
+
+public interface Command {
+
+ public void execute();
+
+ public void undo();
+
+}
diff --git a/src/org/java/derekBanas/commandDP/Command_DP_1.jpg b/src/org/java/derekBanas/commandDP/Command_DP_1.jpg
new file mode 100644
index 0000000..5646e99
Binary files /dev/null and b/src/org/java/derekBanas/commandDP/Command_DP_1.jpg differ
diff --git a/src/org/java/derekBanas/commandDP/Command_DP_2.jpg b/src/org/java/derekBanas/commandDP/Command_DP_2.jpg
new file mode 100644
index 0000000..4b52247
Binary files /dev/null and b/src/org/java/derekBanas/commandDP/Command_DP_2.jpg differ
diff --git a/src/org/java/derekBanas/commandDP/Command_DP_3.jpg b/src/org/java/derekBanas/commandDP/Command_DP_3.jpg
new file mode 100644
index 0000000..9f3e01c
Binary files /dev/null and b/src/org/java/derekBanas/commandDP/Command_DP_3.jpg differ
diff --git a/src/org/java/derekBanas/commandDP/Command_DP_UML.jpg b/src/org/java/derekBanas/commandDP/Command_DP_UML.jpg
new file mode 100644
index 0000000..315a9ab
Binary files /dev/null and b/src/org/java/derekBanas/commandDP/Command_DP_UML.jpg differ
diff --git a/src/org/java/derekBanas/commandDP/DeviceButton.java b/src/org/java/derekBanas/commandDP/DeviceButton.java
new file mode 100644
index 0000000..e8d0ad9
--- /dev/null
+++ b/src/org/java/derekBanas/commandDP/DeviceButton.java
@@ -0,0 +1,19 @@
+package org.java.derekBanas.commandDP;
+
+public class DeviceButton {
+
+ Command theCommand;
+
+ public DeviceButton(Command newCommand) {
+ theCommand = newCommand;
+ }
+
+ public void press(){
+ theCommand.execute();
+ }
+
+ public void pressUndo(){
+ theCommand.undo();
+ }
+
+}
diff --git a/src/org/java/derekBanas/commandDP/ElectronicDevice.java b/src/org/java/derekBanas/commandDP/ElectronicDevice.java
new file mode 100644
index 0000000..3d775c1
--- /dev/null
+++ b/src/org/java/derekBanas/commandDP/ElectronicDevice.java
@@ -0,0 +1,10 @@
+package org.java.derekBanas.commandDP;
+
+public interface ElectronicDevice {
+
+ public void on();
+ public void off();
+ public void volumeUp();
+ public void volumeDown();
+
+}
diff --git a/src/org/java/derekBanas/commandDP/PlayWithRemote.java b/src/org/java/derekBanas/commandDP/PlayWithRemote.java
new file mode 100644
index 0000000..755e954
--- /dev/null
+++ b/src/org/java/derekBanas/commandDP/PlayWithRemote.java
@@ -0,0 +1,76 @@
+package org.java.derekBanas.commandDP;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class PlayWithRemote {
+
+ public static void main(String[] args) {
+
+ ElectronicDevice newDevice = TvRemote.getDevice();
+
+ TurnTvOn onCommand = new TurnTvOn(newDevice);
+
+ DeviceButton onPressed = new DeviceButton(onCommand);
+
+ onPressed.press();
+
+ // -----------------
+
+ TurnTvOff offCommand = new TurnTvOff(newDevice);
+
+ onPressed = new DeviceButton(offCommand);
+
+ onPressed.press();
+
+ // -----------------
+
+ TurnVolumeUp volumeUpCommand = new TurnVolumeUp(newDevice);
+
+ onPressed = new DeviceButton(volumeUpCommand);
+
+ onPressed.press();
+ onPressed.press();
+ onPressed.press();
+
+ // -----------------
+
+ TurnVolumeDown volumeDownCommand = new TurnVolumeDown(newDevice);
+
+ onPressed = new DeviceButton(volumeDownCommand);
+
+ onPressed.press();
+ onPressed.press();
+ onPressed.press();
+ onPressed.press();
+ onPressed.press();
+ onPressed.press();
+ onPressed.press();
+
+ // -----------------
+
+ Televission theTv = new Televission();
+ Radio theRadio = new Radio();
+
+ List allDevices = new ArrayList();
+ allDevices.add(theRadio);
+ allDevices.add(theTv);
+
+ TurnItAllOff allOff = new TurnItAllOff(allDevices);
+
+ onPressed = new DeviceButton(allOff);
+
+ onPressed.press();
+
+ // -----------------
+
+
+ TurnItAllOff allUndo = new TurnItAllOff(allDevices);
+
+ onPressed = new DeviceButton(allUndo);
+
+ onPressed.pressUndo();
+
+ }
+
+}
diff --git a/src/org/java/derekBanas/commandDP/Radio.java b/src/org/java/derekBanas/commandDP/Radio.java
new file mode 100644
index 0000000..4d04db1
--- /dev/null
+++ b/src/org/java/derekBanas/commandDP/Radio.java
@@ -0,0 +1,41 @@
+package org.java.derekBanas.commandDP;
+
+public class Radio implements ElectronicDevice {
+
+private int volume = 0;
+
+
+ @Override
+ public void on() {
+ System.out.println("Radio is On");
+
+ }
+
+ @Override
+ public void off() {
+ System.out.println("Radio is Off");
+
+ }
+
+ @Override
+ public void volumeUp() {
+ volume++;
+ System.out.println("Radio volume is at: " + volume);
+
+ }
+
+ @Override
+ public void volumeDown() {
+ if(volume>0){
+ volume--;
+ System.out.println("Radio volume is at: " + volume);
+ }
+ else if(volume==0){
+ System.out.println("Radio volume is on Mute : " + volume);
+ }
+
+
+ }
+
+
+}
diff --git a/src/org/java/derekBanas/commandDP/Televission.java b/src/org/java/derekBanas/commandDP/Televission.java
new file mode 100644
index 0000000..9bc7d70
--- /dev/null
+++ b/src/org/java/derekBanas/commandDP/Televission.java
@@ -0,0 +1,40 @@
+package org.java.derekBanas.commandDP;
+
+public class Televission implements ElectronicDevice {
+
+ private int volume = 0;
+
+
+ @Override
+ public void on() {
+ System.out.println("TV is On");
+
+ }
+
+ @Override
+ public void off() {
+ System.out.println("TV is Off");
+
+ }
+
+ @Override
+ public void volumeUp() {
+ volume++;
+ System.out.println("TV volume is at: " + volume);
+
+ }
+
+ @Override
+ public void volumeDown() {
+ if(volume>0){
+ volume--;
+ System.out.println("TV volume is at: " + volume);
+ }
+ else if(volume==0){
+ System.out.println("TV volume is on Mute : " + volume);
+ }
+
+
+ }
+
+}
diff --git a/src/org/java/derekBanas/commandDP/TurnItAllOff.java b/src/org/java/derekBanas/commandDP/TurnItAllOff.java
new file mode 100644
index 0000000..5a12e1f
--- /dev/null
+++ b/src/org/java/derekBanas/commandDP/TurnItAllOff.java
@@ -0,0 +1,31 @@
+package org.java.derekBanas.commandDP;
+
+import java.util.List;
+
+public class TurnItAllOff implements Command {
+
+ List thedevices;
+
+ public TurnItAllOff(List newDevices) {
+ thedevices = newDevices;
+ }
+
+ @Override
+ public void execute() {
+ for(ElectronicDevice electronicDevice: thedevices){
+ electronicDevice.off();
+ }
+
+ }
+
+ @Override
+ public void undo() {
+
+ for(ElectronicDevice electronicDevice: thedevices){
+ electronicDevice.on();
+ }
+
+
+ }
+
+}
diff --git a/src/org/java/derekBanas/commandDP/TurnTvOff.java b/src/org/java/derekBanas/commandDP/TurnTvOff.java
new file mode 100644
index 0000000..e4a5fa7
--- /dev/null
+++ b/src/org/java/derekBanas/commandDP/TurnTvOff.java
@@ -0,0 +1,22 @@
+package org.java.derekBanas.commandDP;
+
+public class TurnTvOff implements Command {
+
+ private ElectronicDevice theDevice;
+
+ public TurnTvOff(ElectronicDevice newDevice) {
+ theDevice = newDevice;
+
+ }
+ @Override
+ public void execute() {
+ theDevice.off();
+
+ }
+ @Override
+ public void undo() {
+ theDevice.on();
+
+ }
+
+}
diff --git a/src/org/java/derekBanas/commandDP/TurnTvOn.java b/src/org/java/derekBanas/commandDP/TurnTvOn.java
new file mode 100644
index 0000000..41fc7b8
--- /dev/null
+++ b/src/org/java/derekBanas/commandDP/TurnTvOn.java
@@ -0,0 +1,23 @@
+package org.java.derekBanas.commandDP;
+
+public class TurnTvOn implements Command {
+
+
+ ElectronicDevice theDevice;
+
+ public TurnTvOn(ElectronicDevice newDevice) {
+ theDevice = newDevice;
+ }
+
+ @Override
+ public void execute() {
+ theDevice.on();
+ }
+
+ @Override
+ public void undo() {
+ theDevice.off();
+
+ }
+
+}
diff --git a/src/org/java/derekBanas/commandDP/TurnVolumeDown.java b/src/org/java/derekBanas/commandDP/TurnVolumeDown.java
new file mode 100644
index 0000000..8c8cf09
--- /dev/null
+++ b/src/org/java/derekBanas/commandDP/TurnVolumeDown.java
@@ -0,0 +1,23 @@
+package org.java.derekBanas.commandDP;
+
+public class TurnVolumeDown implements Command {
+
+ ElectronicDevice theDevice;
+
+ public TurnVolumeDown(ElectronicDevice newDevice) {
+ theDevice = newDevice;
+ }
+
+ @Override
+ public void execute() {
+ theDevice.volumeDown();
+
+ }
+
+ @Override
+ public void undo() {
+ theDevice.volumeUp();
+
+ }
+
+}
diff --git a/src/org/java/derekBanas/commandDP/TurnVolumeUp.java b/src/org/java/derekBanas/commandDP/TurnVolumeUp.java
new file mode 100644
index 0000000..c55a469
--- /dev/null
+++ b/src/org/java/derekBanas/commandDP/TurnVolumeUp.java
@@ -0,0 +1,21 @@
+package org.java.derekBanas.commandDP;
+
+public class TurnVolumeUp implements Command {
+
+ ElectronicDevice theDevice;
+
+ public TurnVolumeUp(ElectronicDevice newDevice) {
+ theDevice = newDevice;
+ }
+ @Override
+ public void execute() {
+ theDevice.volumeUp();
+
+ }
+ @Override
+ public void undo() {
+ theDevice.volumeDown();
+
+ }
+
+}
diff --git a/src/org/java/derekBanas/commandDP/TvRemote.java b/src/org/java/derekBanas/commandDP/TvRemote.java
new file mode 100644
index 0000000..8f4a5ca
--- /dev/null
+++ b/src/org/java/derekBanas/commandDP/TvRemote.java
@@ -0,0 +1,8 @@
+package org.java.derekBanas.commandDP;
+
+public class TvRemote {
+
+ public static ElectronicDevice getDevice(){
+ return new Televission();
+ }
+}
diff --git a/src/org/java/derekBanas/facadeDP/AccountNumberCheck.java b/src/org/java/derekBanas/facadeDP/AccountNumberCheck.java
new file mode 100644
index 0000000..101c14e
--- /dev/null
+++ b/src/org/java/derekBanas/facadeDP/AccountNumberCheck.java
@@ -0,0 +1,19 @@
+package org.java.derekBanas.facadeDP;
+
+public class AccountNumberCheck {
+
+ private int accountNumber = 12345678;
+
+ public int getAccountNumber(){
+ return accountNumber;
+ }
+
+ public boolean accountActive(int acctNumToCheck){
+ if(acctNumToCheck == getAccountNumber()){
+ return true;
+ }else{
+ return false;
+ }
+ }
+
+}
diff --git a/src/org/java/derekBanas/facadeDP/BankAccountFacade.java b/src/org/java/derekBanas/facadeDP/BankAccountFacade.java
new file mode 100644
index 0000000..3a7f329
--- /dev/null
+++ b/src/org/java/derekBanas/facadeDP/BankAccountFacade.java
@@ -0,0 +1,55 @@
+package org.java.derekBanas.facadeDP;
+
+public class BankAccountFacade {
+
+ private int accountNumber;
+ private int securityCode;
+
+ AccountNumberCheck accountNumberChecker;
+ SecurityCodeCheck securityCodeChecker;
+ FundCheck fundChecker;
+
+ WelcomeToBank welcomeToBank;
+
+ public BankAccountFacade(int newAcctNum, int newSecCode){
+
+ accountNumber = newAcctNum;
+ securityCode = newSecCode;
+
+ welcomeToBank = new WelcomeToBank();
+ accountNumberChecker = new AccountNumberCheck();
+ securityCodeChecker = new SecurityCodeCheck();
+ fundChecker = new FundCheck();
+ }
+
+ public int getAccountNumber(){
+ return accountNumber;
+ }
+
+ public int getSecurityCode(){
+ return securityCode;
+ }
+
+ public void withdrawCash(double cashToGet){
+ if(accountNumberChecker.accountActive(getAccountNumber())&&
+ securityCodeChecker.isCodeCorrect(getSecurityCode())&&
+ fundChecker.haveEnoughMoney(cashToGet)){
+
+ System.out.println("Transaction Cmplete \n");
+ }else{
+ System.out.println("Transaction Failed \n");
+ }
+ }
+
+ public void depositCash(double cashToDeposite){
+ if(accountNumberChecker.accountActive(getAccountNumber())&&
+ securityCodeChecker.isCodeCorrect(getSecurityCode())){
+ fundChecker.makeDeposite(cashToDeposite);
+ System.out.println("Transaction Cmplete \n");
+
+ }else{
+ System.out.println("Transaction Failed \n");
+ }
+ }
+
+}
diff --git a/src/org/java/derekBanas/facadeDP/Facade_DP_1.jpg b/src/org/java/derekBanas/facadeDP/Facade_DP_1.jpg
new file mode 100644
index 0000000..d311a80
Binary files /dev/null and b/src/org/java/derekBanas/facadeDP/Facade_DP_1.jpg differ
diff --git a/src/org/java/derekBanas/facadeDP/FundCheck.java b/src/org/java/derekBanas/facadeDP/FundCheck.java
new file mode 100644
index 0000000..0a0ea0b
--- /dev/null
+++ b/src/org/java/derekBanas/facadeDP/FundCheck.java
@@ -0,0 +1,36 @@
+package org.java.derekBanas.facadeDP;
+
+public class FundCheck {
+ private double cashInAccount = 1000.00;
+
+ public double getCashInAccount(){
+ return cashInAccount;
+ }
+
+ public void decreaseCashInAccount(double cashWithdrawn){
+ cashInAccount -= cashWithdrawn;
+ }
+
+ public void increaseCashInAccount(double cashDeposite){
+ cashInAccount += cashDeposite;
+ }
+
+ public boolean haveEnoughMoney(double cashToWithdrawal){
+ if(cashToWithdrawal > getCashInAccount()){
+ System.out.println("Error: You don't have enough money");
+ System.out.println("Current Balance: " + getCashInAccount());
+
+ return false;
+ }else{
+ decreaseCashInAccount(cashToWithdrawal);
+ System.out.println("Withdrawal Complete: Current balance is "+ getCashInAccount());
+
+ return true;
+ }
+ }
+
+ public void makeDeposite(double cashTodeposite){
+ increaseCashInAccount(cashTodeposite);
+ System.out.println("Deposite Complete: Current Balance is "+ getCashInAccount());
+ }
+}
diff --git a/src/org/java/derekBanas/facadeDP/SecurityCodeCheck.java b/src/org/java/derekBanas/facadeDP/SecurityCodeCheck.java
new file mode 100644
index 0000000..b334cf1
--- /dev/null
+++ b/src/org/java/derekBanas/facadeDP/SecurityCodeCheck.java
@@ -0,0 +1,19 @@
+ package org.java.derekBanas.facadeDP;
+
+public class SecurityCodeCheck {
+
+ private int securityCode = 1234;
+
+ public int getSecurityCode(){
+ return securityCode;
+ }
+
+ public boolean isCodeCorrect(int secCodeToCheck){
+ if(secCodeToCheck == getSecurityCode()){
+ return true;
+ }else{
+ return false;
+ }
+ }
+
+}
diff --git a/src/org/java/derekBanas/facadeDP/TestBankAccount.java b/src/org/java/derekBanas/facadeDP/TestBankAccount.java
new file mode 100644
index 0000000..171963b
--- /dev/null
+++ b/src/org/java/derekBanas/facadeDP/TestBankAccount.java
@@ -0,0 +1,16 @@
+package org.java.derekBanas.facadeDP;
+
+public class TestBankAccount {
+
+ public static void main(String[] args) {
+ BankAccountFacade accessingBank = new BankAccountFacade(12345678, 1234);
+
+ accessingBank.withdrawCash(50.00);
+
+ accessingBank.withdrawCash(900.00);
+
+ accessingBank.depositCash(200.00);
+
+ }
+
+}
diff --git a/src/org/java/derekBanas/facadeDP/WelcomeToBank.java b/src/org/java/derekBanas/facadeDP/WelcomeToBank.java
new file mode 100644
index 0000000..53d3544
--- /dev/null
+++ b/src/org/java/derekBanas/facadeDP/WelcomeToBank.java
@@ -0,0 +1,10 @@
+package org.java.derekBanas.facadeDP;
+
+public class WelcomeToBank {
+
+ public WelcomeToBank() {
+ System.out.println("Welcome to ABC Bank");
+ System.out.println("We are happy to give you your money if we can find it");
+ }
+
+}