Compare commits

...

7 Commits

Author SHA1 Message Date
fd99c16e89 added builder example 2024-11-01 16:52:25 +01:00
8f38c89d7c added lab7 ex1 2024-11-01 16:51:39 +01:00
8cefde97d3 added lab7 ex2 2024-10-14 10:46:34 +02:00
876ce99c77 added state pattern example 2024-10-14 10:46:20 +02:00
6acdcaffa7 added lab6 ex1 2024-10-14 09:43:32 +02:00
061a475a6b added lab5 ex1 2024-10-14 09:15:25 +02:00
312a5276d7 added adapter example 2024-10-14 08:56:56 +02:00
41 changed files with 947 additions and 0 deletions

View File

@@ -0,0 +1,13 @@
package lab5_adapter.ex1;
public class Engineer {
private String name;
public Engineer(String name) {
this.name = name;
}
@Override
public String toString() {
return "Engineer " + name;
}
}

View File

@@ -0,0 +1,10 @@
package lab5_adapter.ex1;
public interface Machine {
int getNumberOfCapsules();
boolean isCompletelyUp();
void stop();
void setNumberOfCapsules(int capsules);
void setCompletelyUp(boolean completelyUp);
}

View File

@@ -0,0 +1,44 @@
package lab5_adapter.ex1;
public class MachineAdapter implements NewMachineInterface {
private OldMachine machine;
public MachineAdapter(OldMachine machine) {
this.machine = machine;
}
@Override
public int getNumberOfCapsules() {
return machine.getNumberOfCapsules();
}
@Override
public boolean isCompletelyUp() {
return machine.isCompletelyUp();
}
@Override
public void stop() {
machine.stop();
}
@Override
public void setNumberOfCapsules(int capsules) {
machine.setNumberOfCapsules(capsules);
}
@Override
public void setCompletelyUp(boolean completelyUp) {
machine.setCompletelyUp(completelyUp);
}
@Override
public Engineer getEngineer() {
return null;
}
@Override
public String toString() {
return machine.toString() + ", supervised by engineer " + getEngineer();
}
}

View File

@@ -0,0 +1,27 @@
package lab5_adapter.ex1;
public class Main {
public static void main(String[] args) {
Engineer engineer1 = new Engineer("Jean");
Engineer engineer2 = new Engineer("Maria");
Machine machine1 = new NewMachine("1159190947", engineer1);
Machine machine2 = new NewMachine("1247233941", engineer1);
Machine machine3 = new NewMachine("258952499", engineer2);
OldMachine oldMachine = new OldMachine("603742814");
Machine machine4 = new MachineAdapter(oldMachine);
machine1.setNumberOfCapsules(30);
machine2.setNumberOfCapsules(20);
machine3.setNumberOfCapsules(40);
oldMachine.setNumberOfCapsules(80);
//Machine 1159190947 is currently processing 30 capsules, supervised by engineer Engineer Jean
//Machine 1247233941 is currently processing 20 capsules, supervised by engineer Engineer Jean
//Machine 258952499 is currently processing 40 capsules, supervised by engineer Engineer Maria
//Machine 603742814 is currently processing 80 capsules, supervised by engineer null
System.out.println(machine1);
System.out.println(machine2);
System.out.println(machine3);
System.out.println(machine4);
}
}

View File

@@ -0,0 +1,19 @@
package lab5_adapter.ex1;
public class NewMachine extends OldMachine implements NewMachineInterface {
private Engineer engineer;
public NewMachine(String name, Engineer engineer) {
super(name);
this.engineer = engineer;
}
public Engineer getEngineer() {
return engineer;
}
@Override
public String toString() {
return super.toString() + ", supervised by engineer " + getEngineer();
}
}

View File

@@ -0,0 +1,5 @@
package lab5_adapter.ex1;
public interface NewMachineInterface extends Machine {
Engineer getEngineer();
}

View File

