Skip to content

Instantly share code, notes, and snippets.

@mihaeu
Last active June 2, 2016 19:19
Show Gist options
  • Save mihaeu/bde5dc5c91c963ae84d33b11fea64b15 to your computer and use it in GitHub Desktop.
Save mihaeu/bde5dc5c91c963ae84d33b11fea64b15 to your computer and use it in GitHub Desktop.
package ro.inf.prg2.uebung06.loesung;
import java.io.OutputStream;
import java.io.PrintStream;
import java.util.*;
/**
* =======================================================
* Singleton Pattern & Testing
* =======================================================
*/
public class Logger {
private static Logger instance = new Logger(System.out);
private PrintStream ps;
private Logger(PrintStream ps) {
this.ps = ps;
}
public static Logger getInstance() {
return instance;
}
public void setPs(PrintStream ps) {
this.ps = ps;
}
public void log(String message) {
ps.println(message);
}
}
class MockPrintStream extends PrintStream {
private String buffer;
public MockPrintStream(OutputStream out) {
super(out);
}
public String getBuffer() {
return buffer;
}
@Override
public void println(String x) {
buffer = x;
}
}
/**
* =======================================================
* Observer Pattern
* =======================================================
*/
class View extends Observable implements Observer {
private String htmlContent = "";
private List<Observer> observables;
public View() {
this.observables = new ArrayList<>();
}
public String getHtmlContent() {
return htmlContent;
}
public void setHtmlContent(String htmlContent) {
this.htmlContent = htmlContent;
}
@Override
public void update(Observable o, Object arg) {
htmlContent = (String) arg;
}
@Override
public synchronized void addObserver(Observer o) {
observables.add(o);
}
@Override
public void notifyObservers() {
observables.forEach(observer -> observer.update(this, htmlContent));
}
public void postData(String data) {
htmlContent += data;
}
}
/**
* Modern MVC as described here: https://developer.chrome.com/static/images/mvc.png
*
* Controller communicates between Model and View. Model and View don't know each other.
*/
class Controller implements Observer {
private View view;
private Model model;
public Controller(View view, Model model) {
this.view = view;
view.addObserver(this);
this.model = model;
model.addObserver(this);
}
@Override
public void update(Observable o, Object arg) {
if (o instanceof View) {
model.addData((String) arg);
} else {
view.postData((String) arg);
}
}
}
class Model extends Observable implements Observer {
private List<String> users;
private List<Observer> observables;
public List<String> getUsers() {
return users;
}
public void setUsers(List<String> users) {
this.users = users;
}
public Model() {
this.users = new ArrayList<>();
this.observables = new ArrayList<>();
}
@Override
public synchronized void addObserver(Observer o) {
observables.add(o);
}
@Override
public void update(Observable o, Object arg) {
users.add((String) arg);
}
@Override
public void notifyObservers() {
observables.forEach(observer -> observer.update(this, users.isEmpty() ? "" : users.get(users.size() - 1)));
}
public void addData(String data) {
users.add(data);
}
}
/**
* =======================================================
* Composite Pattern
* =======================================================
*/
abstract class Employee {
private String name;
private String department;
public Employee(String name, String department) {
this.name = name;
this.department = department;
}
public String getName() {
return name;
}
public String getDepartment() {
return department;
}
}
class Worker extends Employee {
public Worker(String name, String department) {
super(name, department);
}
}
class Boss extends Employee {
private String management;
private List<Employee> employees;
public Boss(String name, String department, String management) {
super(name, department);
this.management = management;
employees = new ArrayList<>();
}
public String getManagement() {
return management;
}
public void addEmployee(Employee employee) {
if (getManagement().equals(employee.getDepartment())) {
employees.add(employee);
return;
}
employees.forEach(employee1 -> {
if (employee1 instanceof Boss) {
((Boss) employee1).addEmployee(employee);
}
});
}
public int employeeCount() {
int count = 0;
for (Employee employee : employees) {
if (employee instanceof Worker) {
count += 1;
} else {
count += 1 + ((Boss) employee).employeeCount();
}
}
return count;
}
}
class Company {
private Boss ceo;
public Company() {
this.ceo = new Boss("Huettl", "FH", "FH");
}
public void addEmployee(Employee employee) {
ceo.addEmployee(employee);
}
public int employeeCount() {
return ceo.employeeCount();
}
}
/**
* =======================================================
* Tests
* =======================================================
*/
class Test {
public static void main(String... args) {
System.out.println("\nLogger");
testLogger();
System.out.println("\nComposite");
testComposite();
System.out.println("\nObserver");
testObserver();
}
private static void testObserver() {
Model model = new Model();
View view = new View();
Controller controller = new Controller(view, model);
model.addData("Test");
model.notifyObservers();
if (view.getHtmlContent().equals("Test")) {
System.out.println("Success");
} else {
System.out.println("Failure");
}
view.postData("TestView");
view.notifyObservers();
if (model.getUsers().size() == 2) {
System.out.println("Success");
} else {
System.out.println("Failure");
}
}
private static void testComposite() {
Company company = new Company();
company.addEmployee(new Boss("Beneken", "FH", "IT"));
company.addEmployee(new Worker("Original Michi", "IT"));
company.addEmployee(new Worker("Michi 1", "IT"));
company.addEmployee(new Boss("Slave Master", "IT", "SE2"));
company.addEmployee(new Worker("Praktikant 1", "SE2"));
company.addEmployee(new Worker("Praktikant 2", "SE2"));
if (company.employeeCount() == 6) {
System.out.println("Success");
} else {
System.out.println("Failure");
}
}
private static void testLogger() {
Logger logger = Logger.getInstance();
final MockPrintStream mockPrintStream = new MockPrintStream(System.out);
logger.setPs(mockPrintStream);
logger.log("test");
if (Objects.equals(mockPrintStream.getBuffer(), "test")) {
System.out.println("Success");
} else {
System.out.println("Failure");
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment