Java设计模式
This commit is contained in:
parent
f1286d87ae
commit
efc1088cc8
@ -0,0 +1,14 @@
|
|||||||
|
package com.heibaiying.behavioral.interpreter;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
|
||||||
|
public class AddExpression extends SymbolExpression {
|
||||||
|
public AddExpression(Expression left, Expression right) {
|
||||||
|
super(left, right);
|
||||||
|
}
|
||||||
|
|
||||||
|
//把左右两个表达式运算的结果加起来
|
||||||
|
public int interpreter(HashMap<String, Integer> var) {
|
||||||
|
return super.left.interpreter(var) + super.right.interpreter(var);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,44 @@
|
|||||||
|
package com.heibaiying.behavioral.interpreter;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Stack;
|
||||||
|
|
||||||
|
public class Calculator {
|
||||||
|
//定义表达式
|
||||||
|
private Expression expression;
|
||||||
|
|
||||||
|
//构造函数传参,并解析
|
||||||
|
public Calculator(String expStr) {
|
||||||
|
//定义一个栈,安排运算的先后顺序
|
||||||
|
Stack<Expression> stack = new Stack<>();
|
||||||
|
//表达式拆分为字符数组
|
||||||
|
char[] charArray = expStr.toCharArray();
|
||||||
|
//运算
|
||||||
|
Expression left;
|
||||||
|
Expression right;
|
||||||
|
for (int i = 0; i < charArray.length; i++) {
|
||||||
|
switch (charArray[i]) {
|
||||||
|
case '+': //加法
|
||||||
|
//加法结果放到栈中
|
||||||
|
left = stack.pop();
|
||||||
|
right = new VarExpression(String.valueOf(charArray[++i]));
|
||||||
|
stack.push(new AddExpression(left, right));
|
||||||
|
break;
|
||||||
|
case '-':
|
||||||
|
left = stack.pop();
|
||||||
|
right = new VarExpression(String.valueOf(charArray[++i]));
|
||||||
|
stack.push(new SubExpression(left, right));
|
||||||
|
break;
|
||||||
|
default: //公式中的变量
|
||||||
|
stack.push(new VarExpression(String.valueOf(charArray[i])));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//把运算结果抛出来
|
||||||
|
this.expression = stack.pop();
|
||||||
|
}
|
||||||
|
|
||||||
|
//开始运算
|
||||||
|
public int run(HashMap<String, Integer> var) {
|
||||||
|
return this.expression.interpreter(var);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,8 @@
|
|||||||
|
package com.heibaiying.behavioral.interpreter;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
|
||||||
|
public abstract class Expression {
|
||||||
|
//解析公式和数值,其中var中的key值是公式中的参数,value值是具体的数字
|
||||||
|
public abstract int interpreter(HashMap<String, Integer> var);
|
||||||
|
}
|
@ -0,0 +1,13 @@
|
|||||||
|
package com.heibaiying.behavioral.interpreter;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
|
||||||
|
public class SubExpression extends SymbolExpression {
|
||||||
|
public SubExpression(Expression left,Expression right){
|
||||||
|
super(left,right);
|
||||||
|
}
|
||||||
|
//左右两个表达式相减
|
||||||
|
public int interpreter(HashMap<String, Integer> var) {
|
||||||
|
return super.left.interpreter(var) - super.right.interpreter(var);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,12 @@
|
|||||||
|
package com.heibaiying.behavioral.interpreter;
|
||||||
|
|
||||||
|
public abstract class SymbolExpression extends Expression {
|
||||||
|
protected Expression left;
|
||||||
|
protected Expression right;
|
||||||
|
|
||||||
|
//所有的解析公式都应只关心自己左右两个表达式的结果
|
||||||
|
public SymbolExpression(Expression left, Expression right) {
|
||||||
|
this.left = left;
|
||||||
|
this.right = right;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,17 @@
|
|||||||
|
package com.heibaiying.behavioral.interpreter;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
|
||||||
|
public class VarExpression extends Expression {
|
||||||
|
|
||||||
|
private String key;
|
||||||
|
|
||||||
|
public VarExpression(String key) {
|
||||||
|
this.key = key;
|
||||||
|
}
|
||||||
|
|
||||||
|
//从map中取之
|
||||||
|
public int interpreter(HashMap<String, Integer> var) {
|
||||||
|
return var.get(this.key);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,39 @@
|
|||||||
|
package com.heibaiying.behavioral.interpreter;
|
||||||
|
|
||||||
|
import java.io.BufferedReader;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStreamReader;
|
||||||
|
import java.util.HashMap;
|
||||||
|
|
||||||
|
public class ZTest {
|
||||||
|
//运行四则运算
|
||||||
|
public static void main(String[] args) throws IOException {
|
||||||
|
String expStr = getExpStr();
|
||||||
|
//赋值
|
||||||
|
HashMap<String, Integer> var = getValue(expStr);
|
||||||
|
Calculator cal = new Calculator(expStr);
|
||||||
|
System.out.println("运算结果为:" + expStr + "=" + cal.run(var));
|
||||||
|
}
|
||||||
|
|
||||||
|
//获得表达式
|
||||||
|
public static String getExpStr() throws IOException {
|
||||||
|
System.out.print("请输入表达式:");
|
||||||
|
return (new BufferedReader(new InputStreamReader(System.in))).readLine();
|
||||||
|
}
|
||||||
|
|
||||||
|
//获得值映射
|
||||||
|
public static HashMap<String, Integer> getValue(String exprStr) throws IOException {
|
||||||
|
HashMap<String, Integer> map = new HashMap<String, Integer>();
|
||||||
|
//解析有几个参数要传递
|
||||||
|
for (char ch : exprStr.toCharArray()) {
|
||||||
|
if (ch != '+' && ch != '-') {
|
||||||
|
//解决重复参数的问题
|
||||||
|
if (!map.containsKey(String.valueOf(ch))) {
|
||||||
|
String in = (new BufferedReader(new InputStreamReader(System.in))).readLine();
|
||||||
|
map.put(String.valueOf(ch), Integer.valueOf(in));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return map;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,13 @@
|
|||||||
|
package com.heibaiying.behavioral.iterator;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
public class Book {
|
||||||
|
private String name;
|
||||||
|
|
||||||
|
public Book(String name) {
|
||||||
|
this.name = name;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,23 @@
|
|||||||
|
package com.heibaiying.behavioral.iterator;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class BookIterator implements Iterator<Book> {
|
||||||
|
|
||||||
|
private List<Book> bookList;
|
||||||
|
private int position = 0;
|
||||||
|
|
||||||
|
public BookIterator(List<Book> bookList) {
|
||||||
|
this.bookList = bookList;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Book next() {
|
||||||
|
return bookList.get(position++);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean hasNext() {
|
||||||
|
return position < bookList.size();
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,13 @@
|
|||||||
|
package com.heibaiying.behavioral.iterator;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 书柜
|
||||||
|
*/
|
||||||
|
public interface Bookshelf {
|
||||||
|
|
||||||
|
void addBook(Book book);
|
||||||
|
|
||||||
|
void removeBook(Book book);
|
||||||
|
|
||||||
|
BookIterator iterator();
|
||||||
|
}
|
@ -0,0 +1,27 @@
|
|||||||
|
package com.heibaiying.behavioral.iterator;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 书柜
|
||||||
|
*/
|
||||||
|
public class BookshelfImpl implements Bookshelf {
|
||||||
|
|
||||||
|
private List<Book> bookList = new ArrayList<>();
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void addBook(Book book) {
|
||||||
|
bookList.add(book);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void removeBook(Book book) {
|
||||||
|
bookList.remove(book);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public BookIterator iterator() {
|
||||||
|
return new BookIterator(bookList);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,6 @@
|
|||||||
|
package com.heibaiying.behavioral.iterator;
|
||||||
|
|
||||||
|
public interface Iterator<E> {
|
||||||
|
E next();
|
||||||
|
boolean hasNext();
|
||||||
|
}
|
@ -0,0 +1,14 @@
|
|||||||
|
package com.heibaiying.behavioral.iterator;
|
||||||
|
|
||||||
|
public class ZTest {
|
||||||
|
public static void main(String[] args) {
|
||||||
|
BookshelfImpl bookshelf = new BookshelfImpl();
|
||||||
|
bookshelf.addBook(new Book("Java书籍"));
|
||||||
|
bookshelf.addBook(new Book("Python书籍"));
|
||||||
|
bookshelf.addBook(new Book("Go书籍"));
|
||||||
|
BookIterator iterator = bookshelf.iterator();
|
||||||
|
while (iterator.hasNext()) {
|
||||||
|
System.out.println(iterator.next());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,26 @@
|
|||||||
|
package com.heibaiying.behavioral.observer;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class Business implements Observable {
|
||||||
|
|
||||||
|
private List<Observer> observerList = new ArrayList<>();
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void addObserver(Observer observer) {
|
||||||
|
observerList.add(observer);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void removeObserver(Observer observer) {
|
||||||
|
observerList.remove(observer);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void notifyObservers(String message) {
|
||||||
|
for (Observer observer : observerList) {
|
||||||
|
observer.receive(message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,10 @@
|
|||||||
|
package com.heibaiying.behavioral.observer;
|
||||||
|
|
||||||
|
public interface Observable {
|
||||||
|
|
||||||
|
void addObserver(Observer observer);
|
||||||
|
|
||||||
|
void removeObserver(Observer observer);
|
||||||
|
|
||||||
|
void notifyObservers(String message);
|
||||||
|
}
|
@ -0,0 +1,5 @@
|
|||||||
|
package com.heibaiying.behavioral.observer;
|
||||||
|
|
||||||
|
public interface Observer {
|
||||||
|
void receive(String message);
|
||||||
|
}
|
@ -0,0 +1,18 @@
|
|||||||
|
package com.heibaiying.behavioral.observer;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
public class User implements Observer {
|
||||||
|
|
||||||
|
private String name;
|
||||||
|
|
||||||
|
public User(String name) {
|
||||||
|
this.name = name;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void receive(String message) {
|
||||||
|
System.out.println(getName() + "收到消息:" + message);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,13 @@
|
|||||||
|
package com.heibaiying.behavioral.observer;
|
||||||
|
|
||||||
|
public class ZTest {
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
Business business = new Business();
|
||||||
|
business.addObserver(new User("用户1"));
|
||||||
|
business.addObserver(new User("用户2"));
|
||||||
|
business.addObserver(new User("用户3"));
|
||||||
|
business.notifyObservers("商品促销通知");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,8 @@
|
|||||||
|
package com.heibaiying.behavioral.strategy;
|
||||||
|
|
||||||
|
public class BonusStrategy implements Strategy {
|
||||||
|
@Override
|
||||||
|
public void execute() {
|
||||||
|
System.out.println("奖金激励");
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,15 @@
|
|||||||
|
package com.heibaiying.behavioral.strategy;
|
||||||
|
|
||||||
|
public class Company {
|
||||||
|
|
||||||
|
private Strategy strategy;
|
||||||
|
|
||||||
|
public Company setStrategy(Strategy strategy) {
|
||||||
|
this.strategy = strategy;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void execute() {
|
||||||
|
strategy.execute();
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,5 @@
|
|||||||
|
package com.heibaiying.behavioral.strategy;
|
||||||
|
|
||||||
|
public interface Strategy {
|
||||||
|
void execute();
|
||||||
|
}
|
@ -0,0 +1,8 @@
|
|||||||
|
package com.heibaiying.behavioral.strategy;
|
||||||
|
|
||||||
|
public class TravelStrategy implements Strategy {
|
||||||
|
@Override
|
||||||
|
public void execute() {
|
||||||
|
System.out.println("集体旅游");
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,8 @@
|
|||||||
|
package com.heibaiying.behavioral.strategy;
|
||||||
|
|
||||||
|
public class WorkOvertimeStrategy implements Strategy {
|
||||||
|
@Override
|
||||||
|
public void execute() {
|
||||||
|
System.out.println("奖励加班");
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,16 @@
|
|||||||
|
package com.heibaiying.behavioral.strategy;
|
||||||
|
|
||||||
|
public class ZTest {
|
||||||
|
public static void main(String[] args) {
|
||||||
|
// 营业额
|
||||||
|
int turnover = Integer.parseInt(args[0]);
|
||||||
|
Company company = new Company();
|
||||||
|
if (turnover > 1000) {
|
||||||
|
company.setStrategy(new BonusStrategy()).execute();
|
||||||
|
} else if (turnover > 100) {
|
||||||
|
company.setStrategy(new TravelStrategy()).execute();
|
||||||
|
} else {
|
||||||
|
company.setStrategy(new WorkOvertimeStrategy()).execute();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,14 @@
|
|||||||
|
package com.heibaiying.behavioral.template;
|
||||||
|
|
||||||
|
public class OlderPhone extends Phone {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
boolean needAddNFC() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
void packaged() {
|
||||||
|
System.out.println("附赠一个手机壳");
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,30 @@
|
|||||||
|
package com.heibaiying.behavioral.template;
|
||||||
|
|
||||||
|
public abstract class Phone {
|
||||||
|
|
||||||
|
public void assembling() {
|
||||||
|
adCamera();
|
||||||
|
addBattery();
|
||||||
|
if (needAddNFC()) {
|
||||||
|
addNFC();
|
||||||
|
}
|
||||||
|
packaged();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void adCamera() {
|
||||||
|
System.out.println("组装摄像头");
|
||||||
|
}
|
||||||
|
|
||||||
|
private void addBattery() {
|
||||||
|
System.out.println("安装电池");
|
||||||
|
}
|
||||||
|
|
||||||
|
private void addNFC() {
|
||||||
|
System.out.println("增加NFC功能");
|
||||||
|
}
|
||||||
|
|
||||||
|
// 钩子方法
|
||||||
|
abstract boolean needAddNFC();
|
||||||
|
|
||||||
|
abstract void packaged();
|
||||||
|
}
|
@ -0,0 +1,14 @@
|
|||||||
|
package com.heibaiying.behavioral.template;
|
||||||
|
|
||||||
|
public class SmartPhone extends Phone {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
boolean needAddNFC() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
void packaged() {
|
||||||
|
System.out.println("附赠耳机一副");
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,10 @@
|
|||||||
|
package com.heibaiying.behavioral.template;
|
||||||
|
|
||||||
|
public class ZTest {
|
||||||
|
public static void main(String[] args) {
|
||||||
|
OlderPhone olderPhone = new OlderPhone();
|
||||||
|
olderPhone.assembling();
|
||||||
|
SmartPhone smartPhone = new SmartPhone();
|
||||||
|
smartPhone.assembling();
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user