美文网首页
设计模式用例(四)

设计模式用例(四)

作者: 月巴月巴 | 来源:发表于2019-01-01 18:28 被阅读0次
  1. 责任链模式
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.
  1. 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
  1. 观察者/中介模式
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!

相关文章

  • 设计模式用例(四)

    责任链模式 Builder模式 观察者/中介模式

  • 单例模式

    面向对象设计的设计模式(四):单例模式

  • 设计模式一、单例模式

    系列传送门设计模式一、单例模式设计模式二、简单工厂模式设计模式三、工厂模式设计模式四、抽象工厂模式 简单单例(推荐...

  • 前端设计模式

    JS设计模式一:工厂模式jS设计模式二:单例模式JS设计模式三:模块模式JS设计模式四:代理模式JS设计模式五:职...

  • 单例模式Java篇

    单例设计模式- 饿汉式 单例设计模式 - 懒汉式 单例设计模式 - 懒汉式 - 多线程并发 单例设计模式 - 懒汉...

  • Java四种单例设计模式

    Java中的四种单例模式 单例模式是最容易理解的设计模式之一,介绍Java中单例模式的四种写法。 1.基本单例模式...

  • 设计模式四、抽象工厂模式

    系列传送门设计模式一、单例模式设计模式二、简单工厂模式设计模式三、工厂模式设计模式四、抽象工厂模式 抽象工厂模式 ...

  • 设计模式三、工厂模式

    系列传送门设计模式一、单例模式设计模式二、简单工厂模式设计模式三、工厂模式设计模式四、抽象工厂模式 工厂模式 在一...

  • python中OOP的单例

    目录 单例设计模式 __new__ 方法 Python 中的单例 01. 单例设计模式 设计模式设计模式 是 前人...

  • 单例

    目标 单例设计模式 __new__ 方法 Python 中的单例 01. 单例设计模式 设计模式设计模式 是 前人...

网友评论

      本文标题:设计模式用例(四)

      本文链接:https://www.haomeiwen.com/subject/kzanlqtx.html