Compare commits
7 Commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
6bcf48a5f6 | ||
![]() |
221d9cb5d8 | ||
![]() |
fcc25f0c21 | ||
b1b8db8065 | |||
49a4e61738 | |||
5fc0f28281 | |||
5b45264ce0 |
BIN
SQ - Exercise 7.pdf
Normal file
BIN
SQ - Exercise 7.pdf
Normal file
Binary file not shown.
1
ueb07_news_example/.gitignore
vendored
Normal file
1
ueb07_news_example/.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
||||
/out/
|
8
ueb07_news_example/.idea/.gitignore
generated
vendored
Normal file
8
ueb07_news_example/.idea/.gitignore
generated
vendored
Normal file
@ -0,0 +1,8 @@
|
||||
# Default ignored files
|
||||
/shelf/
|
||||
/workspace.xml
|
||||
# Editor-based HTTP Client requests
|
||||
/httpRequests/
|
||||
# Datasource local storage ignored files
|
||||
/dataSources/
|
||||
/dataSources.local.xml
|
6
ueb07_news_example/.idea/misc.xml
generated
Normal file
6
ueb07_news_example/.idea/misc.xml
generated
Normal file
@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="ProjectRootManager" version="2" languageLevel="JDK_17" default="true" project-jdk-name="jbr-17" project-jdk-type="JavaSDK">
|
||||
<output url="file://$PROJECT_DIR$/out" />
|
||||
</component>
|
||||
</project>
|
8
ueb07_news_example/.idea/modules.xml
generated
Normal file
8
ueb07_news_example/.idea/modules.xml
generated
Normal file
@ -0,0 +1,8 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="ProjectModuleManager">
|
||||
<modules>
|
||||
<module fileurl="file://$PROJECT_DIR$/ueb07_news_example.iml" filepath="$PROJECT_DIR$/ueb07_news_example.iml" />
|
||||
</modules>
|
||||
</component>
|
||||
</project>
|
6
ueb07_news_example/.idea/vcs.xml
generated
Normal file
6
ueb07_news_example/.idea/vcs.xml
generated
Normal file
@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="VcsDirectoryMappings">
|
||||
<mapping directory="$PROJECT_DIR$/.." vcs="Git" />
|
||||
</component>
|
||||
</project>
|
@ -1,8 +1,6 @@
|
||||
package client;
|
||||
|
||||
import model.Article;
|
||||
import model.Image;
|
||||
import model.NewsCollection;
|
||||
import model.*;
|
||||
|
||||
public class Client {
|
||||
|
||||
@ -20,9 +18,13 @@ public class Client {
|
||||
.addItem(new Image("Missing cat", 1280, 720, "anonymous")));
|
||||
|
||||
System.out.println("\n===List===\n");
|
||||
System.out.print(masterCollection.getOverviewInformation());
|
||||
StringBuilder sb = new StringBuilder();
|
||||
masterCollection.accept(new OverviewPrinter(sb));
|
||||
System.out.print(sb);
|
||||
System.out.println("\n===Contents===\n");
|
||||
System.out.print(masterCollection.getDetailedInformation());
|
||||
sb = new StringBuilder();
|
||||
masterCollection.accept(new DetailedPrinter(sb));
|
||||
System.out.print(sb);
|
||||
System.out.println("\n===After change===\n");
|
||||
|
||||
changedArticle.setTitle("Harder, Better, Faster, Stronger? Doping controls loosened");
|
||||
|
@ -21,6 +21,11 @@ public class Article extends NewsItem {
|
||||
this.author = author;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void accept(NewsItemVisitor visitor) {
|
||||
visitor.visit(this);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the author of the article.
|
||||
* @return author
|
||||
@ -36,19 +41,4 @@ public class Article extends NewsItem {
|
||||
public String getContent() {
|
||||
return content;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getOverviewInformation() {
|
||||
return "Article: " + this.getTitle() + ", Author: " + this.getAuthor();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getDetailedInformation() {
|
||||
StringBuilder builder = new StringBuilder();
|
||||
builder.append("###" + this.getTitle() + "###");
|
||||
builder.append("\n");
|
||||
builder.append(this.getContent());
|
||||
builder.append("\n");
|
||||
return builder.toString();
|
||||
}
|
||||
}
|
||||
|
50
ueb07_news_example/src/model/DetailedPrinter.java
Normal file
50
ueb07_news_example/src/model/DetailedPrinter.java
Normal file
@ -0,0 +1,50 @@
|
||||
package model;
|
||||
|
||||
public class DetailedPrinter implements NewsItemVisitor {
|
||||
StringBuilder sb;
|
||||
|
||||
public DetailedPrinter(StringBuilder sb) {
|
||||
this.sb = sb;
|
||||
}
|
||||
|
||||
/**
|
||||
* Print details about news article.
|
||||
*/
|
||||
@Override
|
||||
public void visit(final Article article) {
|
||||
sb.append("###")
|
||||
.append(article.getTitle())
|
||||
.append("###");
|
||||
sb.append("\n");
|
||||
sb.append(article.getContent());
|
||||
sb.append("\n");
|
||||
}
|
||||
|
||||
/**
|
||||
* Print details about image.
|
||||
*/
|
||||
@Override
|
||||
public void visit(final Image image) {
|
||||
sb.append("###")
|
||||
.append(image.getTitle())
|
||||
.append("###");
|
||||
sb.append("\n");
|
||||
sb.append(image.renderToString());
|
||||
sb.append("\n");
|
||||
}
|
||||
|
||||
/**
|
||||
* Print details about news collection.
|
||||
*/
|
||||
@Override
|
||||
public void visit(final NewsCollection collection) {
|
||||
sb.append("###")
|
||||
.append(collection.getTitle())
|
||||
.append("###");
|
||||
sb.append("\n");
|
||||
for (NewsItem item : collection.getNewsItems()) {
|
||||
item.accept(this);
|
||||
sb.append("\n");
|
||||
}
|
||||
}
|
||||
}
|
@ -20,6 +20,11 @@ public class Image extends NewsItem {
|
||||
this.author = author;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void accept(NewsItemVisitor visitor) {
|
||||
visitor.visit(this);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the author of the image.
|
||||
* @return author
|
||||
@ -54,26 +59,4 @@ public class Image extends NewsItem {
|
||||
*/
|
||||
return " /\\_/\\ \n( o.o )\n > ^ < ";
|
||||
}
|
||||
|
||||
/**
|
||||
* Print a list showing information about all directly or transitively
|
||||
* referenced items in the given collection.
|
||||
*/
|
||||
@Override
|
||||
public String getOverviewInformation() {
|
||||
return "Image: " + this.getTitle()
|
||||
+ ", Resolution: " + this.getWidth()
|
||||
+ "x" + this.getHeight()
|
||||
+ ", Author: " + this.getAuthor();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getDetailedInformation() {
|
||||
StringBuilder builder = new StringBuilder();
|
||||
builder.append("###" + this.getTitle() + "###");
|
||||
builder.append("\n");
|
||||
builder.append(renderToString());
|
||||
builder.append("\n");
|
||||
return builder.toString();
|
||||
}
|
||||
}
|
||||
|
@ -11,6 +11,11 @@ public class NewsCollection extends NewsItem {
|
||||
this.title = topic;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void accept(NewsItemVisitor visitor) {
|
||||
visitor.visit(this);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the list of items stored in this collection.
|
||||
* @return items stored in this collection
|
||||
@ -28,31 +33,4 @@ public class NewsCollection extends NewsItem {
|
||||
newsItems.add(item);
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Print a list showing information about all directly or transitively
|
||||
* referenced items in the given collection.
|
||||
*/
|
||||
public String getOverviewInformation() {
|
||||
StringBuilder builder = new StringBuilder();
|
||||
builder.append("###" + this.getTitle() + "###");
|
||||
builder.append("\n");
|
||||
for (NewsItem item : this.getNewsItems()) {
|
||||
builder.append(item.getOverviewInformation());
|
||||
builder.append("\n");
|
||||
}
|
||||
return builder.toString();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getDetailedInformation() {
|
||||
StringBuilder builder = new StringBuilder();
|
||||
builder.append("###" + this.getTitle() + "###");
|
||||
builder.append("\n");
|
||||
for (NewsItem item : this.getNewsItems()) {
|
||||
builder.append(item.getDetailedInformation());
|
||||
builder.append("\n");
|
||||
}
|
||||
return builder.toString();
|
||||
}
|
||||
}
|
||||
|
@ -8,6 +8,8 @@ public abstract class NewsItem {
|
||||
super();
|
||||
}
|
||||
|
||||
public abstract void accept(NewsItemVisitor visitor);
|
||||
|
||||
/**
|
||||
* Get the topic of the collection.
|
||||
* @return
|
||||
@ -19,14 +21,4 @@ public abstract class NewsItem {
|
||||
public void setTitle(String newTitle) {
|
||||
title = newTitle;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get overview information about the news item.
|
||||
*/
|
||||
public abstract String getOverviewInformation();
|
||||
|
||||
/**
|
||||
* Get the contents of the news item.
|
||||
*/
|
||||
public abstract String getDetailedInformation();
|
||||
}
|
7
ueb07_news_example/src/model/NewsItemVisitor.java
Normal file
7
ueb07_news_example/src/model/NewsItemVisitor.java
Normal file
@ -0,0 +1,7 @@
|
||||
package model;
|
||||
|
||||
public interface NewsItemVisitor {
|
||||
void visit(final Article article);
|
||||
void visit(final Image image);
|
||||
void visit(final NewsCollection collection);
|
||||
}
|
52
ueb07_news_example/src/model/OverviewPrinter.java
Normal file
52
ueb07_news_example/src/model/OverviewPrinter.java
Normal file
@ -0,0 +1,52 @@
|
||||
package model;
|
||||
|
||||
public class OverviewPrinter implements NewsItemVisitor {
|
||||
final StringBuilder sb;
|
||||
|
||||
/**
|
||||
* @param sb StringBuilder to print overview into.
|
||||
*/
|
||||
public OverviewPrinter(StringBuilder sb) {
|
||||
this.sb = sb;
|
||||
}
|
||||
|
||||
/**
|
||||
* Print overview about news article.
|
||||
*/
|
||||
@Override
|
||||
public void visit(final Article article) {
|
||||
sb.append("Article: ")
|
||||
.append(article.getTitle())
|
||||
.append(", Author: ")
|
||||
.append(article.getAuthor());
|
||||
}
|
||||
|
||||
/**
|
||||
* Print overview about image.
|
||||
*/
|
||||
@Override
|
||||
public void visit(final Image image) {
|
||||
sb.append("Image: ")
|
||||
.append(image.getTitle())
|
||||
.append(", Resolution: ")
|
||||
.append(image.getWidth())
|
||||
.append("x")
|
||||
.append(image.getHeight())
|
||||
.append(", Author: ")
|
||||
.append(image.getAuthor());
|
||||
}
|
||||
|
||||
/**
|
||||
* Print overview about news collection.
|
||||
*/
|
||||
@Override
|
||||
public void visit(final NewsCollection collection) {
|
||||
sb.append("###")
|
||||
.append(collection.getTitle())
|
||||
.append("###\n");
|
||||
for (NewsItem item : collection.getNewsItems()) {
|
||||
item.accept(this);
|
||||
sb.append("\n");
|
||||
}
|
||||
}
|
||||
}
|
11
ueb07_news_example/ueb07_news_example.iml
Normal file
11
ueb07_news_example/ueb07_news_example.iml
Normal file
@ -0,0 +1,11 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<module type="JAVA_MODULE" version="4">
|
||||
<component name="NewModuleRootManager" inherit-compiler-output="true">
|
||||
<exclude-output />
|
||||
<content url="file://$MODULE_DIR$">
|
||||
<sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
|
||||
</content>
|
||||
<orderEntry type="inheritedJdk" />
|
||||
<orderEntry type="sourceFolder" forTests="false" />
|
||||
</component>
|
||||
</module>
|
@ -4,10 +4,19 @@ import model.Article;
|
||||
import model.Image;
|
||||
import model.NewsCollection;
|
||||
|
||||
public class Client {
|
||||
import java.util.Observable;
|
||||
import java.util.Observer;
|
||||
|
||||
public class Client implements Observer {
|
||||
|
||||
public static void main(String[] args) {
|
||||
Client client = new Client();
|
||||
client.run();
|
||||
}
|
||||
|
||||
public void run() {
|
||||
NewsCollection masterCollection = new NewsCollection("Daily news");
|
||||
masterCollection.addObserver(this);
|
||||
|
||||
Article changedArticle = new Article("Harder, Better, Faster, Stronger. Doping controls loosened","ups");
|
||||
|
||||
@ -23,9 +32,18 @@ public class Client {
|
||||
System.out.print(masterCollection.getOverviewInformation());
|
||||
System.out.println("\n===Contents===\n");
|
||||
System.out.print(masterCollection.getDetailedInformation());
|
||||
|
||||
masterCollection.addObserver(this);
|
||||
|
||||
System.out.println("\n===After change===\n");
|
||||
|
||||
changedArticle.setTitle("Harder, Better, Faster, Stronger? Doping controls loosened");
|
||||
masterCollection.addItem(new Image("A tasty cat", 640, 480, "alf"));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void update(Observable o, Object arg) {
|
||||
System.out.println("### UPDATE ###");
|
||||
System.out.println(arg);
|
||||
}
|
||||
}
|
||||
|
@ -1,16 +1,29 @@
|
||||
package model;
|
||||
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
import java.util.*;
|
||||
|
||||
public class NewsCollection extends NewsItem {
|
||||
|
||||
private Set<Observer> observers = new HashSet<>();
|
||||
private List<NewsItem> newsItems = new LinkedList<NewsItem>();
|
||||
|
||||
public NewsCollection(String topic) {
|
||||
this.title = topic;
|
||||
}
|
||||
|
||||
@Override
|
||||
public synchronized void addObserver(Observer o) {
|
||||
super.addObserver(o);
|
||||
observers.add(o);
|
||||
newsItems.forEach(i -> i.addObserver(o));
|
||||
}
|
||||
|
||||
@Override
|
||||
public synchronized void deleteObserver(Observer o) {
|
||||
super.deleteObserver(o);
|
||||
observers.remove(o);
|
||||
newsItems.forEach(i -> i.deleteObserver(o));
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the list of items stored in this collection.
|
||||
* @return items stored in this collection
|
||||
@ -25,7 +38,11 @@ public class NewsCollection extends NewsItem {
|
||||
* @return this collection (enables method chaining)
|
||||
*/
|
||||
public NewsCollection addItem(NewsItem item) {
|
||||
String updateNotification = getTitle() + "\n+ " + item.getTitle() + "\n";
|
||||
newsItems.add(item);
|
||||
setChanged();
|
||||
notifyObservers(updateNotification);
|
||||
observers.forEach(item::addObserver);
|
||||
return this;
|
||||
}
|
||||
|
||||
|
@ -1,6 +1,8 @@
|
||||
package model;
|
||||
|
||||
public abstract class NewsItem {
|
||||
import java.util.Observable;
|
||||
|
||||
public abstract class NewsItem extends Observable {
|
||||
|
||||
protected String title;
|
||||
|
||||
@ -17,7 +19,10 @@ public abstract class NewsItem {
|
||||
}
|
||||
|
||||
public void setTitle(String newTitle) {
|
||||
String updateNotification = "- " + title + "\n+ " + newTitle + "\n";
|
||||
title = newTitle;
|
||||
setChanged();
|
||||
notifyObservers(updateNotification);
|
||||
}
|
||||
|
||||
/**
|
||||
|
Loading…
x
Reference in New Issue
Block a user