@@ -0,0 +1,39 @@
package lab5_adapter.ex1;
public class OldMachine implements Machine {
private String name;
private int capsules = 0;
private boolean completelyUp = false;
public OldMachine(String name) {
this.name = name;
}
public void setNumberOfCapsules(int capsules) {
this.capsules = capsules;
}
public void setCompletelyUp(boolean completelyUp) {
this.completelyUp = completelyUp;
}
@Override
public int getNumberOfCapsules() {
return capsules;
}
@Override
public boolean isCompletelyUp() {
return completelyUp;
}
@Override
public void stop() {
System.out.println("Stopping machine " + name);
}
@Override
public String toString() {
return "Machine " + name + " is currently processing " + getNumberOfCapsules() + " capsules";
}
}

View File

@@ -0,0 +1,32 @@
package lab6_template_method.ex1;
public class HellsKitchen extends Restaurant {
public HellsKitchen(String name) {
super("HK " + name);
}
@Override
public void prepareVegetables() {
log("Preparing nice salad");
}
@Override
public void prepareMainMenu() {
log("Creating flavorful dish");
}
@Override
public void prepareCheese() {
log("Preparing finest cheese");
}
@Override
public void prepareDessert() {
log("Giving birth to awesome dessert");
}
@Override
public void prepareCoffee() {
log("Brewing the best coffee");
}
}

View File

@@ -0,0 +1,32 @@
package lab6_template_method.ex1;
public class MacDonalds extends Restaurant {
public MacDonalds(String name) {
super("McDonalds " + name);
}
@Override
public void prepareVegetables() {
log("Vegetables ? What's that ?");
}
@Override
public void prepareMainMenu() {
log("McChicken incoming");
}
@Override
public void prepareCheese() {
log("Hmmm, creamy cheese");
}
@Override
public void prepareDessert() {
log("Preparing McFlurry");
}
@Override
public void prepareCoffee() {
log("Preparing short and hot coffee");
}
}

View File

@@ -0,0 +1,11 @@
package lab6_template_method.ex1;
public class Main {
public static void main(String[] args) {
Restaurant r1 = new MacDonalds("Sion");
Restaurant r2 = new HellsKitchen("London");
r1.prepareDinner();
r2.prepareDinner();
}
}

View File

@@ -0,0 +1,36 @@
package lab6_template_method.ex1;
public abstract class Restaurant {
private String name;
public Restaurant(String name) {
this.name = name;
}
public final void prepareDinner() {
serveWater();
prepareVegetables();
prepareMainMenu();
prepareCheese();
prepareDessert();
prepareCoffee();
cleanTable();
}
protected void log(String msg) {
System.out.println("[" + name + "] " + msg);
}
protected final void serveWater() {
log("Serving water");
}
protected final void cleanTable() {
log("Cleaning table");
}
protected abstract void prepareVegetables();
protected abstract void prepareMainMenu();
protected abstract void prepareCheese();
protected abstract void prepareDessert();
protected abstract void prepareCoffee();
}

View File

@@ -0,0 +1,101 @@
package lab7_state.ex1;
import lab7_state.ex1.states.*;
public class Machine {
private MachineState currentState;
private final MachineState offState;
private final MachineState idleState;
private final MachineState choiceState;
private final MachineState serviceNeededState;
private final MachineState coffeeReadyState;
private int cups;
private boolean jammed = false;
public Machine() {
offState = new OffState(this);
idleState = new IdleState(this);
choiceState = new ChoiceState(this);
serviceNeededState = new ServiceNeededState(this);
coffeeReadyState = new CoffeeReadyState(this);
currentState = offState;
this.setCups(3);
}
public MachineState getOffState() {
return offState;
}
public MachineState getIdleState() {
return idleState;
}
public MachineState getChoiceState() {
return choiceState;
}
public MachineState getServiceNeededState() {
return serviceNeededState;
}
public MachineState getCoffeeReadyState() {
return coffeeReadyState;
}
public void returnMoney(double value) {
System.out.println("Returning CHF " + value);
}
public void setCurrentState(MachineState currentState) {
System.out.println(this.currentState.toString() + " -> " + currentState);
this.currentState = currentState;
}
public void powerUp() {
currentState.powerUp();
}
public void insertCoin(double value) {
currentState.insertCoin(value);
}
public void returnCoin() {
currentState.returnCoin();
}
public void pushButton() {
currentState.pushButton();
}
public void resetButton() {
currentState.reset();
}
public void removeCup() {
currentState.removeCup();
}
public void setCups(int cups) {
this.cups = cups;
}
public boolean hasCups() {
return cups != 0;
}
public boolean hasCoffee() {
return true;
}
public boolean isJammed() {
return jammed;
}
public void makeCoffee() {
cups--;
if (Math.random() < 0.2) {
jammed = true;
}
}
}

View File

@@ -0,0 +1,21 @@
package lab7_state.ex1;
public abstract class MachineState {
protected Machine machine;
public MachineState(Machine machine) {
this.machine = machine;
}
protected void powerUp() {}
protected void insertCoin(double value) {}
protected void returnCoin() {}
protected void reset() {}
protected void pushButton() {}
protected void removeCup() {}
@Override
public String toString() {
return getClass().getSimpleName();
}
}

View File

@@ -0,0 +1,29 @@
package lab7_state.ex1;
public class Main {
public static void main(String[] args) {
Machine machine = new Machine();
System.out.println("A");
machine.powerUp();
machine.insertCoin(1);
System.out.println("B");
machine.insertCoin(0.25);
machine.returnCoin();
System.out.println("C");
machine.insertCoin(0.25);
machine.pushButton();
machine.removeCup();
for (int i = 0; i < 4; i++) {
System.out.println("D" + i);
machine.insertCoin(0.25);
machine.pushButton();
machine.removeCup();
}
System.out.println("E");
machine.resetButton();
}
}

View File

@@ -0,0 +1,32 @@
package lab7_state.ex1.states;
import lab7_state.ex1.Machine;
import lab7_state.ex1.MachineState;
public class ChoiceState extends MachineState {
public ChoiceState(Machine machine) {
super(machine);
}
@Override
protected void returnCoin() {
machine.returnMoney(0.25);
machine.setCurrentState(machine.getIdleState());
}
@Override
protected void pushButton() {
if (!machine.hasCups()) {
System.out.println("The machine is out of cups");
} else if (!machine.hasCoffee()) {
System.out.println("The machine is out of coffee beans");
} else if (machine.isJammed()) {
System.out.println("The machine is jammed");
} else {
machine.makeCoffee();
machine.setCurrentState(machine.getCoffeeReadyState());
return;
}
machine.setCurrentState(machine.getServiceNeededState());
}
}

View File

@@ -0,0 +1,15 @@
package lab7_state.ex1.states;
import lab7_state.ex1.Machine;
import lab7_state.ex1.MachineState;
public class CoffeeReadyState extends MachineState {
public CoffeeReadyState(Machine machine) {
super(machine);
}
@Override
protected void removeCup() {
machine.setCurrentState(machine.getIdleState());
}
}

View File

@@ -0,0 +1,20 @@
package lab7_state.ex1.states;
import lab7_state.ex1.Machine;
import lab7_state.ex1.MachineState;
public class IdleState extends MachineState {
public IdleState(Machine machine) {
super(machine);
}
@Override
protected void insertCoin(double value) {
if (value != 0.25) {
machine.returnMoney(value);
} else {
System.out.println("Please choose your coffee");
machine.setCurrentState(machine.getChoiceState());
}
}
}

View File

@@ -0,0 +1,15 @@
package lab7_state.ex1.states;
import lab7_state.ex1.Machine;
import lab7_state.ex1.MachineState;
public class OffState extends MachineState {
public OffState(Machine machine) {
super(machine);
}
@Override
protected void powerUp() {
machine.setCurrentState(machine.getIdleState());
}
}

View File

@@ -0,0 +1,15 @@
package lab7_state.ex1.states;
import lab7_state.ex1.Machine;
import lab7_state.ex1.MachineState;
public class ServiceNeededState extends MachineState {
public ServiceNeededState(Machine machine) {
super(machine);
}
@Override
protected void reset() {
machine.setCurrentState(machine.getIdleState());
}
}

View File

