Compare commits

...

5 Commits

Author SHA1 Message Date
a30c457c41
ueb07 b) 2024-12-07 14:34:33 +01:00
fab514a41e
.idea 2024-12-07 14:29:30 +01:00
945b313529
wip 2024-12-07 13:11:42 +01:00
b1b8db8065
ueb07 a) 2024-12-07 12:13:00 +01:00
49a4e61738
.idea 2024-12-07 12:12:54 +01:00
23 changed files with 274 additions and 93 deletions

1
ueb07_news_example/.gitignore vendored Normal file
View File

@ -0,0 +1 @@
/out/

8
ueb07_news_example/.idea/.gitignore generated vendored Normal file
View 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
View 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
View 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
View 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>

View File

@ -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");

View File

@ -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();
}
}

View 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");
}
}
}

View File

@ -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();
}
}

View File

@ -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();
}
}

View File

@ -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();
}

View 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);
}

View 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");
}
}
}

View 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
View File

@ -0,0 +1 @@
/out/

8
ueb07_news_example_b/.idea/.gitignore generated vendored Normal file
View 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
View 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
View 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
View 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>

View File

@ -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 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");
}
}

View File

@ -1,16 +1,39 @@
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;
}

View File

@ -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;
}

View 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>