parent
ee0e9609f7
commit
019731de62
@ -0,0 +1,21 @@
|
||||
package com.baiye.design.behavioral.interpreter;
|
||||
|
||||
public class AddInterpreter implements Interpreter {
|
||||
|
||||
private Interpreter firstExpression, secondExpression;
|
||||
|
||||
public AddInterpreter(Interpreter firstExpression, Interpreter secondExpression) {
|
||||
this.firstExpression = firstExpression;
|
||||
this.secondExpression = secondExpression;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int interpret() {
|
||||
return this.firstExpression.interpret() + this.secondExpression.interpret();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "+";
|
||||
}
|
||||
}
|
@ -0,0 +1,5 @@
|
||||
package com.baiye.design.behavioral.interpreter;
|
||||
|
||||
public interface Interpreter {
|
||||
int interpret();
|
||||
}
|
@ -0,0 +1,21 @@
|
||||
package com.baiye.design.behavioral.interpreter;
|
||||
|
||||
public class MultiInterpreter implements Interpreter{
|
||||
|
||||
private Interpreter firstExpression, secondExpression;
|
||||
|
||||
public MultiInterpreter(Interpreter firstExpression, Interpreter secondExpression) {
|
||||
this.firstExpression = firstExpression;
|
||||
this.secondExpression = secondExpression;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int interpret() {
|
||||
return this.firstExpression.interpret() * this.secondExpression.interpret();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "*";
|
||||
}
|
||||
}
|
@ -0,0 +1,33 @@
|
||||
package com.baiye.design.behavioral.interpreter;
|
||||
|
||||
import java.util.Stack;
|
||||
|
||||
public class MyExpressionParse {
|
||||
|
||||
private Stack<Interpreter> stack = new Stack<Interpreter>();
|
||||
|
||||
public int parse(String str){
|
||||
String[] strItemArr = str.split(" ");
|
||||
for (String symbol : strItemArr) {
|
||||
if (!OpratorUtil.isOperator(symbol)) {
|
||||
NumberInterpreter numberInterpreter = new NumberInterpreter(symbol);
|
||||
stack.push(numberInterpreter);
|
||||
System.out.printf("入栈: %d%n", numberInterpreter.interpret());
|
||||
}else {
|
||||
// 是运算符则可以进行计算
|
||||
Interpreter firstInterpreter = stack.pop();
|
||||
Interpreter secondInterpreter = stack.pop();
|
||||
System.out.printf("出栈: %d 和 %d%n", firstInterpreter.interpret(), secondInterpreter.interpret());
|
||||
Interpreter expressionObject = OpratorUtil.getExpressionObject(firstInterpreter, secondInterpreter, symbol);
|
||||
System.out.printf("应用运算符: %s%n", expressionObject);
|
||||
assert expressionObject != null;
|
||||
int result = expressionObject.interpret();
|
||||
NumberInterpreter resultExpression = new NumberInterpreter(result);
|
||||
stack.push(resultExpression);
|
||||
System.out.printf("阶段结果入栈: %d%n", resultExpression.interpret());
|
||||
}
|
||||
}
|
||||
int result = stack.pop().interpret();
|
||||
return result;
|
||||
}
|
||||
}
|
@ -0,0 +1,22 @@
|
||||
package com.baiye.design.behavioral.interpreter;
|
||||
|
||||
public class NumberInterpreter implements Interpreter{
|
||||
|
||||
private Integer number;
|
||||
|
||||
public NumberInterpreter(Integer number) {
|
||||
this.number = number;
|
||||
}
|
||||
|
||||
/**
|
||||
* 对String类型的进行转化
|
||||
*/
|
||||
public NumberInterpreter(String number) {
|
||||
this.number = Integer.parseInt(number);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int interpret() {
|
||||
return this.number;
|
||||
}
|
||||
}
|
@ -0,0 +1,22 @@
|
||||
package com.baiye.design.behavioral.interpreter;
|
||||
|
||||
public class OpratorUtil {
|
||||
|
||||
public static boolean isOperator(String symbol){
|
||||
return (symbol.equals("+") || symbol.equals("*"));
|
||||
}
|
||||
|
||||
public static Interpreter getExpressionObject(Interpreter firstInterpreter, Interpreter secondInterpreter, String symbol) {
|
||||
|
||||
if (symbol.equals("+")) {
|
||||
return new AddInterpreter(firstInterpreter, secondInterpreter);
|
||||
}
|
||||
|
||||
if (symbol.equals("*")) {
|
||||
return new MultiInterpreter(firstInterpreter, secondInterpreter);
|
||||
}
|
||||
|
||||
// todo 这里可以做成一个空解释器
|
||||
return null;
|
||||
}
|
||||
}
|
@ -0,0 +1,12 @@
|
||||
package com.baiye.design.behavioral.interpreter;
|
||||
|
||||
public class Test {
|
||||
public static void main(String[] args) {
|
||||
String inputStr = "6 100 11 + *"; // (11 + 100 ) * 6
|
||||
MyExpressionParse myExpressionParse = new MyExpressionParse();
|
||||
int parse = myExpressionParse.parse(inputStr);
|
||||
System.out.println("解释器结果是: " + parse);
|
||||
|
||||
|
||||
}
|
||||
}
|
@ -0,0 +1,13 @@
|
||||
package com.baiye.design.behavioral.iterator;
|
||||
|
||||
public class Course {
|
||||
private String name;
|
||||
|
||||
public Course(String name) {
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
}
|
@ -0,0 +1,17 @@
|
||||
package com.baiye.design.behavioral.iterator;
|
||||
|
||||
public interface CourseAggregate {
|
||||
|
||||
/*
|
||||
* 定义对Course的操作
|
||||
*/
|
||||
|
||||
void addCourse(Course course);
|
||||
|
||||
void removeCourse(Course course);
|
||||
|
||||
/**
|
||||
* 获取课程的迭代器
|
||||
*/
|
||||
CourseIterator getCourseIterator();
|
||||
}
|
@ -0,0 +1,28 @@
|
||||
package com.baiye.design.behavioral.iterator;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class CourseAggregateImpl implements CourseAggregate{
|
||||
|
||||
private List courseList;
|
||||
|
||||
public CourseAggregateImpl() {
|
||||
this.courseList = new ArrayList();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void addCourse(Course course) {
|
||||
courseList.add(course);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void removeCourse(Course course) {
|
||||
courseList.remove(course);
|
||||
}
|
||||
|
||||
@Override
|
||||
public CourseIterator getCourseIterator() {
|
||||
return new CourseIteratorImpl(courseList);
|
||||
}
|
||||
}
|
@ -0,0 +1,8 @@
|
||||
package com.baiye.design.behavioral.iterator;
|
||||
|
||||
public interface CourseIterator {
|
||||
|
||||
Course nextCourse();
|
||||
|
||||
boolean isLastCourse();
|
||||
}
|
@ -0,0 +1,32 @@
|
||||
package com.baiye.design.behavioral.iterator;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public class CourseIteratorImpl implements CourseIterator {
|
||||
|
||||
private List courseList;
|
||||
|
||||
private int position;
|
||||
|
||||
private Course course;
|
||||
|
||||
public CourseIteratorImpl(List courseList) {
|
||||
this.courseList = courseList;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Course nextCourse() {
|
||||
System.out.println("返回课程,位置是: " + position);
|
||||
course = (Course) courseList.get(position);
|
||||
position ++;
|
||||
return course;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isLastCourse() {
|
||||
if (position < courseList.size()){
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
@ -0,0 +1,40 @@
|
||||
package com.baiye.design.behavioral.iterator;
|
||||
|
||||
public class Test {
|
||||
public static void main(String[] args) {
|
||||
Course course1 = new Course("Java电商一期");
|
||||
Course course2 = new Course("Java电商二期");
|
||||
Course course4 = new Course("Java设计精讲");
|
||||
Course course3 = new Course("Python课程");
|
||||
Course course5 = new Course("算法课程");
|
||||
Course course6 = new Course("前端课程");
|
||||
|
||||
CourseAggregate courseAggregate = new CourseAggregateImpl();
|
||||
|
||||
courseAggregate.addCourse(course1);
|
||||
courseAggregate.addCourse(course2);
|
||||
courseAggregate.addCourse(course3);
|
||||
courseAggregate.addCourse(course4);
|
||||
courseAggregate.addCourse(course5);
|
||||
courseAggregate.addCourse(course6);
|
||||
|
||||
System.out.println("-----------课程列表-----------");
|
||||
printCourses(courseAggregate);
|
||||
|
||||
courseAggregate.removeCourse(course3);
|
||||
courseAggregate.removeCourse(course5);
|
||||
|
||||
System.out.println("-----------删除操作之后的课程列表-----------");
|
||||
printCourses(courseAggregate);
|
||||
|
||||
}
|
||||
|
||||
private static void printCourses(CourseAggregate courseAggregate) {
|
||||
// fixme 构建是不是可以使用 builder 模式进行
|
||||
CourseIterator courseIterator = courseAggregate.getCourseIterator();
|
||||
while (!courseIterator.isLastCourse()) {
|
||||
Course course = courseIterator.nextCourse();
|
||||
System.out.println(course.getName());
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,14 @@
|
||||
package com.baiye.design.behavioral.mediator;
|
||||
|
||||
import java.util.Date;
|
||||
|
||||
/**
|
||||
* 中介者
|
||||
*/
|
||||
public class StudyGroup {
|
||||
public static void showMessage(User user, String message) {
|
||||
System.out.println(new Date().toString() + "[" + user.getName() + "]: " + message);
|
||||
}
|
||||
|
||||
|
||||
}
|
@ -0,0 +1,12 @@
|
||||
package com.baiye.design.behavioral.mediator;
|
||||
|
||||
public class Test {
|
||||
public static void main(String[] args) {
|
||||
User name1 = new User("heihei");
|
||||
User name2 = new User("xxx");
|
||||
|
||||
name1.sendMessage("gogogo");
|
||||
name2.sendMessage("ok");
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,21 @@
|
||||
package com.baiye.design.behavioral.mediator;
|
||||
|
||||
public class User {
|
||||
private String name;
|
||||
|
||||
public User(String name) {
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
public void setName(String name) {
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
public void sendMessage(String message) {
|
||||
StudyGroup.showMessage(this, message);
|
||||
}
|
||||
}
|
@ -0,0 +1,57 @@
|
||||
package com.baiye.design.behavioral.memento;
|
||||
|
||||
public class Article {
|
||||
private String title;
|
||||
private String content;
|
||||
private String imgs;
|
||||
|
||||
public Article(String title, String content, String imgs) {
|
||||
this.title = title;
|
||||
this.content = content;
|
||||
this.imgs = imgs;
|
||||
}
|
||||
|
||||
public String getTitle() {
|
||||
return title;
|
||||
}
|
||||
|
||||
public void setTitle(String title) {
|
||||
this.title = title;
|
||||
}
|
||||
|
||||
public String getContent() {
|
||||
return content;
|
||||
}
|
||||
|
||||
public void setContent(String content) {
|
||||
this.content = content;
|
||||
}
|
||||
|
||||
public String getImgs() {
|
||||
return imgs;
|
||||
}
|
||||
|
||||
public void setImgs(String imgs) {
|
||||
this.imgs = imgs;
|
||||
}
|
||||
|
||||
public ArticleMemento saveToMemento() {
|
||||
ArticleMemento articleMemento = new ArticleMemento(this.title,this.content,this.imgs);
|
||||
return articleMemento;
|
||||
}
|
||||
|
||||
public void undoFromMemento(ArticleMemento articleMemento) {
|
||||
this.title = articleMemento.getTitle();
|
||||
this.content = articleMemento.getContent();
|
||||
this.imgs = articleMemento.getImgs();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "Article{" +
|
||||
"title='" + title + '\'' +
|
||||
", content='" + content + '\'' +
|
||||
", imgs='" + imgs + '\'' +
|
||||
'}';
|
||||
}
|
||||
}
|
@ -0,0 +1,37 @@
|
||||
package com.baiye.design.behavioral.memento;
|
||||
|
||||
/**
|
||||
* 快照类
|
||||
*/
|
||||
public class ArticleMemento {
|
||||
private String title;
|
||||
private String content;
|
||||
private String imgs;
|
||||
|
||||
public ArticleMemento(String title, String content, String imgs) {
|
||||
this.title = title;
|
||||
this.content = content;
|
||||
this.imgs = imgs;
|
||||
}
|
||||
|
||||
public String getTitle() {
|
||||
return title;
|
||||
}
|
||||
|
||||
public String getContent() {
|
||||
return content;
|
||||
}
|
||||
|
||||
public String getImgs() {
|
||||
return imgs;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "ArticleMemento{" +
|
||||
"title='" + title + '\'' +
|
||||
", content='" + content + '\'' +
|
||||
", imgs='" + imgs + '\'' +
|
||||
'}';
|
||||
}
|
||||
}
|
@ -0,0 +1,17 @@
|
||||
package com.baiye.design.behavioral.memento;
|
||||
|
||||
import java.util.Stack;
|
||||
|
||||
public class ArticleMementoManager {
|
||||
|
||||
private final Stack<ArticleMemento> ARTICLE_MEMENTO_STACK = new Stack<>();
|
||||
|
||||
public ArticleMemento getMemento() {
|
||||
ArticleMemento articleMemento = ARTICLE_MEMENTO_STACK.pop();
|
||||
return articleMemento;
|
||||
}
|
||||
|
||||
public void addMemento(ArticleMemento articleMemento) {
|
||||
ARTICLE_MEMENTO_STACK.push(articleMemento);
|
||||
}
|
||||
}
|
@ -0,0 +1,48 @@
|
||||
package com.baiye.design.behavioral.memento;
|
||||
|
||||
public class Test {
|
||||
public static void main(String[] args) {
|
||||
ArticleMementoManager articleMementoManager = new ArticleMementoManager();
|
||||
|
||||
Article article = new Article("设计模式A", "手记内容A", "手记图片A");
|
||||
|
||||
// 通过 article 组装 articleMemento
|
||||
ArticleMemento articleMemento = article.saveToMemento();
|
||||
|
||||
// 快照存档
|
||||
articleMementoManager.addMemento(articleMemento);
|
||||
|
||||
System.out.println("手记信息:" + article);
|
||||
|
||||
System.out.println("修改手记信息start");
|
||||
article.setTitle("设计模式B");
|
||||
article.setContent("手记内容B");
|
||||
article.setImgs("手记图片B");
|
||||
System.out.println("修改手记信息end");
|
||||
|
||||
System.out.println("手记信息:" + article);
|
||||
|
||||
articleMemento = article.saveToMemento();
|
||||
articleMementoManager.addMemento(articleMemento);
|
||||
|
||||
|
||||
article.setTitle("设计模式C");
|
||||
article.setContent("手记内容C");
|
||||
article.setImgs("手记图片C");
|
||||
System.out.println("手记信息:" + article);
|
||||
|
||||
|
||||
System.out.println("暂存回退start");
|
||||
|
||||
System.out.println("回退1次");
|
||||
articleMemento = articleMementoManager.getMemento();
|
||||
article.undoFromMemento(articleMemento);
|
||||
System.out.println("手记信息:" + article);
|
||||
|
||||
System.out.println("回退2次");
|
||||
articleMemento = articleMementoManager.getMemento();
|
||||
article.undoFromMemento(articleMemento);
|
||||
System.out.println("手记信息:" + article);
|
||||
|
||||
}
|
||||
}
|
@ -0,0 +1,25 @@
|
||||
package com.baiye.design.behavioral.observer;
|
||||
|
||||
import java.util.Observable;
|
||||
|
||||
/**
|
||||
* 成为被观察对象 - 线程安全的
|
||||
*/
|
||||
public class Course extends Observable {
|
||||
private String courseName;
|
||||
|
||||
public Course(String courseName) {
|
||||
this.courseName = courseName;
|
||||
}
|
||||
|
||||
public String getCourseName() {
|
||||
return courseName;
|
||||
}
|
||||
|
||||
public void produceQuestion(Course course, Question question) {
|
||||
System.out.println(question.getUserName() + "在" + course.getCourseName() + "提交了一个问题");
|
||||
// 代表状态发生了改变
|
||||
setChanged();
|
||||
notifyObservers(question);
|
||||
}
|
||||
}
|
@ -0,0 +1,22 @@
|
||||
package com.baiye.design.behavioral.observer;
|
||||
|
||||
public class Question {
|
||||
private String userName;
|
||||
private String questionContent;
|
||||
|
||||
public String getUserName() {
|
||||
return userName;
|
||||
}
|
||||
|
||||
public void setUserName(String userName) {
|
||||
this.userName = userName;
|
||||
}
|
||||
|
||||
public String getQuestionContent() {
|
||||
return questionContent;
|
||||
}
|
||||
|
||||
public void setQuestionContent(String questionContent) {
|
||||
this.questionContent = questionContent;
|
||||
}
|
||||
}
|
@ -0,0 +1,23 @@
|
||||
package com.baiye.design.behavioral.observer;
|
||||
|
||||
import java.util.Observable;
|
||||
import java.util.Observer;
|
||||
|
||||
/**
|
||||
* 观察者
|
||||
*/
|
||||
public class Teacher implements Observer {
|
||||
|
||||
private String teacherName;
|
||||
|
||||
public Teacher(String teacherName) {
|
||||
this.teacherName = teacherName;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void update(Observable o, Object arg) {
|
||||
Course course = (Course) o;
|
||||
Question question = (Question) arg;
|
||||
System.out.println(teacherName + "老师的" + course.getCourseName() + "课程接收的一个" + question.getUserName() + "提交的" + question.getQuestionContent() + "问题");
|
||||
}
|
||||
}
|
@ -0,0 +1,20 @@
|
||||
package com.baiye.design.behavioral.observer;
|
||||
|
||||
public class Test {
|
||||
public static void main(String[] args) {
|
||||
Course course = new Course("Java设计模式精讲");
|
||||
Teacher alpha = new Teacher("Alpha");
|
||||
Teacher alpha1 = new Teacher("Alpha1");
|
||||
// 添加观察者
|
||||
course.addObserver(alpha);
|
||||
course.addObserver(alpha1);
|
||||
// 业务逻辑
|
||||
Question question = new Question();
|
||||
question.setUserName("Baiye");
|
||||
question.setQuestionContent("Java的主函数如何编写");
|
||||
|
||||
course.produceQuestion(course, question);
|
||||
|
||||
|
||||
}
|
||||
}
|
@ -0,0 +1,8 @@
|
||||
package com.baiye.design.behavioral.strategy;
|
||||
|
||||
public class EmptyPromotionStrategy implements PromotionStrategy{
|
||||
@Override
|
||||
public void doPromotion() {
|
||||
System.out.println("无促销活动");
|
||||
}
|
||||
}
|
@ -0,0 +1,8 @@
|
||||
package com.baiye.design.behavioral.strategy;
|
||||
|
||||
public class FanxianPromotionStrategy implements PromotionStrategy {
|
||||
@Override
|
||||
public void doPromotion() {
|
||||
System.out.println("返现促销,返回的金额存放在用户余额中");
|
||||
}
|
||||
}
|
@ -0,0 +1,8 @@
|
||||
package com.baiye.design.behavioral.strategy;
|
||||
|
||||
public class LIjianPromotionStrategy implements PromotionStrategy{
|
||||
@Override
|
||||
public void doPromotion() {
|
||||
System.out.println("立减促销,课程价格直接减去配置的价格");
|
||||
}
|
||||
}
|
@ -0,0 +1,8 @@
|
||||
package com.baiye.design.behavioral.strategy;
|
||||
|
||||
public class ManjianPromotionStrategy implements PromotionStrategy{
|
||||
@Override
|
||||
public void doPromotion() {
|
||||
System.out.println("满减促销,满200减20元");
|
||||
}
|
||||
}
|
@ -0,0 +1,13 @@
|
||||
package com.baiye.design.behavioral.strategy;
|
||||
|
||||
public class PromotionActivity {
|
||||
private PromotionStrategy promotionStrategy;
|
||||
|
||||
public PromotionActivity(PromotionStrategy promotionStrategy) {
|
||||
this.promotionStrategy = promotionStrategy;
|
||||
}
|
||||
|
||||
public void executePromotionStrategy() {
|
||||
promotionStrategy.doPromotion();
|
||||
}
|
||||
}
|
@ -0,0 +1,6 @@
|
||||
package com.baiye.design.behavioral.strategy;
|
||||
|
||||
public interface PromotionStrategy {
|
||||
void doPromotion();
|
||||
|
||||
}
|
@ -0,0 +1,35 @@
|
||||
package com.baiye.design.behavioral.strategy;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
public class PromotionStrategyFactory {
|
||||
|
||||
public static Map<String, PromotionStrategy> PROMOTION_STRATEGY_MAP = new HashMap<>();
|
||||
|
||||
static {
|
||||
PROMOTION_STRATEGY_MAP.put(PromotionKey.LIJIAN, new LIjianPromotionStrategy());
|
||||
PROMOTION_STRATEGY_MAP.put(PromotionKey.FANXIAN, new ManjianPromotionStrategy());
|
||||
PROMOTION_STRATEGY_MAP.put(PromotionKey.MANJIAN, new FanxianPromotionStrategy());
|
||||
}
|
||||
|
||||
private static final PromotionStrategy NON_PROMOTION = new EmptyPromotionStrategy();
|
||||
|
||||
/**
|
||||
* 私有化构造器
|
||||
*/
|
||||
private PromotionStrategyFactory() {
|
||||
|
||||
}
|
||||
|
||||
public static PromotionStrategy getPromotionStrategy(String promotionKey) {
|
||||
PromotionStrategy promotionStrategy = PROMOTION_STRATEGY_MAP.get(promotionKey);
|
||||
return promotionStrategy == null ? NON_PROMOTION : promotionStrategy;
|
||||
}
|
||||
|
||||
private interface PromotionKey{
|
||||
String LIJIAN = "LIJIAN";
|
||||
String FANXIAN = "FANXIAN";
|
||||
String MANJIAN = "MANJIAN";
|
||||
}
|
||||
}
|
@ -0,0 +1,20 @@
|
||||
package com.baiye.design.behavioral.strategy;
|
||||
|
||||
public class Test {
|
||||
public static void main(String[] args) {
|
||||
// PromotionActivity promotionActivity618 = new PromotionActivity(new ManjianPromotionStrategy());
|
||||
// PromotionActivity promotionActivity1111 = new PromotionActivity(new FanxianPromotionStrategy());
|
||||
//
|
||||
// promotionActivity618.executePromotionStrategy();
|
||||
// promotionActivity1111.executePromotionStrategy();
|
||||
|
||||
// ==================
|
||||
|
||||
// 外部传来 promotionKay
|
||||
String promotionKey = "LIJIAN";
|
||||
// 使用 策略模式 + 工厂模式 来实现
|
||||
PromotionActivity promotionActivity = new PromotionActivity(PromotionStrategyFactory.getPromotionStrategy(promotionKey));
|
||||
promotionActivity.executePromotionStrategy();
|
||||
|
||||
}
|
||||
}
|
@ -0,0 +1,43 @@
|
||||
package com.baiye.design.behavioral.templatemethod;
|
||||
|
||||
public abstract class ACourse {
|
||||
|
||||
/**
|
||||
* 不让子类修改的模板方法
|
||||
*/
|
||||
protected final void makeCourse() {
|
||||
// 必须做的函数
|
||||
this.makePPT();
|
||||
this.makeVidoe();
|
||||
// 可选的就交给钩子方法
|
||||
if (needWriteArticle()){
|
||||
this.wirteArticle();
|
||||
}
|
||||
this.packageCourse();
|
||||
}
|
||||
|
||||
final void makePPT(){
|
||||
System.out.println("制作PPT");
|
||||
}
|
||||
|
||||
final void makeVidoe(){
|
||||
System.out.println("制作视频");
|
||||
}
|
||||
|
||||
final void wirteArticle(){
|
||||
System.out.println("制作手记");
|
||||
}
|
||||
|
||||
/**
|
||||
* 钩子方法 - 对行为是否进行做一下控制
|
||||
*/
|
||||
protected boolean needWriteArticle(){
|
||||
// 默认 false
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* 完全交给子类来实现
|
||||
*/
|
||||
abstract void packageCourse();
|
||||
}
|
@ -0,0 +1,16 @@
|
||||
package com.baiye.design.behavioral.templatemethod;
|
||||
|
||||
public class DesignPatternCourse extends ACourse{
|
||||
@Override
|
||||
void packageCourse() {
|
||||
System.out.println("提供Java课程源代码");
|
||||
}
|
||||
|
||||
/**
|
||||
* 重写钩子方法进行判断
|
||||
*/
|
||||
@Override
|
||||
protected boolean needWriteArticle() {
|
||||
return true;
|
||||
}
|
||||
}
|
@ -0,0 +1,31 @@
|
||||
package com.baiye.design.behavioral.templatemethod;
|
||||
|
||||
public class FECourse extends ACourse{
|
||||
|
||||
/**
|
||||
* 对外开发钩子方法的判断标识
|
||||
*/
|
||||
private boolean needWriteArticleFlag = false;
|
||||
|
||||
@Override
|
||||
void packageCourse() {
|
||||
System.out.println("提供课程的前端代码");
|
||||
System.out.println("提供课程图片等多媒体素材");
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* 使用构造器方式对外进行开放
|
||||
* fixme 可以选用不同的赋值方式
|
||||
*/
|
||||
public FECourse(boolean needWriteArticleFlag) {
|
||||
this.needWriteArticleFlag = needWriteArticleFlag;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
protected boolean needWriteArticle() {
|
||||
return this.needWriteArticleFlag;
|
||||
}
|
||||
}
|
@ -0,0 +1,15 @@
|
||||
package com.baiye.design.behavioral.templatemethod;
|
||||
|
||||
public class Test {
|
||||
public static void main(String[] args) {
|
||||
System.out.println("后端设计模式课程start---");
|
||||
ACourse designPatternCourse = new DesignPatternCourse();
|
||||
designPatternCourse.makeCourse();
|
||||
System.out.println("后端设计模式课程end---");
|
||||
|
||||
System.out.println("前端设计模式课程start---");
|
||||
ACourse feCourse = new FECourse(false);
|
||||
feCourse.makeCourse();
|
||||
System.out.println("前端设计模式课程end---");
|
||||
}
|
||||
}
|
@ -0,0 +1,5 @@
|
||||
package com.baiye.design.pattern.creational.abstractfactory;
|
||||
|
||||
public abstract class Article {
|
||||
public abstract void produce();
|
||||
}
|
@ -0,0 +1,9 @@
|
||||
package com.baiye.design.pattern.creational.abstractfactory;
|
||||
|
||||
|
||||
public interface CourseFactory {
|
||||
|
||||
Video getVideo();
|
||||
|
||||
Article getArticle();
|
||||
}
|
@ -0,0 +1,8 @@
|
||||
package com.baiye.design.pattern.creational.abstractfactory;
|
||||
|
||||
public class JavaArticle extends Article{
|
||||
@Override
|
||||
public void produce() {
|
||||
System.out.println("书写Java手记");
|
||||
}
|
||||
}
|
@ -0,0 +1,14 @@
|
||||
package com.baiye.design.pattern.creational.abstractfactory;
|
||||
|
||||
public class JavaCourseFactory implements CourseFactory {
|
||||
|
||||
@Override
|
||||
public Video getVideo() {
|
||||
return new JavaVideo();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Article getArticle() {
|
||||
return new JavaArticle();
|
||||
}
|
||||
}
|
@ -0,0 +1,8 @@
|
||||
package com.baiye.design.pattern.creational.abstractfactory;
|
||||
|
||||
public class JavaVideo extends Video{
|
||||
@Override
|
||||
public void produce() {
|
||||
System.out.println("录制Java课程视频");
|
||||
}
|
||||
}
|
@ -0,0 +1,8 @@
|
||||
package com.baiye.design.pattern.creational.abstractfactory;
|
||||
|
||||
public class PythonArticle extends Article{
|
||||
@Override
|
||||
public void produce() {
|
||||
System.out.println("书写Python手记");
|
||||
}
|
||||
}
|
@ -0,0 +1,13 @@
|
||||
package com.baiye.design.pattern.creational.abstractfactory;
|
||||
|
||||
public class PythonCourseFactory implements CourseFactory{
|
||||
@Override
|
||||
public Video getVideo() {
|
||||
return new PythonVideo();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Article getArticle() {
|
||||
return new PythonArticle();
|
||||
}
|
||||
}
|
@ -0,0 +1,8 @@
|
||||
package com.baiye.design.pattern.creational.abstractfactory;
|
||||
|
||||
public class PythonVideo extends Video{
|
||||
@Override
|
||||
public void produce() {
|
||||
System.out.println("录制Python课程");
|
||||
}
|
||||
}
|
@ -0,0 +1,13 @@
|
||||
package com.baiye.design.pattern.creational.abstractfactory;
|
||||
|
||||
public class Test {
|
||||
public static void main(String[] args) {
|
||||
CourseFactory courseFactory = new JavaCourseFactory();
|
||||
courseFactory.getArticle().produce();
|
||||
courseFactory.getVideo().produce();
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
}
|
@ -0,0 +1,5 @@
|
||||
package com.baiye.design.pattern.creational.abstractfactory;
|
||||
|
||||
public abstract class Video {
|
||||
public abstract void produce();
|
||||
}
|
@ -0,0 +1,23 @@
|
||||
package com.baiye.design.pattern.creational.builder;
|
||||
|
||||
/**
|
||||
* 帮助进行调用构建着构建的类
|
||||
*/
|
||||
public class Coach {
|
||||
private CourseBuilder courseBuilder;
|
||||
|
||||
public void setCourseBuilder(CourseBuilder courseBuilder) {
|
||||
this.courseBuilder = courseBuilder;
|
||||
}
|
||||
|
||||
public Course makeCourse(String courseName, String coursePPT,
|
||||
String courseVideo, String courseArticle,
|
||||
String courseQA) {
|
||||
this.courseBuilder.buildCourseName(courseName);
|
||||
this.courseBuilder.buildCoursePPT(coursePPT);
|
||||
this.courseBuilder.buildCourseVideo(courseVideo);
|
||||
this.courseBuilder.buildCourseArticle(courseArticle);
|
||||
this.courseBuilder.buildCourseQA(courseQA);
|
||||
return this.courseBuilder.makeCourse();
|
||||
}
|
||||
}
|
@ -0,0 +1,63 @@
|
||||
package com.baiye.design.pattern.creational.builder;
|
||||
|
||||
public class Course {
|
||||
private String courseName;
|
||||
private String coursePPT;
|
||||
private String courseVideo;
|
||||
private String courseArticle;
|
||||
/**
|
||||
* question & answer
|
||||
*/
|
||||
private String courseQA;
|
||||
|
||||
public String getCourseName() {
|
||||
return courseName;
|
||||
}
|
||||
|
||||
public void setCourseName(String courseName) {
|
||||
this.courseName = courseName;
|
||||
}
|
||||
|
||||
public String getCoursePPT() {
|
||||
return coursePPT;
|
||||
}
|
||||
|
||||
public void setCoursePPT(String coursePPT) {
|
||||
this.coursePPT = coursePPT;
|
||||
}
|
||||
|
||||
public String getCourseVideo() {
|
||||
return courseVideo;
|
||||
}
|
||||
|
||||
public void setCourseVideo(String courseVideo) {
|
||||
this.courseVideo = courseVideo;
|
||||
}
|
||||
|
||||
public String getCourseArticle() {
|
||||
return courseArticle;
|
||||
}
|
||||
|
||||
public void setCourseArticle(String courseArticle) {
|
||||
this.courseArticle = courseArticle;
|
||||
}
|
||||
|
||||
public String getCourseQA() {
|
||||
return courseQA;
|
||||
}
|
||||
|
||||
public void setCourseQA(String courseQA) {
|
||||
this.courseQA = courseQA;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "Course{" +
|
||||
"courseName='" + courseName + '\'' +
|
||||
", coursePPT='" + coursePPT + '\'' +
|
||||
", courseVideo='" + courseVideo + '\'' +
|
||||
", courseArticle='" + courseArticle + '\'' +
|
||||
", courseQA='" + courseQA + '\'' +
|
||||
'}';
|
||||
}
|
||||
}
|
@ -0,0 +1,37 @@
|
||||
package com.baiye.design.pattern.creational.builder;
|
||||
|
||||
public class CourseActualBuilder extends CourseBuilder{
|
||||
|
||||
// 组合到实际的课程当中
|
||||
private Course course = new Course();
|
||||
|
||||
@Override
|
||||
public void buildCourseName(String courseName) {
|
||||
course.setCourseName(courseName);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void buildCoursePPT(String coursePPT) {
|
||||
course.setCoursePPT(coursePPT);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void buildCourseVideo(String courseVideo) {
|
||||
course.setCourseVideo(courseVideo);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void buildCourseArticle(String courseArticle) {
|
||||
course.setCourseArticle(courseArticle);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void buildCourseQA(String courseQA) {
|
||||
course.setCourseQA(courseQA);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Course makeCourse() {
|
||||
return course;
|
||||
}
|
||||
}
|
@ -0,0 +1,11 @@
|
||||
package com.baiye.design.pattern.creational.builder;
|
||||
|
||||
public abstract class CourseBuilder {
|
||||
public abstract void buildCourseName(String courseName);
|
||||
public abstract void buildCoursePPT(String coursePPT);
|
||||
public abstract void buildCourseVideo(String courseVideo);
|
||||
public abstract void buildCourseArticle(String courseArticle);
|
||||
public abstract void buildCourseQA(String courseQA);
|
||||
|
||||
public abstract Course makeCourse();
|
||||
}
|
@ -0,0 +1,18 @@
|
||||
package com.baiye.design.pattern.creational.builder;
|
||||
|
||||
public class Test {
|
||||
public static void main(String[] args) {
|
||||
CourseBuilder courseBuilder = new CourseActualBuilder();
|
||||
Coach coach = new Coach();
|
||||
coach.setCourseBuilder(courseBuilder);
|
||||
|
||||
Course course = coach.makeCourse(
|
||||
"Java设计模式",
|
||||
"Java设计模式PPT",
|
||||
"Java设计模式视频",
|
||||
"Java设计模式手记",
|
||||
"Java设计模式问答");
|
||||
|
||||
System.out.println(course);
|
||||
}
|
||||
}
|
@ -0,0 +1,74 @@
|
||||
package com.baiye.design.pattern.creational.builder.v2;
|
||||
|
||||
/**
|
||||
* 这种模式常用 - Lombook的 @Builder 功能好像是类似的
|
||||
*/
|
||||
public class Course {
|
||||
private String courseName;
|
||||
private String coursePPT;
|
||||
private String courseVideo;
|
||||
private String courseArticle;
|
||||
/**
|
||||
* question & answer
|
||||
*/
|
||||
private String courseQA;
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "Course{" +
|
||||
"courseName='" + courseName + '\'' +
|
||||
", coursePPT='" + coursePPT + '\'' +
|
||||
", courseVideo='" + courseVideo + '\'' +
|
||||
", courseArticle='" + courseArticle + '\'' +
|
||||
", courseQA='" + courseQA + '\'' +
|
||||
'}';
|
||||
}
|
||||
|
||||
public Course(CourseBuilder courseBuilder) {
|
||||
this.courseName = courseBuilder.courseName;
|
||||
this.coursePPT = courseBuilder.coursePPT;
|
||||
this.courseVideo = courseBuilder.courseVideo;
|
||||
this.courseArticle = courseBuilder.courseArticle;
|
||||
this.courseQA = courseBuilder.courseQA;
|
||||
}
|
||||
|
||||
public static class CourseBuilder{
|
||||
private String courseName;
|
||||
private String coursePPT;
|
||||
private String courseVideo;
|
||||
private String courseArticle;
|
||||
/**
|
||||
* question & answer
|
||||
*/
|
||||
private String courseQA;
|
||||
|
||||
public CourseBuilder buildCourseName(String courseName) {
|
||||
this.courseName = courseName;
|
||||
return this;
|
||||
}
|
||||
|
||||
public CourseBuilder buildCoursePPT(String coursePPT) {
|
||||
this.coursePPT = coursePPT;
|
||||
return this;
|
||||
}
|
||||
|
||||
public CourseBuilder buildCourseVideo(String courseVideo) {
|
||||
this.courseVideo = courseVideo;
|
||||
return this;
|
||||
}
|
||||
|
||||
public CourseBuilder buildCourseArticle(String courseArticle) {
|
||||
this.courseArticle = courseArticle;
|
||||
return this;
|
||||
}
|
||||
|
||||
public CourseBuilder buildCourseQA(String courseQA) {
|
||||
this.courseQA = courseQA;
|
||||
return this;
|
||||
}
|
||||
|
||||
public Course build() {
|
||||
return new Course(this);
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,15 @@
|
||||
package com.baiye.design.pattern.creational.builder.v2;
|
||||
|
||||
public class Test {
|
||||
public static void main(String[] args) {
|
||||
Course build = new Course.CourseBuilder()
|
||||
.buildCourseName("Java设计模式")
|
||||
.buildCoursePPT("Java设计模式PPT")
|
||||
.buildCourseVideo("Java设计模式视频")
|
||||
.buildCourseArticle("Java设计模式手记")
|
||||
.buildCourseQA("Java设计模式问答")
|
||||
.build();
|
||||
|
||||
System.out.println(build);
|
||||
}
|
||||
}
|
@ -0,0 +1,8 @@
|
||||
package com.baiye.design.pattern.creational.factorymethod;
|
||||
|
||||
public class FEVideo extends Video{
|
||||
@Override
|
||||
public void produce() {
|
||||
System.out.println("录制FE视频");
|
||||
}
|
||||
}
|
@ -0,0 +1,8 @@
|
||||
package com.baiye.design.pattern.creational.factorymethod;
|
||||
|
||||
public class FEVideoFactory extends VideoFactory{
|
||||
@Override
|
||||
public Video getVideo() {
|
||||
return new FEVideo();
|
||||
}
|
||||
}
|
@ -0,0 +1,8 @@
|
||||
package com.baiye.design.pattern.creational.factorymethod;
|
||||
|
||||
public class JavaVideo extends Video {
|
||||
@Override
|
||||
public void produce() {
|
||||
System.out.println("录制Java视频");
|
||||
}
|
||||
}
|
@ -0,0 +1,8 @@
|
||||
package com.baiye.design.pattern.creational.factorymethod;
|
||||
|
||||
public class JavaVideoFactory extends VideoFactory{
|
||||
@Override
|
||||
public Video getVideo() {
|
||||
return new JavaVideo();
|
||||
}
|
||||
}
|
@ -0,0 +1,8 @@
|
||||
package com.baiye.design.pattern.creational.factorymethod;
|
||||
|
||||
public class PythonVideo extends Video {
|
||||
@Override
|
||||
public void produce() {
|
||||
System.out.println("录制Python视频");
|
||||
}
|
||||
}
|
@ -0,0 +1,8 @@
|
||||
package com.baiye.design.pattern.creational.factorymethod;
|
||||
|
||||
public class PythonVideoFactory extends VideoFactory{
|
||||
@Override
|
||||
public Video getVideo() {
|
||||
return new PythonVideo();
|
||||
}
|
||||
}
|
@ -0,0 +1,11 @@
|
||||
package com.baiye.design.pattern.creational.factorymethod;
|
||||
|
||||
public class Test {
|
||||
public static void main(String[] args) {
|
||||
VideoFactory videoFactory = new JavaVideoFactory();
|
||||
Video video = videoFactory.getVideo();
|
||||
video.produce();
|
||||
|
||||
|
||||
}
|
||||
}
|
@ -0,0 +1,5 @@
|
||||
package com.baiye.design.pattern.creational.factorymethod;
|
||||
|
||||
public abstract class Video {
|
||||
public abstract void produce();
|
||||
}
|
@ -0,0 +1,32 @@
|
||||
package com.baiye.design.pattern.creational.factorymethod;
|
||||
|
||||
public abstract class VideoFactory {
|
||||
|
||||
public abstract Video getVideo();
|
||||
/* public Video getVideo(String type) {
|
||||
if ("java".equalsIgnoreCase(type)) {
|
||||
return new JavaVideo();
|
||||
}
|
||||
|
||||
if ("python".equalsIgnoreCase(type)) {
|
||||
return new PythonVideo();
|
||||
}
|
||||
return null;
|
||||
|
||||
}*/
|
||||
|
||||
|
||||
// /**
|
||||
// * 使用反射来进行演进
|
||||
// */
|
||||
// public Video getVideo(Class clazz) {
|
||||
// Video video = null;
|
||||
// try {
|
||||
// video = (Video) Class.forName(clazz.getName()).newInstance();
|
||||
// } catch (InstantiationException | IllegalAccessException | ClassNotFoundException e) {
|
||||
// e.printStackTrace();
|
||||
// }
|
||||
// return video;
|
||||
// }
|
||||
|
||||
}
|
@ -0,0 +1,8 @@
|
||||
package com.baiye.design.pattern.creational.simplefactory;
|
||||
|
||||
public class JavaVideo extends Video{
|
||||
@Override
|
||||
public void produce() {
|
||||
System.out.println("录制Java视频");
|
||||
}
|
||||
}
|
@ -0,0 +1,8 @@
|
||||
package com.baiye.design.pattern.creational.simplefactory;
|
||||
|
||||
public class PythonVideo extends Video{
|
||||
@Override
|
||||
public void produce() {
|
||||
System.out.println("录制Python视频");
|
||||
}
|
||||
}
|
@ -0,0 +1,15 @@
|
||||
package com.baiye.design.pattern.creational.simplefactory;
|
||||
|
||||
public class Test {
|
||||
public static void main(String[] args) {
|
||||
// VideoFactory videoFactory = new VideoFactory();
|
||||
// Video video = videoFactory.getVideo("java");
|
||||
// assert video != null;
|
||||
// video.produce();
|
||||
|
||||
VideoFactory videoFactory = new VideoFactory();
|
||||
Video video = videoFactory.getVideo(JavaVideo.class);
|
||||
assert video != null;
|
||||
video.produce();
|
||||
}
|
||||
}
|
@ -0,0 +1,5 @@
|
||||
package com.baiye.design.pattern.creational.simplefactory;
|
||||
|
||||
public abstract class Video {
|
||||
public abstract void produce();
|
||||
}
|
@ -0,0 +1,30 @@
|
||||
package com.baiye.design.pattern.creational.simplefactory;
|
||||
|
||||
public class VideoFactory {
|
||||
/* public Video getVideo(String type) {
|
||||
if ("java".equalsIgnoreCase(type)) {
|
||||
return new JavaVideo();
|
||||
}
|
||||
|
||||
if ("python".equalsIgnoreCase(type)) {
|
||||
return new PythonVideo();
|
||||
}
|
||||
return null;
|
||||
|
||||
}*/
|
||||
|
||||
|
||||
/**
|
||||
* 使用反射来进行演进
|
||||
*/
|
||||
public Video getVideo(Class clazz) {
|
||||
Video video = null;
|
||||
try {
|
||||
video = (Video) Class.forName(clazz.getName()).newInstance();
|
||||
} catch (InstantiationException | IllegalAccessException | ClassNotFoundException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return video;
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,15 @@
|
||||
package com.baiye.design.structural.bridge;
|
||||
|
||||
public class ABCBank extends Bank{
|
||||
|
||||
public ABCBank(Account account) {
|
||||
super(account);
|
||||
}
|
||||
|
||||
@Override
|
||||
Account openAccount() {
|
||||
System.out.println("打开中国农业银行账号");
|
||||
account.openAccount();
|
||||
return account;
|
||||
}
|
||||
}
|
@ -0,0 +1,8 @@
|
||||
package com.baiye.design.structural.bridge;
|
||||
|
||||
public interface Account {
|
||||
|
||||
Account openAccount();
|
||||
|
||||
void showAccountType();
|
||||
}
|
@ -0,0 +1,17 @@
|
||||
package com.baiye.design.structural.bridge;
|
||||
|
||||
public abstract class Bank {
|
||||
|
||||
protected Account account;
|
||||
|
||||
public Bank(Account account){
|
||||
this.account = account;
|
||||
}
|
||||
|
||||
/**
|
||||
* 方法名可以和Account中的
|
||||
*/
|
||||
abstract Account openAccount();
|
||||
|
||||
|
||||
}
|
@ -0,0 +1,14 @@
|
||||
package com.baiye.design.structural.bridge;
|
||||
|
||||
public class DepositAccount implements Account{
|
||||
@Override
|
||||
public Account openAccount() {
|
||||
System.out.println("打开定期账号");
|
||||
return new DepositAccount();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void showAccountType() {
|
||||
System.out.println("这是一个定期账号");
|
||||
}
|
||||
}
|
@ -0,0 +1,15 @@
|
||||
package com.baiye.design.structural.bridge;
|
||||
|
||||
public class ICBCBank extends Bank{
|
||||
|
||||
public ICBCBank(Account account) {
|
||||
super(account);
|
||||
}
|
||||
|
||||
@Override
|
||||
Account openAccount() {
|
||||
System.out.println("打开中国工商银行账号");
|
||||
account.openAccount();
|
||||
return account;
|
||||
}
|
||||
}
|
@ -0,0 +1,14 @@
|
||||
package com.baiye.design.structural.bridge;
|
||||
|
||||
public class SavingAccount implements Account{
|
||||
@Override
|
||||
public Account openAccount() {
|
||||
System.out.println("打开活期账号");
|
||||
return new SavingAccount();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void showAccountType() {
|
||||
System.out.println("这是一个活期账号");
|
||||
}
|
||||
}
|
@ -0,0 +1,15 @@
|
||||
package com.baiye.design.structural.bridge;
|
||||
|
||||
public class Test {
|
||||
|
||||
public static void main(String[] args) {
|
||||
Bank icbcBank = new ICBCBank(new DepositAccount());
|
||||
Account icbcAccount = icbcBank.openAccount();
|
||||
icbcAccount.showAccountType();
|
||||
|
||||
Bank abcBank = new ICBCBank(new SavingAccount());
|
||||
Account abcAccount = abcBank.openAccount();
|
||||
abcAccount.showAccountType();
|
||||
|
||||
}
|
||||
}
|
@ -0,0 +1,11 @@
|
||||
package test;
|
||||
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.util.Arrays;
|
||||
|
||||
public class Test {
|
||||
public static void main(String[] args) {
|
||||
System.out.println(Arrays.toString("".getBytes(StandardCharsets.UTF_8)));
|
||||
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue