[新增功能](master): 更新了一些设计模式的代码

1. 桥接,工厂,建造者,模板方法,观察者,迭代器等

-
master
土豆兄弟 3 years ago
parent ee0e9609f7
commit 019731de62

@ -31,6 +31,103 @@
### 软件设计七大原则
---
### 简单工厂
#### 1 定义与类型
定义:由一个工厂对象决定创建出哪一种产品类的实例
类型:创建型,但不属于GOF23种设计模式
#### 2 适用场景
工厂类负责创建的对象比较少
客户端(应用层)只知道传入工厂类的参数对于如何创建对象(逻辑)不关心
#### 3 优点
只需要传入一个正确的参数,就可以获取你所需要的对象而无需知道其创建细节
#### 4 缺点
工厂类的职责相对过重,增加新的产品需要修改工厂类的判断逻辑,违背开闭原则
#### 5 coding
com.baiye.design.pattern.creational.simplefactory
---
### 工厂方法
#### 1 定义与类型
定义与类型: 定义一个创建对象的接口但让实现这个接口的类决定实例化哪个类工厂方法让类的实例化推迟到子类中进行
类型: 创建型
#### 2 适用类型
常见对象需要大量重复的代码
客户端(应用层)不依赖于产品类实例如何被创建,实现等细节
一个类通过其子类来指定创建哪个对象
#### 3 优点
用户只需要关心所需产品对应的工厂,无需关心创建细节
加入新产品符合开闭原则,提高可扩展性
#### 4 缺点
类的个数容易过多,增加复杂度
增加了系统的抽象性和理解难度
#### 5 coding
com.baiye.design.pattern.creational.factorymethod
#### 6 总结
产品有明确的产品组的同类特征的时候
---
### 抽象工厂
#### 1 定义与类型
定义:抽象工厂模式提供一个创建一系列相关或相互依赖对象的接口
无需指定它们具体的类
类型:创建型
#### 2 适用场景
客户端(应用层)不依赖于产品类实例如何被创建,实现等细节
强调一系列相关的产品细节(属于同一产品族)一起使用创建对象需要大量重复的代码
提供了一个产品类的类,所有的产品以同样的接口出现,从而使客户端不依赖于具体实现
#### 3 优点
具体产品在应用层代码隔离,无需关心创建细节
将一个系列的产品族统一到一起创建
#### 4 缺点
规定了所有可能被创建的产品集合,产品族中扩展新的产品困难,需要修改抽象工厂接口
增加了系统的抽象性和理解难度
#### 5 抽象工厂 - 产品等级结构与产品族
产品族:统一品牌的冰箱,洗衣机,空调等
产品等级结构:比如所有的空调啥的
#### 6 coding
com.baiye.design.pattern.creational.abstractfactory
---
### 建造者模式
#### 1 定义与类型
定义: 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示
用户只需指定需要建造的类型就可以得到它们,建造过程及细节不需要知道
类型:创建型
#### 2 使用场景
如果一个对象有非常复杂的内部结构(很多属性)
想把复杂对象的创建和使用分离
#### 3 优点
封装性好,创建和使用分离
扩展性好,建造类之间独立,一定程度上解耦
#### 4 缺点
产生多余的Builder对象
产品内部发生变化,建造者都要修改,成本较大
#### 5 Coding
com.baiye.design.pattern.creational.builder
#### 6 总结
适合做配置类的编写和实体类
---
### 单例模式
---
### 原型模式
#### 1
---
### 外观模式
### 装饰者模式
@ -139,6 +236,206 @@
#### 6 代码
com.baiye.design.structural.composite
---
### 桥接模式
#### 1 定义与类型
定义: 将抽象的部分与它的具体实现部分分离,使它们都可以独立地变化
通过组合的方式建立两个类之间联系,而不是继承
类型:结构型
#### 2 使用场景
抽象和具体实现之间增加更多的灵活性
一个类存在两个(或多个)独立变化的维度,且这两个(或多个)维度都需要独立进行扩展
不希望使用继承,或因为多层继承导致系统类的个数剧增
####3 优点
分离抽象部分及其具体实现部分
提高了系统的可扩展性
符合开闭原则
符合合成复用原则
#### 4 缺点
增加了系统的理解与设计难度
需要正确的识别出系统中两个独立变化的维度
#### 5 桥接-相关设计模式
桥接模式和组合模式
- 组合模式是强调部分和整体之间的组合
- 桥接模式是平行级别上的组合
桥接模式和适配器模式
- 都是为了让两个东西配合工作
- 适配器模式是改变已有的接口,让他们之间可以相互配合
- 桥接模式是分离抽象和他们具体的实现,目的是分离
#### 6 coding
# todo
---
### 模板方法模式
#### 1 定义与类型
定义: 定义了一个算法的骨架,并允许子类为一个或多个步骤提供实现
模板方法使得子类可以在不改变算法结构的情况下,重新定义算法的某些步骤
类型:行为型
#### 2 使用场景
一次性实现一个算法不变的部分,并将可变的行为留给子类来实现
各子类中公共的行为被提取出来并集中到一个公共父类中,从而避免代码重复
#### 3 优点
提高复用性 相同的放在父类中
提高扩展性 不同的放在子类中
符合开闭原则
#### 4 缺点
类数目增加
增加了系统实现的复杂度
继承关系自身缺点,如果父类添加新的抽象方法,所有子类都要改一遍
#### 5 模板方法-扩展
钩子方法 - 提供了缺省行为 - 子类在必要时候进行扩展
#### 6 模板方法 - 相关设计模式
模板方法和工厂方法模式
- 工厂方法是模板方法的一种特殊实现
模板方法和策略模式
- 策略模式是使不同的方法可以相互替换,并且不影响应用层客户端的使用
- 模板方法模式是定义流程,把不太一样的具体实现交给子类
#### 7 coding
com.baiye.design.behavioral.templatemethod
#### 8 总结
解决 if-else 问题
---
### 迭代器模式
#### 1 定义与类型
定义:提供一种方法,顺序访问一个集合对象中的各个元素,而又不暴露该对象的内部表示
类型:行为型
#### 2 使用场景
访问一个集合对象的内容而无需暴露它的内部表示
为遍历不同集合结构提供一个统一的接口
#### 3 优点
分离了集合对象的遍历行为
#### 4 缺点
类的个数成对增加
#### 5 迭代器 - 相关设计模式
迭代器和访问者模式
- 都是迭代的访问一个集合内的元素
- 访问者模式中扩展开放的部分,再作用于对象的操作上
- 迭代器模式,扩展开放的部分,作用在迭代器的种类上
#### 6 coding
com.baiye.design.behavioral.iterator
---
### 策略模式
#### 1 定义与类型
定义: 定义了算法家族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化不会影响到使用算法用户
if .. else ..
类型: 行为型
#### 2 适用场景
系统有很多类,而他们的区别仅仅是在于他们的行为不同
一个系统需要动态的在几种算法中选择一种
#### 3 优点
开闭原则
避免使用多重条件转移语句
提高算法的保密性和安全性
#### 4 缺点
客户端必须知道所有的策略类,并自行决定使用哪一个策略类
产生很多策略类
#### 7 策略模式相关的设计模式
策略模式和工厂模式
- 工厂模式是去创建对象,策略模式是接收已经创建好的对象
策略模式和状态模式
- 策略模式客户端需要知道选择是哪个策略
- 状态模式客户端是不需要关心具体的状态的,状态会自动转换
#### 8 coding
---
### 解释器模式
#### 1 定义与类型
定义: 给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子
为解释一种语言,而为语言创建的解释器
类型:行为型
#### 2 适用场景
某个特定类型问题发生频率足够高
#### 3 优点
语法由很多类表示,容易改变及扩展此"语言"
#### 4 缺点
当语法规则数目太多时,增加了系统复杂度
#### 5 解释器模式-相关设计模式
解释器模式和适配器模式
- 适配器模式是不需要提前知道适配的规则
- 解释器需要我们把规则写好,用规则进行解释
#### 6 coding
com.baiye.design.behavioral.interpreter
#### 7 总结
使用比较少
xxxxExpressionParser 命名规范
---
### 观察者模式
#### 1 定义与类型
定义:定义了对象之间的一对多依赖,让多个观察者对象同时监听某一个主题的对象,当主题对象发生变化时,它的所有依赖者(观察者)都会收到通知并更新
类型: 行为型
#### 2 使用场景
关联行为场景,建立一套触发机制
#### 3 优点
观察者和被观察者之间建立了一个抽象的耦合
观察者模式支持广播通信
#### 4 缺点
观察者之间有过多的细节依赖,提高时间消耗及程序复杂度
使用要得当,避免循环调用
#### 5 coding
com.baiye.design.behavioral.observer
#### 6 总结
Guava 的 EventBus 可以很方便的进行实现观察者模式
---
### 备忘录模式
#### 1 定义与类型
定义: 保存一个对象的某个状态,以便在适当的时候恢复对象
"后悔药"
类型: 行为型
#### 2 使用场景
保存及恢复数据相关业务场景
后悔的时候,即想恢复到之前的状态
#### 3 优点
为用户提供一种可恢复机制
存档信息的封装
#### 4 缺点
资源占用
#### 5 备忘录模式 - 相关的设计模式
备忘录模式和状态模式
- 备忘录模式是用实例来表示状态的
- 状态是用类来表示状态的
#### 6 coding
com.baiye.design.behavioral.memento
#### 7 总结
工作流中
---
### 中介者模式
#### 1 定义与类型
定义 一个封装一组对象 如何交互的对象
通过使对象明确地相互作用来促进松散耦合,并允许独立地改变他们的交互
类型: 行为型
#### 2 使用场景
系统中对象之间存在复杂的引用关系,产生的相互依赖关系结构混乱且难以理解
交互的公共行为,如果需要改变行为则可以增加新的中介者类
#### 3 优点
将一对多转化成1对1降低程序复杂性
类之间的解耦
#### 4 缺点
中介者过多,导致系统复杂
#### 5 中介者模式 - 相关设计模式
中介者模式和观察者模式
- 使用观察者模式来实现中介者模式中的角色相互的通信
#### 6 coding
com.baiye.design.behavioral.mediator
#### 7 总结
群,啥的批量操作都是中介者
---
### 责任链模式

@ -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…
Cancel
Save