Compare commits
5 Commits
main
...
ueb07-dani
Author | SHA1 | Date | |
---|---|---|---|
a30c457c41 | |||
fab514a41e | |||
945b313529 | |||
b1b8db8065 | |||
49a4e61738 |
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>
|
1
ueb07_news_example_b/.gitignore
vendored
Normal file
1
ueb07_news_example_b/.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
||||
/out/
|
8
ueb07_news_example_b/.idea/.gitignore
generated
vendored
Normal file
8
ueb07_news_example_b/.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_b/.idea/misc.xml
generated
Normal file
6
ueb07_news_example_b/.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_b/.idea/modules.xml
generated
Normal file
8
ueb07_news_example_b/.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_b.iml" filepath="$PROJECT_DIR$/ueb07_news_example_b.iml" />
|
||||
</modules>
|
||||
</component>
|
||||
</project>
|
6
ueb07_news_example_b/.idea/vcs.xml
generated
Normal file
6
ueb07_news_example_b/.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>
|
@ -4,10 +4,18 @@ import model.Article;
|
||||
import model.Image;
|
||||
import model.NewsCollection;
|
||||
|
||||
public class Client {
|
||||
import java.util.Observable;
|
||||
import java.util.Observer;
|
||||
|
||||
public static void main(String[] args) {
|
||||
public class Client implements Observer {
|
||||
public static void main(String[] args) {
|
||||
Client client = new Client();
|
||||
client.run();
|
||||
}
|
||||
|
||||
private void run() {
|
||||
NewsCollection masterCollection = new NewsCollection("Daily news");
|
||||
masterCollection.addObserver(this);
|
||||
|
||||
Article changedArticle = new Article("Harder, Better, Faster, Stronger. Doping controls loosened","ups");
|
||||
|
||||
@ -28,4 +36,9 @@ public class Client {
|
||||
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 ###\n" + arg + "\n");
|
||||
}
|
||||
}
|
||||
|
@ -1,17 +1,40 @@
|
||||
package model;
|
||||
|
||||
import java.util.HashSet;
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
import java.util.Observer;
|
||||
import java.util.Set;
|
||||
|
||||
public class NewsCollection extends NewsItem {
|
||||
|
||||
private List<NewsItem> newsItems = new LinkedList<NewsItem>();
|
||||
private List<NewsItem> newsItems = new LinkedList<>();
|
||||
|
||||
// We use a set to avoid duplicates.
|
||||
Set<Observer> observers = new HashSet<>();
|
||||
|
||||
public NewsCollection(String topic) {
|
||||
this.title = topic;
|
||||
}
|
||||
|
||||
/**
|
||||
@Override
|
||||
public void addObserver(Observer o) {
|
||||
super.addObserver(o);
|
||||
newsItems.forEach(item -> item.addObserver(o));
|
||||
|
||||
// Remember for later.
|
||||
observers.add(o);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void deleteObserver(Observer o){
|
||||
super.deleteObserver(o);
|
||||
newsItems.forEach(item -> item.deleteObserver(o));
|
||||
|
||||
observers.remove(o);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the list of items stored in this collection.
|
||||
* @return items stored in this collection
|
||||
*/
|
||||
@ -26,6 +49,11 @@ public class NewsCollection extends NewsItem {
|
||||
*/
|
||||
public NewsCollection addItem(NewsItem item) {
|
||||
newsItems.add(item);
|
||||
|
||||
observers.forEach(item::addObserver);
|
||||
setChanged();
|
||||
notifyObservers(getTitle() + "\n➕ " + item.getTitle());
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
|
@ -1,7 +1,8 @@
|
||||
package model;
|
||||
|
||||
public abstract class NewsItem {
|
||||
import java.util.Observable;
|
||||
|
||||
public abstract class NewsItem extends Observable {
|
||||
protected String title;
|
||||
|
||||
public NewsItem() {
|
||||
@ -17,6 +18,11 @@ public abstract class NewsItem {
|
||||
}
|
||||
|
||||
public void setTitle(String newTitle) {
|
||||
if(title.equals(newTitle)) return;
|
||||
|
||||
setChanged();
|
||||
notifyObservers("➖ " + title + "\n➕ " + newTitle);
|
||||
|
||||
title = newTitle;
|
||||
}
|
||||
|
||||
|
11
ueb07_news_example_b/ueb07_news_example_b.iml
Normal file
11
ueb07_news_example_b/ueb07_news_example_b.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>
|
Loading…
x
Reference in New Issue
Block a user