Commit 1365e260 by yuwei

java设计模式

parent e183bd2c
package cn.datax.learning.design.patterns.behavioral.chain;
public abstract class AbstractLogger {
public static int INFO = 1;
public static int DEBUG = 2;
public static int ERROR = 3;
protected int level;
//责任链中的下一个元素
protected AbstractLogger nextLogger;
public void setNextLogger(AbstractLogger nextLogger) {
this.nextLogger = nextLogger;
}
public void logMessage(int level, String message) {
if (this.level <= level) {
write(message);
}
if (nextLogger !=null) {
nextLogger.logMessage(level, message);
}
}
abstract protected void write(String message);
}
package cn.datax.learning.design.patterns.behavioral.chain;
/**
* 责任链模式(Chain of Responsibility Pattern)
*/
public class ChainPatternDemo {
private static AbstractLogger getChainOfLoggers(){
AbstractLogger errorLogger = new ErrorLogger(AbstractLogger.ERROR);
AbstractLogger fileLogger = new FileLogger(AbstractLogger.DEBUG);
AbstractLogger consoleLogger = new ConsoleLogger(AbstractLogger.INFO);
errorLogger.setNextLogger(fileLogger);
fileLogger.setNextLogger(consoleLogger);
return errorLogger;
}
public static void main(String[] args) {
AbstractLogger loggerChain = getChainOfLoggers();
loggerChain.logMessage(AbstractLogger.INFO, "This is an information.");
loggerChain.logMessage(AbstractLogger.DEBUG, "This is a debug level information.");
loggerChain.logMessage(AbstractLogger.ERROR, "This is an error information.");
}
}
package cn.datax.learning.design.patterns.behavioral.chain;
public class ConsoleLogger extends AbstractLogger {
public ConsoleLogger(int level) {
this.level = level;
}
@Override
protected void write(String message) {
System.out.println("Standard Console::Logger: " + message);
}
}
package cn.datax.learning.design.patterns.behavioral.chain;
public class ErrorLogger extends AbstractLogger {
public ErrorLogger(int level) {
this.level = level;
}
@Override
protected void write(String message) {
System.out.println("Error Console::Logger: " + message);
}
}
package cn.datax.learning.design.patterns.behavioral.chain;
public class FileLogger extends AbstractLogger {
public FileLogger(int level) {
this.level = level;
}
@Override
protected void write(String message) {
System.out.println("File::Logger: " + message);
}
}
package cn.datax.learning.design.patterns.behavioral.command;
import java.util.ArrayList;
import java.util.List;
public class Broker {
private List<Order> orderList = new ArrayList<Order>();
public void takeOrder(Order order) {
orderList.add(order);
}
public void placeOrders() {
for (Order order : orderList) {
order.execute();
}
orderList.clear();
}
}
package cn.datax.learning.design.patterns.behavioral.command;
public class BuyStock implements Order {
private Stock abcStock;
public BuyStock(Stock abcStock) {
this.abcStock = abcStock;
}
public void execute() {
abcStock.buy();
}
}
package cn.datax.learning.design.patterns.behavioral.command;
/**
* 命令模式(Command Pattern)
*/
public class CommandPatternDemo {
public static void main(String[] args) {
Stock abcStock = new Stock();
BuyStock buyStockOrder = new BuyStock(abcStock);
SellStock sellStockOrder = new SellStock(abcStock);
Broker broker = new Broker();
broker.takeOrder(buyStockOrder);
broker.takeOrder(sellStockOrder);
broker.placeOrders();
}
}
package cn.datax.learning.design.patterns.behavioral.command;
public interface Order {
void execute();
}
package cn.datax.learning.design.patterns.behavioral.command;
public class SellStock implements Order {
private Stock abcStock;
public SellStock(Stock abcStock) {
this.abcStock = abcStock;
}
public void execute() {
abcStock.sell();
}
}
package cn.datax.learning.design.patterns.behavioral.command;
public class Stock {
private String name = "ABC";
private int quantity = 10;
public void buy() {
System.out.println("Stock [ Name: " + name + ", Quantity: " + quantity + " ] bought");
}
public void sell() {
System.out.println("Stock [ Name: " + name + ", Quantity: " + quantity + " ] sold");
}
}
package cn.datax.learning.design.patterns.behavioral.interpreter;
public class AndExpression implements Expression {
private Expression expr1 = null;
private Expression expr2 = null;
public AndExpression(Expression expr1, Expression expr2) {
this.expr1 = expr1;
this.expr2 = expr2;
}
@Override
public boolean interpret(String context) {
return expr1.interpret(context) && expr2.interpret(context);
}
}
package cn.datax.learning.design.patterns.behavioral.interpreter;
public interface Expression {
public boolean interpret(String context);
}
package cn.datax.learning.design.patterns.behavioral.interpreter;
/**
* 解释器模式(Interpreter Pattern)
*/
public class InterpreterPatternDemo {
//规则:Robert 和 John 是男性
public static Expression getMaleExpression() {
Expression robert = new TerminalExpression("Robert");
Expression john = new TerminalExpression("John");
return new OrExpression(robert, john);
}
//规则:Julie 是一个已婚的女性
public static Expression getMarriedWomanExpression() {
Expression julie = new TerminalExpression("Julie");
Expression married = new TerminalExpression("Married");
return new AndExpression(julie, married);
}
public static void main(String[] args) {
Expression isMale = getMaleExpression();
Expression isMarriedWoman = getMarriedWomanExpression();
System.out.println("John is male? " + isMale.interpret("John"));
System.out.println("Julie is a married women? " + isMarriedWoman.interpret("Married Julie"));
}
}
package cn.datax.learning.design.patterns.behavioral.interpreter;
public class OrExpression implements Expression {
private Expression expr1 = null;
private Expression expr2 = null;
public OrExpression(Expression expr1, Expression expr2) {
this.expr1 = expr1;
this.expr2 = expr2;
}
@Override
public boolean interpret(String context) {
return expr1.interpret(context) || expr2.interpret(context);
}
}
package cn.datax.learning.design.patterns.behavioral.interpreter;
public class TerminalExpression implements Expression {
private String data;
public TerminalExpression(String data) {
this.data = data;
}
@Override
public boolean interpret(String context) {
if (context.contains(data)) {
return true;
}
return false;
}
}
package cn.datax.learning.design.patterns.behavioral.iterator;
public interface Container {
public Iterator getIterator();
}
package cn.datax.learning.design.patterns.behavioral.iterator;
public interface Iterator {
public boolean hasNext();
public Object next();
}
package cn.datax.learning.design.patterns.behavioral.iterator;
/**
* 迭代器模式(Iterator Pattern)
*/
public class IteratorPatternDemo {
public static void main(String[] args) {
NameRepository namesRepository = new NameRepository();
for (Iterator iter = namesRepository.getIterator(); iter.hasNext();) {
String name = (String)iter.next();
System.out.println("Name : " + name);
}
}
}
package cn.datax.learning.design.patterns.behavioral.iterator;
public class NameRepository implements Container {
public String names[] = {"Robert" , "John" ,"Julie" , "Lora"};
@Override
public Iterator getIterator() {
return new StringArrayIterator(names);
}
}
package cn.datax.learning.design.patterns.behavioral.iterator;
public class StringArrayIterator implements Iterator{
String[] args;
int index = 0;
public StringArrayIterator(String[] argsTemp) {
this.args = argsTemp;
}
@Override
public boolean hasNext(){
if(index < args.length){
return true;
}
return false;
}
@Override
public Object next(){
if(index < args.length){
return args[index++];
}
return null;
}
}
package cn.datax.learning.design.patterns.behavioral.mediator;
import java.util.Date;
public class ChatRoom {
public static void showMessage(User user, String message) {
System.out.println(new Date().toString()
+ " [" + user.getName() + "] : " + message);
}
}
package cn.datax.learning.design.patterns.behavioral.mediator;
/**
* 中介者模式(Mediator Pattern)
*/
public class MediatorPatternDemo {
public static void main(String[] args) {
User robert = new User("Robert");
User john = new User("John");
robert.sendMessage("Hi! John!");
john.sendMessage("Hello! Robert!");
}
}
package cn.datax.learning.design.patterns.behavioral.mediator;
public class User {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public User(String name) {
this.name = name;
}
public void sendMessage(String message) {
ChatRoom.showMessage(this, message);
}
}
package cn.datax.learning.design.patterns.behavioral.memento;
import java.util.ArrayList;
import java.util.List;
public class CareTaker {
private List<Memento> mementoList = new ArrayList<Memento>();
public void add(Memento state) {
mementoList.add(state);
}
public Memento get(int index) {
return mementoList.get(index);
}
}
package cn.datax.learning.design.patterns.behavioral.memento;
public class Memento {
private String state;
public Memento(String state) {
this.state = state;
}
public String getState() {
return state;
}
}
package cn.datax.learning.design.patterns.behavioral.memento;
/**
* 备忘录模式(Memento Pattern)
*/
public class MementoPatternDemo {
public static void main(String[] args) {
Originator originator = new Originator();
CareTaker careTaker = new CareTaker();
originator.setState("State #1");
originator.setState("State #2");
careTaker.add(originator.saveStateToMemento());
originator.setState("State #3");
careTaker.add(originator.saveStateToMemento());
originator.setState("State #4");
System.out.println("Current State: " + originator.getState());
originator.getStateFromMemento(careTaker.get(0));
System.out.println("First saved State: " + originator.getState());
originator.getStateFromMemento(careTaker.get(1));
System.out.println("Second saved State: " + originator.getState());
}
}
package cn.datax.learning.design.patterns.behavioral.memento;
public class Originator {
private String state;
public void setState(String state) {
this.state = state;
}
public String getState() {
return state;
}
public Memento saveStateToMemento() {
return new Memento(state);
}
public void getStateFromMemento(Memento Memento) {
state = Memento.getState();
}
}
package cn.datax.learning.design.patterns.behavioral.nullPattern;
public abstract class AbstractCustomer {
protected String name;
public abstract boolean isNil();
public abstract String getName();
}
package cn.datax.learning.design.patterns.behavioral.nullPattern;
public class CustomerFactory {
public static final String[] names = {"Rob", "Joe", "Julie"};
public static AbstractCustomer getCustomer(String name) {
for (int i = 0; i < names.length; i++) {
if (names[i].equalsIgnoreCase(name)) {
return new RealCustomer(name);
}
}
return new NullCustomer();
}
}
package cn.datax.learning.design.patterns.behavioral.nullPattern;
public class NullCustomer extends AbstractCustomer {
@Override
public String getName() {
return "Not Available in Customer Database";
}
@Override
public boolean isNil() {
return true;
}
}
package cn.datax.learning.design.patterns.behavioral.nullPattern;
/**
* 空对象模式(Null Object Pattern)
*/
public class NullPatternDemo {
public static void main(String[] args) {
AbstractCustomer customer1 = CustomerFactory.getCustomer("Rob");
AbstractCustomer customer2 = CustomerFactory.getCustomer("Bob");
AbstractCustomer customer3 = CustomerFactory.getCustomer("Julie");
AbstractCustomer customer4 = CustomerFactory.getCustomer("Laura");
System.out.println("Customers");
System.out.println(customer1.getName());
System.out.println(customer2.getName());
System.out.println(customer3.getName());
System.out.println(customer4.getName());
}
}
package cn.datax.learning.design.patterns.behavioral.nullPattern;
public class RealCustomer extends AbstractCustomer {
public RealCustomer(String name) {
this.name = name;
}
@Override
public String getName() {
return name;
}
@Override
public boolean isNil() {
return false;
}
}
package cn.datax.learning.design.patterns.behavioral.observer;
public class BinaryObserver extends Observer{
public BinaryObserver(Subject subject) {
this.subject = subject;
this.subject.attach(this);
}
@Override
public void update() {
System.out.println( "Binary String: "
+ Integer.toBinaryString( subject.getState()));
}
}
package cn.datax.learning.design.patterns.behavioral.observer;
public class HexaObserver extends Observer{
public HexaObserver(Subject subject) {
this.subject = subject;
this.subject.attach(this);
}
@Override
public void update() {
System.out.println( "Hex String: "
+ Integer.toHexString( subject.getState()).toUpperCase());
}
}
package cn.datax.learning.design.patterns.behavioral.observer;
public abstract class Observer {
protected Subject subject;
public abstract void update();
}
package cn.datax.learning.design.patterns.behavioral.observer;
/**
* 观察者模式(Observer Pattern)
*/
public class ObserverPatternDemo {
public static void main(String[] args) {
Subject subject = new Subject();
new HexaObserver(subject);
new OctalObserver(subject);
new BinaryObserver(subject);
System.out.println("First state change: 15");
subject.setState(15);
System.out.println("Second state change: 10");
subject.setState(10);
}
}
package cn.datax.learning.design.patterns.behavioral.observer;
public class OctalObserver extends Observer{
public OctalObserver(Subject subject) {
this.subject = subject;
this.subject.attach(this);
}
@Override
public void update() {
System.out.println( "Octal String: "
+ Integer.toOctalString( subject.getState()));
}
}
package cn.datax.learning.design.patterns.behavioral.observer;
import java.util.ArrayList;
import java.util.List;
public class Subject {
private List<Observer> observers = new ArrayList<Observer>();
private int state;
public int getState() {
return state;
}
public void setState(int state) {
this.state = state;
notifyAllObservers();
}
public void attach(Observer observer) {
observers.add(observer);
}
public void notifyAllObservers() {
for (Observer observer : observers) {
observer.update();
}
}
}
package cn.datax.learning.design.patterns.behavioral.state;
public class Context {
private State state;
public Context(){
state = null;
}
public void setState(State state) {
this.state = state;
}
public State getState() {
return state;
}
}
package cn.datax.learning.design.patterns.behavioral.state;
public class StartState implements State {
public void doAction(Context context) {
System.out.println("Player is in start state");
context.setState(this);
}
public String toString() {
return "Start State";
}
}
package cn.datax.learning.design.patterns.behavioral.state;
public interface State {
public void doAction(Context context);
}
package cn.datax.learning.design.patterns.behavioral.state;
/**
* 状态模式(State Pattern)
*/
public class StatePatternDemo {
public static void main(String[] args) {
Context context = new Context();
StartState startState = new StartState();
startState.doAction(context);
System.out.println(context.getState().toString());
StopState stopState = new StopState();
stopState.doAction(context);
System.out.println(context.getState().toString());
}
}
package cn.datax.learning.design.patterns.behavioral.state;
public class StopState implements State {
public void doAction(Context context) {
System.out.println("Player is in stop state");
context.setState(this);
}
public String toString() {
return "Stop State";
}
}
package cn.datax.learning.design.patterns.behavioral.strategy;
public class Context {
private Strategy strategy;
public Context() {}
public void SetStrategy(Strategy strategy) {
this.strategy = strategy;
}
public int executeStrategy(int num1, int num2) {
return strategy.doOperation(num1, num2);
}
}
package cn.datax.learning.design.patterns.behavioral.strategy;
public class OperationAdd implements Strategy {
@Override
public int doOperation(int num1, int num2) {
return num1 + num2;
}
}
package cn.datax.learning.design.patterns.behavioral.strategy;
public class OperationMultiply implements Strategy {
@Override
public int doOperation(int num1, int num2) {
return num1 * num2;
}
}
package cn.datax.learning.design.patterns.behavioral.strategy;
public class OperationSubstract implements Strategy {
@Override
public int doOperation(int num1, int num2) {
return num1 - num2;
}
}
package cn.datax.learning.design.patterns.behavioral.strategy;
public interface Strategy {
public int doOperation(int num1, int num2);
}
package cn.datax.learning.design.patterns.behavioral.strategy;
/**
* 策略模式(Strategy Pattern)
*/
public class StrategyPatternDemo {
public static void main(String[] args) {
Context context = new Context();
context.SetStrategy(new OperationAdd());
System.out.println("10 + 5 = " + context.executeStrategy(10, 5));
context.SetStrategy(new OperationSubstract());
System.out.println("10 - 5 = " + context.executeStrategy(10, 5));
context.SetStrategy(new OperationMultiply()); System.out.println("10 * 5 = " + context.executeStrategy(10, 5));
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment