- 责任链模式
public enum LogLevel {
INFO, WARN, ERROR;
}
public abstract class Logger {
private Logger next;
public Logger getNext() {
return next;
}
public void setNext(Logger next) {
this.next = next;
}
public final void handleText(Text text) {
if (text.getLogLevel().equals(getLogLevel())) {
print(text);
} else {
goToNextLevel(text);
}
}
private void goToNextLevel(Text text) {
if (getNext() != null) {
getNext().handleText(text);
} else {
System.out.println("No proper logger for the text");
}
}
protected abstract LogLevel getLogLevel();
protected abstract void print(Text text);
}
public class InfoLogger extends Logger {
@Override
protected void print(Text text) {
System.out.println("INFO: " + text.getContent());
}
@Override
protected LogLevel getLogLevel() {
return LogLevel.INFO;
}
}
public class WarnLogger extends Logger {
@Override
protected void print(Text text) {
System.out.println("Warn: " + text.getContent());
}
@Override
protected LogLevel getLogLevel() {
return LogLevel.WARN;
}
}
public class ErrorLogger extends Logger {
@Override
protected void print(Text text) {
System.out.println("Error: " + text.getContent());
}
@Override
protected LogLevel getLogLevel() {
return LogLevel.ERROR;
}
}
public class LoggerChain {
private Logger head;
public LoggerChain(ArrayList<? extends Logger> loggers) {
if (loggers.isEmpty()) {
throw new RuntimeException("You should have at least one logger");
}
Logger p;
head = loggers.get(0);
p = head;
for (int i = 1; i < loggers.size(); i++) {
p.setNext(loggers.get(i));
p = p.getNext();
}
}
public void print(Text text) {
head.handleText(text);
}
}
public class ChainOfResponsibility {
public static void main(String[] args) {
// texts to print
Text info = new Text(LogLevel.INFO, "This is an INFO level message.");
Text error = new Text(LogLevel.ERROR, "This is an ERROR level message.");
Text warn = new Text(LogLevel.WARN, "This is a WARN level message.");
ArrayList<Logger> loggers = new ArrayList<>();
System.out.println("**********only info logger*********");
loggers.add(new InfoLogger());
LoggerChain chain = new LoggerChain(loggers);
chain.print(info);
chain.print(warn);
System.out.println("**********With all Loggers*********");
loggers.add(new WarnLogger());
loggers.add(new ErrorLogger());
chain = new LoggerChain(loggers);
chain.print(info);
chain.print(warn);
chain.print(error);
}
}
///output
//**********only info logger*********
//INFO: This is an INFO level message.
//No proper logger for the text
//**********With all Loggers*********
//INFO: This is an INFO level message.
//Warn: This is an WARN level message.
//Error: This is an ERROR level message.
- Builder模式
public class Movie {
private String genre;
private String language;
private String length;
private String cast;
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
return sb.append("Genre: ").append(genre).append("\n")
.append("Cast: ").append(cast).append("\n")
.append("Language: ").append(language).append("\n")
.append("Length: ").append(length).append("\n").toString();
}
public Movie(Builder builder) {
genre = builder.genre;
language = builder.language;
length = builder.length;
cast = builder.cast;
}
static class Builder {
private String genre;
private String language;
private String length;
private String cast;
public Builder genre(String g) {
genre = g;
return this;
}
public Builder language(String g) {
language = g;
return this;
}
public Builder length(String g) {
length = g;
return this;
}
public Builder cast(String g) {
cast = g;
return this;
}
public Movie build() {
return new Movie(this);
}
}
}
public class BuilderStudy {
public static void main(String[] args) {
Movie movie = new Movie.Builder()
.genre("Comedy")
.cast("Mr. Bean")
.language("English")
.length("90min")
.build();
System.out.println(movie);
}
}
///output
//Genre: Comedy
//Cast: Mr. Bean
//Language: English
//Length: 90min
- 观察者/中介模式
class Subject {
private Board board;
private String displayName;
public Subject(String displayName) {
this.displayName = displayName;
}
public void register(Board board) {
this.board = board;
board.addSubject(this);
}
void update() {
for (Observer observer : board.getSubjectAudience(this)) {
observer.receiveNotice(this);
}
}
public String getDisplayName() {
return displayName;
}
}
class Observer {
private Board board;
public void receiveNotice(Subject subject) {
System.out.println(subject.getDisplayName() + " is updated!");
}
public void subscribeSubject(Board board, Subject subject) {
this.board = board;
board.addObserver(subject, this);
}
}
class Board {
private Map<Subject, List<Observer>> boardMap = new HashMap<>();
public void addSubject(Subject subject) {
Set<Subject> existingSubjects = boardMap.keySet();
if (existingSubjects == null) {
boardMap.put(subject, new ArrayList<>());
return;
}
Subject curr = existingSubjects.stream().filter(s -> s.getDisplayName().equals(subject.getDisplayName())).findFirst().orElse(null);
if (curr == null) {
boardMap.put(subject, new ArrayList<>());
} else {
System.out.println("Fail to subscribe. The subject name is duplicated, please rename it.");
}
}
public void addObserver(Subject subject, Observer observer) {
Set<Subject> existingSubjects = boardMap.keySet();
if (existingSubjects == null || existingSubjects.isEmpty()) {
System.out.println("No available subject");
return;
}
Subject curr = existingSubjects.stream().filter(s -> s.getDisplayName().equals(subject.getDisplayName())).findFirst().orElse(null);
if (curr == null) {
System.out.println("No available subject named " + subject.getDisplayName() + "!");
return;
}
boardMap.get(subject).add(observer);
}
public List<Observer> getSubjectAudience(Subject subject) {
return boardMap.get(subject);
}
}
public class ObserverStudy {
public static void main(String[] args) {
Board board = new Board();
Observer observer1 = new Observer();
Observer observer2 = new Observer();
Observer observer3 = new Observer();
Subject subject1 = new Subject("Subject 1");
Subject subject2 = new Subject("Subject 2");
subject1.register(board);
subject2.register(board);
observer1.subscribeSubject(board, subject1);
observer2.subscribeSubject(board, subject1);
observer2.subscribeSubject(board, subject2);
observer3.subscribeSubject(board, subject2);
Subject subject3 = new Subject("Subject 3");
observer1.subscribeSubject(board, subject3);
subject1.update();
subject2.update();
}
}
///output:
//No available subject named Subject 3!
//Subject 1 is updated!
//Subject 1 is updated!
//Subject 2 is updated!
//Subject 2 is updated!
网友评论