Last active
June 2, 2016 19:19
-
-
Save mihaeu/bde5dc5c91c963ae84d33b11fea64b15 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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