@@ -0,0 +1,25 @@
package lab7_state.ex2;
public class Main {
public static void main(String[] args) {
User user = new User("Baryhobal");
user.connect();
user.enter();
user.leave();
user.enter();
user.ask();
user.leave();
user.enter();
user.ask();
user.handOver();
user.leave();
user.enter();
user.ask();
user.handOver();
user.over();
user.leave();
}
}

View File

@@ -0,0 +1,71 @@
package lab7_state.ex2;
import lab7_state.ex2.states.*;
public class User {
private String name;
private UserState currentState;
private UserState unregisteredState;
private UserState registeredState;
private UserState inMeetingState;
private UserState waitingToSpeakState;
private UserState speakingState;
public User(String name) {
this.name = name;
unregisteredState = new UnregisteredState(this);
registeredState = new RegisteredState(this);
inMeetingState = new InMeetingState(this);
waitingToSpeakState = new WaitingToSpeakState(this);
speakingState = new SpeakingState(this);
currentState = unregisteredState;
}
public void setCurrentState(UserState currentState) {
this.currentState = currentState;
}
public UserState getUnregisteredState() {
return unregisteredState;
}
public UserState getRegisteredState() {
return registeredState;
}
public UserState getInMeetingState() {
return inMeetingState;
}
public UserState getWaitingToSpeakState() {
return waitingToSpeakState;
}
public UserState getSpeakingState() {
return speakingState;
}
public void connect() {
currentState.connect();
}
public void enter() {
currentState.enter();
}
public void leave() {
currentState.leave();
}
public void ask() {
currentState.ask();
}
public void handOver() {
currentState.handOver();
}
public void over() {
currentState.over();
}
@Override
public String toString() {
return "User " + name;
}
}

View File

@@ -0,0 +1,18 @@
package lab7_state.ex2;
public abstract class UserState {
protected User user;
public UserState(User user) {
this.user = user;
}
protected void log(String msg) {
System.out.println("[" + user + "] " + msg);
}
public void connect() {};
public void enter() {};
public void leave() {};
public void ask() {};
public void handOver() {};
public void over() {};
}

View File

@@ -0,0 +1,22 @@
package lab7_state.ex2.states;
import lab7_state.ex2.User;
import lab7_state.ex2.UserState;
public class InMeetingState extends UserState {
public InMeetingState(User user) {
super(user);
}
@Override
public void leave() {
user.setCurrentState(user.getRegisteredState());
log("Left meeting");
}
@Override
public void ask() {
user.setCurrentState(user.getWaitingToSpeakState());
log("Asking to speak");
}
}

View File

@@ -0,0 +1,16 @@
package lab7_state.ex2.states;
import lab7_state.ex2.User;
import lab7_state.ex2.UserState;
public class RegisteredState extends UserState {
public RegisteredState(User user) {
super(user);
}
@Override
public void enter() {
user.setCurrentState(user.getInMeetingState());
log("Entered meeting");
}
}

View File

@@ -0,0 +1,22 @@
package lab7_state.ex2.states;
import lab7_state.ex2.User;
import lab7_state.ex2.UserState;
public class SpeakingState extends UserState {
public SpeakingState(User user) {
super(user);
}
@Override
public void over() {
user.setCurrentState(user.getInMeetingState());
log("Finished speaking");
}
@Override
public void leave() {
user.setCurrentState(user.getRegisteredState());
log("Finished speaking, left meeting");
}
}

View File

@@ -0,0 +1,16 @@
package lab7_state.ex2.states;
import lab7_state.ex2.User;
import lab7_state.ex2.UserState;
public class UnregisteredState extends UserState {
public UnregisteredState(User user) {
super(user);
}
@Override
public void connect() {
user.setCurrentState(user.getRegisteredState());
log("Registered");
}
}

View File

@@ -0,0 +1,22 @@
package lab7_state.ex2.states;
import lab7_state.ex2.User;
import lab7_state.ex2.UserState;
public class WaitingToSpeakState extends UserState {
public WaitingToSpeakState(User user) {
super(user);
}
@Override
public void leave() {
user.setCurrentState(user.getRegisteredState());
log("Lost patience, left meeting");
}
@Override
public void handOver() {
user.setCurrentState(user.getSpeakingState());
log("Starts speaking");
}
}

View File

@@ -0,0 +1,7 @@
package learn.simple_adapter;
public class Adaptee {
public void specificRequest() {
System.out.println("Specific Request");
}
}

View File

@@ -0,0 +1,14 @@
package learn.simple_adapter;
public class Adapter implements Target {
private Adaptee adaptee;
public Adapter(Adaptee adaptee) {
this.adaptee = adaptee;
}
@Override
public void request() {
adaptee.specificRequest();
}
}

View File

@@ -0,0 +1,9 @@
package learn.simple_adapter;
public class Main {
public static void main(String[] args) {
Adaptee adaptee = new Adaptee();
Target adapter = new Adapter(adaptee);
adapter.request();
}
}

View File

@@ -0,0 +1,5 @@
package learn.simple_adapter;
public interface Target {
void request();
}

View File

@@ -0,0 +1,16 @@
package learn.simple_builder;
public abstract class Builder {
protected Product product;
public void setProduct(Product product) {
this.product = product;
}
public Product getProduct() {
return product;
}
public abstract void buildPartA();
public abstract void buildPartB();
public abstract void buildPartC();
}

View File

@@ -0,0 +1,18 @@
package learn.simple_builder;
public class ConcreteBuilder extends Builder {
@Override
public void buildPartA() {
product.setPartA("material 1");
}
@Override
public void buildPartB() {
product.setPartB("material 2");
}
@Override
public void buildPartC() {
product.setPartC("material 3");
}
}

View File

@@ -0,0 +1,18 @@
package learn.simple_builder;
public class Director {
private Builder builder;
private Product product;
public void setBuilder(Builder builder) {
this.builder = builder;
product = new Product();
this.builder.setProduct(product);
}
public void construct() {
builder.buildPartA();
builder.buildPartB();
builder.buildPartC();
}
}

View File

@@ -0,0 +1,12 @@
package learn.simple_builder;
public class Main {
public static void main(String[] args) {
Builder builder = new ConcreteBuilder();
Director director = new Director();
director.setBuilder(builder);
director.construct();
Product finalProduct = builder.getProduct();
System.out.println(finalProduct);
}
}

View File

@@ -0,0 +1,28 @@
package learn.simple_builder;
public class Product {
private String partA;
private String partB;
private String partC;
@Override
public String toString() {
return "Product{" +
"partA='" + partA + '\'' +
", partB='" + partB + '\'' +
", partC='" + partC + '\'' +
'}';
}
public void setPartA(String partA) {
this.partA = partA;
}
public void setPartB(String partB) {
this.partB = partB;
}
public void setPartC(String partC) {
this.partC = partC;
}
}

View File

@@ -0,0 +1,34 @@
package learn.simple_state;
public class Context {
private State onState;
private State offState;
private State currentState;
public Context() {
onState = new OnState(this);
offState = new OffState(this);
currentState = offState;
}
public void setCurrentState(State currentState) {
this.currentState = currentState;
}
public State getOffState() {
return offState;
}
public State getOnState() {
return onState;
}
public void on() {
currentState.on();
}
public void off() {
currentState.off();
}
}

View File

@@ -0,0 +1,12 @@
package learn.simple_state;
public class Main {
public static void main(String[] args) {
Context context = new Context();
context.off();
context.off();
context.on();
context.on();
context.off();
}
}

View File

@@ -0,0 +1,20 @@
package learn.simple_state;
public class OffState implements State {
private Context context;
public OffState(Context context) {
this.context = context;
}
@Override
public void on() {
context.setCurrentState(context.getOnState());
System.out.println("Transition to on");
}
@Override
public void off() {
System.out.println("Already off");
}
}

View File

@@ -0,0 +1,20 @@
package learn.simple_state;
public class OnState implements State {
private Context context;
public OnState(Context context) {
this.context = context;
}
@Override
public void on() {
System.out.println("Already on");
}
@Override
public void off() {
context.setCurrentState(context.getOffState());
System.out.println("Transition to off");
}
}

View File

@@ -0,0 +1,6 @@
package learn.simple_state;
public interface State {
void on();
void off();
}