├── .gitignore ├── src └── com │ └── design │ └── pattern │ ├── proxy │ ├── Image.java │ ├── ProxyExample.java │ ├── ProxyImage.java │ └── RealImage.java │ ├── facade │ ├── Shape.java │ ├── Circle.java │ ├── Triangle.java │ ├── Rectangle.java │ ├── FacadeClient.java │ └── ShapeMaker.java │ ├── command │ ├── command │ │ ├── Command.java │ │ ├── NoCommand.java │ │ ├── WizardCommand.java │ │ ├── WarriorCommand.java │ │ ├── GoblinCommand.java │ │ ├── KnightCommand.java │ │ ├── SonGokuCommand.java │ │ ├── MircoCommand.java │ │ └── BaseballPlayerCommand.java │ ├── army │ │ ├── Goblin.java │ │ ├── Warrior.java │ │ ├── Wizard.java │ │ ├── BaseballPlayer.java │ │ ├── Knight.java │ │ └── SonGoku.java │ ├── remotecontrol │ │ └── SimpleRemoteControl.java │ └── FightMain.java │ ├── iterator │ ├── Container.java │ ├── Iterator.java │ ├── IteratorPatternDemo.java │ └── NameRepository.java │ ├── adapter │ ├── Duck.java │ ├── Turkey.java │ ├── MallardDuck.java │ ├── WildTurkey.java │ ├── classadapter │ │ ├── TurkeyClassAdapter.java │ │ └── DuckTestDriveByClassAdapter.java │ └── objectadapter │ │ ├── TurkeyObjectAdapter.java │ │ └── DuckTestDriveByObjectAdapter.java │ ├── strategy │ ├── duck │ │ ├── QuackBehavior.java │ │ ├── SwimBehavior.java │ │ ├── FlyBehavior.java │ │ ├── Float.java │ │ ├── FlyNoWay.java │ │ ├── Quack.java │ │ ├── Squeak.java │ │ ├── FlyWithWings.java │ │ ├── MuteQuack.java │ │ ├── FlyWithRocket.java │ │ ├── SwimWithTurbineEngine.java │ │ ├── SwimWithWebbedFeet.java │ │ ├── ModelDuck.java │ │ ├── MallardDuck.java │ │ ├── RedHeadDuck.java │ │ ├── RubberDuck.java │ │ ├── Duck.java │ │ └── MiniDuckSimulator.java │ └── employee │ │ ├── EmployeeType.java │ │ ├── Engineer.java │ │ ├── Merchant.java │ │ ├── Salesman.java │ │ ├── WorkSpace.java │ │ └── Employee.java │ ├── chain │ ├── RequestType.java │ ├── OrcKing.java │ ├── OrcOfficer.java │ ├── OrcSoldier.java │ ├── OrcCommander.java │ ├── RequestHandler.java │ ├── OrcNationMain.java │ └── Request.java │ ├── factorymethod │ ├── Document.java │ ├── DocumentFactory.java │ ├── PdfFactory.java │ ├── TxtFactory.java │ ├── FactoryClient.java │ ├── PdfDocument.java │ └── TxtDocument.java │ ├── decorator │ ├── Burger.java │ ├── Sandwich.java │ ├── CondimentDecorator.java │ ├── WhopperBurger.java │ ├── SubmarineSandwich.java │ ├── Beef.java │ ├── Bacon.java │ ├── Cheese.java │ ├── Chicken.java │ ├── Lettuce.java │ └── BurgerQueen.java │ ├── State │ ├── State.java │ ├── TVStartState.java │ ├── TVStopState.java │ ├── TVContext.java │ └── TVRemote.java │ ├── builder │ ├── Pizza.java │ ├── HawaiianPizzaBuilder.java │ ├── SpicyPizzaBuilder.java │ ├── PizzaBuilder.java │ ├── Waiter.java │ └── builderDemo.java │ ├── observer │ ├── Observer.java │ ├── Subject.java │ ├── GuavaDaliyNewsDisplay.java │ ├── YahuNewsDisplay.java │ ├── DnnNewsDisplay.java │ ├── CccNewsDisplay.java │ ├── NewsStation.java │ └── NewsData.java │ ├── visitor │ ├── ComputerPart.java │ ├── ComputerPartVisitor.java │ ├── Monitor.java │ ├── Mouse.java │ ├── Keyboard.java │ ├── VisitorPatternDemo.java │ ├── UserInputVisitor.java │ ├── ComputerPartDisplayVisitor.java │ └── Computer.java │ ├── bridge │ ├── drawing │ │ ├── Drawing.java │ │ ├── V2Drawing.java │ │ ├── V1Drawing.java │ │ ├── DP2.java │ │ └── DP1.java │ ├── BridgeClient.java │ ├── shape │ │ ├── Circle.java │ │ ├── Shape.java │ │ └── Rectangle.java │ └── Factory.java │ ├── prototype │ ├── Cookie.java │ └── CookieMachine.java │ ├── interpreter │ ├── InterpreterException.java │ ├── expression │ │ ├── Expression.java │ │ ├── NumberExpression.java │ │ ├── VariableExpression.java │ │ ├── AddExpression.java │ │ └── MultiplyExpression.java │ ├── Interpreter.java │ ├── parser │ │ ├── Token.java │ │ ├── Tokenizer.java │ │ └── Parser.java │ └── Main.java │ ├── singleton │ ├── AccountClient.java │ ├── ATM.java │ ├── Government.java │ ├── Account.java │ └── Country.java │ ├── composite │ ├── Employee.java │ ├── CompositeClient.java │ ├── Developer.java │ └── Manager.java │ ├── templatemethod │ ├── Tea.java │ ├── Coffee.java │ ├── StarBuzzTestDrive.java │ └── CaffeineBeverage.java │ ├── mediator │ ├── MediatorPatternDemo.java │ ├── User.java │ └── ChatRoom.java │ ├── memento │ ├── Application.java │ ├── Backup.java │ ├── Recovery.java │ └── Main.java │ └── builder2 │ ├── UserDemo.java │ └── User.java └── README.md /.gitignore: -------------------------------------------------------------------------------- 1 | # Java class files 2 | *.class 3 | 4 | # generated files 5 | bin/ 6 | 7 | # IDEA 8 | *.iml 9 | .idea -------------------------------------------------------------------------------- /src/com/design/pattern/proxy/Image.java: -------------------------------------------------------------------------------- 1 | package com.design.pattern.proxy; 2 | 3 | interface Image { 4 | public void displayImage(); 5 | } -------------------------------------------------------------------------------- /src/com/design/pattern/facade/Shape.java: -------------------------------------------------------------------------------- 1 | package com.design.pattern.facade; 2 | 3 | public interface Shape { 4 | void draw(); 5 | } 6 | -------------------------------------------------------------------------------- /src/com/design/pattern/command/command/Command.java: -------------------------------------------------------------------------------- 1 | package com.design.pattern.command.command; 2 | 3 | public interface Command { 4 | public void attack(); 5 | } 6 | -------------------------------------------------------------------------------- /src/com/design/pattern/iterator/Container.java: -------------------------------------------------------------------------------- 1 | package com.design.pattern.iterator; 2 | 3 | public interface Container { 4 | public Iterator getIterator(); 5 | } -------------------------------------------------------------------------------- /src/com/design/pattern/adapter/Duck.java: -------------------------------------------------------------------------------- 1 | package com.design.pattern.adapter; 2 | 3 | public interface Duck { 4 | public void quack(); 5 | public void fly(); 6 | } 7 | -------------------------------------------------------------------------------- /src/com/design/pattern/strategy/duck/QuackBehavior.java: -------------------------------------------------------------------------------- 1 | package com.design.pattern.strategy.duck; 2 | 3 | public interface QuackBehavior { 4 | public void quack(); 5 | } 6 | -------------------------------------------------------------------------------- /src/com/design/pattern/chain/RequestType.java: -------------------------------------------------------------------------------- 1 | package com.design.pattern.chain; 2 | 3 | public enum RequestType { 4 | DEFEND_CASTLE, TRAIN_SOLDIER, COLLECT_TAX, BUILD_HOUSE 5 | } -------------------------------------------------------------------------------- /src/com/design/pattern/factorymethod/Document.java: -------------------------------------------------------------------------------- 1 | package com.design.pattern.factorymethod; 2 | 3 | public interface Document { 4 | void open(); 5 | void close(); 6 | } 7 | -------------------------------------------------------------------------------- /src/com/design/pattern/strategy/duck/SwimBehavior.java: -------------------------------------------------------------------------------- 1 | 2 | package com.design.pattern.strategy.duck; 3 | 4 | public interface SwimBehavior { 5 | public void swim(); 6 | } 7 | -------------------------------------------------------------------------------- /src/com/design/pattern/iterator/Iterator.java: -------------------------------------------------------------------------------- 1 | package com.design.pattern.iterator; 2 | 3 | public interface Iterator { 4 | public boolean hasNext(); 5 | public Object next(); 6 | } -------------------------------------------------------------------------------- /src/com/design/pattern/strategy/duck/FlyBehavior.java: -------------------------------------------------------------------------------- 1 | 2 | package com.design.pattern.strategy.duck; 3 | 4 | public interface FlyBehavior { 5 | 6 | public void fly(); 7 | 8 | } 9 | -------------------------------------------------------------------------------- /src/com/design/pattern/decorator/Burger.java: -------------------------------------------------------------------------------- 1 | package com.design.pattern.decorator; 2 | 3 | public interface Burger { 4 | public String getDescription(); 5 | 6 | public float cost(); 7 | } 8 | -------------------------------------------------------------------------------- /src/com/design/pattern/State/State.java: -------------------------------------------------------------------------------- 1 | package com.design.pattern.State; 2 | 3 | /** 4 | * Created by karenlin on 2015/4/14. 5 | */ 6 | public interface State { 7 | public void doAction(); 8 | } 9 | -------------------------------------------------------------------------------- /src/com/design/pattern/factorymethod/DocumentFactory.java: -------------------------------------------------------------------------------- 1 | package com.design.pattern.factorymethod; 2 | 3 | public abstract class DocumentFactory { 4 | public abstract Document create(); 5 | } 6 | -------------------------------------------------------------------------------- /src/com/design/pattern/command/army/Goblin.java: -------------------------------------------------------------------------------- 1 | package com.design.pattern.command.army; 2 | 3 | public class Goblin { 4 | public void attack() { 5 | System.out.println("goblin attack!"); 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /src/com/design/pattern/adapter/Turkey.java: -------------------------------------------------------------------------------- 1 | 2 | package com.design.pattern.adapter; 3 | 4 | public interface Turkey { 5 | 6 | public void gobble(); 7 | 8 | public void fly(); 9 | } 10 | -------------------------------------------------------------------------------- /src/com/design/pattern/builder/Pizza.java: -------------------------------------------------------------------------------- 1 | package com.design.pattern.builder; 2 | 3 | public class Pizza { 4 | public String dough = ""; 5 | public String sauce = ""; 6 | public String topping = ""; 7 | } 8 | -------------------------------------------------------------------------------- /src/com/design/pattern/command/army/Warrior.java: -------------------------------------------------------------------------------- 1 | package com.design.pattern.command.army; 2 | 3 | public class Warrior { 4 | public void attack(){ 5 | System.out.println("warrior attack!"); 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /src/com/design/pattern/command/army/Wizard.java: -------------------------------------------------------------------------------- 1 | package com.design.pattern.command.army; 2 | 3 | public class Wizard { 4 | public void spell() { 5 | System.out.println("wizard spell"); 6 | } 7 | 8 | } 9 | -------------------------------------------------------------------------------- /src/com/design/pattern/strategy/employee/EmployeeType.java: -------------------------------------------------------------------------------- 1 | package com.design.pattern.strategy.employee; 2 | 3 | public abstract class EmployeeType { 4 | 5 | public abstract int payAmount(Employee employee); 6 | } 7 | -------------------------------------------------------------------------------- /src/com/design/pattern/command/army/BaseballPlayer.java: -------------------------------------------------------------------------------- 1 | package com.design.pattern.command.army; 2 | 3 | public class BaseballPlayer { 4 | public void swingBat(){ 5 | System.out.println("baseball player swing bat!"); 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /src/com/design/pattern/command/army/Knight.java: -------------------------------------------------------------------------------- 1 | package com.design.pattern.command.army; 2 | 3 | public class Knight { 4 | public void rideHorseAndAttack(){ 5 | System.out.println("knight ride hourse and attack!"); 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /src/com/design/pattern/observer/Observer.java: -------------------------------------------------------------------------------- 1 | 2 | package com.design.pattern.observer; 3 | 4 | public interface Observer { 5 | public void update(String headlineNews, String sportsNews, String financeNews, String entertainmentNews); 6 | } 7 | -------------------------------------------------------------------------------- /src/com/design/pattern/command/command/NoCommand.java: -------------------------------------------------------------------------------- 1 | package com.design.pattern.command.command; 2 | 3 | 4 | public class NoCommand implements Command { 5 | 6 | @Override 7 | public void attack() { 8 | 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /src/com/design/pattern/facade/Circle.java: -------------------------------------------------------------------------------- 1 | package com.design.pattern.facade; 2 | 3 | public class Circle implements Shape { 4 | 5 | @Override 6 | public void draw() { 7 | System.out.println("Circle::draw()"); 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /src/com/design/pattern/facade/Triangle.java: -------------------------------------------------------------------------------- 1 | package com.design.pattern.facade; 2 | 3 | public class Triangle implements Shape { 4 | 5 | @Override 6 | public void draw() { 7 | System.out.println("Triangle::draw()"); 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /src/com/design/pattern/facade/Rectangle.java: -------------------------------------------------------------------------------- 1 | package com.design.pattern.facade; 2 | 3 | public class Rectangle implements Shape { 4 | 5 | @Override 6 | public void draw() { 7 | System.out.println("Rectangle::draw()"); 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /src/com/design/pattern/strategy/duck/Float.java: -------------------------------------------------------------------------------- 1 | package com.design.pattern.strategy.duck; 2 | 3 | public class Float implements SwimBehavior { 4 | 5 | @Override 6 | public void swim() { 7 | System.out.println("float"); 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /src/com/design/pattern/visitor/ComputerPart.java: -------------------------------------------------------------------------------- 1 | package com.design.pattern.visitor; 2 | 3 | public interface ComputerPart { 4 | public void accept(ComputerPartVisitor computerPartVisitor); 5 | public void accept(UserInputVisitor userInputVisitor); 6 | } 7 | -------------------------------------------------------------------------------- /src/com/design/pattern/strategy/duck/FlyNoWay.java: -------------------------------------------------------------------------------- 1 | package com.design.pattern.strategy.duck; 2 | 3 | public class FlyNoWay implements FlyBehavior{ 4 | 5 | @Override 6 | public void fly() { 7 | System.out.println("I can't fly"); 8 | } 9 | 10 | } 11 | -------------------------------------------------------------------------------- /src/com/design/pattern/strategy/duck/Quack.java: -------------------------------------------------------------------------------- 1 | 2 | package com.design.pattern.strategy.duck; 3 | 4 | public class Quack implements QuackBehavior { 5 | 6 | @Override 7 | public void quack() { 8 | System.out.println("Quack"); 9 | } 10 | 11 | } 12 | -------------------------------------------------------------------------------- /src/com/design/pattern/strategy/duck/Squeak.java: -------------------------------------------------------------------------------- 1 | 2 | package com.design.pattern.strategy.duck; 3 | 4 | public class Squeak implements QuackBehavior { 5 | 6 | @Override 7 | public void quack() { 8 | System.out.println("Squeak"); 9 | } 10 | 11 | } 12 | -------------------------------------------------------------------------------- /src/com/design/pattern/bridge/drawing/Drawing.java: -------------------------------------------------------------------------------- 1 | package com.design.pattern.bridge.drawing; 2 | 3 | public abstract class Drawing { 4 | public abstract void drawLine(double x1, double y1, double x2, double y2); 5 | public abstract void drawCircle(double x, double y, double r); 6 | } 7 | -------------------------------------------------------------------------------- /src/com/design/pattern/strategy/duck/FlyWithWings.java: -------------------------------------------------------------------------------- 1 | package com.design.pattern.strategy.duck; 2 | 3 | public class FlyWithWings implements FlyBehavior{ 4 | 5 | @Override 6 | public void fly() { 7 | System.out.println("I'm flying!!"); 8 | } 9 | 10 | } 11 | -------------------------------------------------------------------------------- /src/com/design/pattern/strategy/duck/MuteQuack.java: -------------------------------------------------------------------------------- 1 | 2 | package com.design.pattern.strategy.duck; 3 | 4 | public class MuteQuack implements QuackBehavior { 5 | 6 | @Override 7 | public void quack() { 8 | System.out.println("<< Silence >>"); 9 | } 10 | 11 | } 12 | -------------------------------------------------------------------------------- /src/com/design/pattern/observer/Subject.java: -------------------------------------------------------------------------------- 1 | 2 | package com.design.pattern.observer; 3 | 4 | public interface Subject { 5 | public void registerObserver(Observer object); 6 | 7 | public void removeObserver(Observer object); 8 | 9 | public void notifyObservers(); 10 | } 11 | -------------------------------------------------------------------------------- /src/com/design/pattern/strategy/employee/Engineer.java: -------------------------------------------------------------------------------- 1 | package com.design.pattern.strategy.employee; 2 | 3 | public class Engineer extends EmployeeType { 4 | 5 | @Override 6 | public int payAmount(Employee employee) { 7 | return employee.getMonthSalary(); 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /src/com/design/pattern/adapter/MallardDuck.java: -------------------------------------------------------------------------------- 1 | package com.design.pattern.adapter; 2 | 3 | public class MallardDuck implements Duck { 4 | public void quack() { 5 | System.out.println("Quack"); 6 | } 7 | 8 | public void fly() { 9 | System.out.println("I'm flying"); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /src/com/design/pattern/State/TVStartState.java: -------------------------------------------------------------------------------- 1 | package com.design.pattern.State; 2 | 3 | /** 4 | * Created by karenlin on 2015/4/14. 5 | */ 6 | public class TVStartState implements State { 7 | @Override 8 | public void doAction() { 9 | System.out.println("TV is turned ON"); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /src/com/design/pattern/State/TVStopState.java: -------------------------------------------------------------------------------- 1 | package com.design.pattern.State; 2 | 3 | /** 4 | * Created by karenlin on 2015/4/14. 5 | */ 6 | public class TVStopState implements State { 7 | @Override 8 | public void doAction() { 9 | System.out.println("TV is turned OFF"); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /src/com/design/pattern/decorator/Sandwich.java: -------------------------------------------------------------------------------- 1 | package com.design.pattern.decorator; 2 | 3 | public class Sandwich implements Burger { 4 | 5 | public String getDescription() { 6 | return "sandwich"; 7 | } 8 | 9 | @Override 10 | public float cost() { 11 | return 0.9f; 12 | } 13 | 14 | } 15 | -------------------------------------------------------------------------------- /src/com/design/pattern/strategy/duck/FlyWithRocket.java: -------------------------------------------------------------------------------- 1 | 2 | package com.design.pattern.strategy.duck; 3 | 4 | public class FlyWithRocket implements FlyBehavior{ 5 | 6 | @Override 7 | public void fly() { 8 | System.out.println("I'm fly with rocket!!"); 9 | } 10 | 11 | } 12 | -------------------------------------------------------------------------------- /src/com/design/pattern/decorator/CondimentDecorator.java: -------------------------------------------------------------------------------- 1 | package com.design.pattern.decorator; 2 | 3 | public abstract class CondimentDecorator implements Burger { 4 | 5 | protected Burger burger; 6 | 7 | public CondimentDecorator(Burger burger) { 8 | this.burger = burger; 9 | } 10 | 11 | } 12 | -------------------------------------------------------------------------------- /src/com/design/pattern/decorator/WhopperBurger.java: -------------------------------------------------------------------------------- 1 | package com.design.pattern.decorator; 2 | 3 | public class WhopperBurger implements Burger { 4 | 5 | public String getDescription() { 6 | return "whopper"; 7 | } 8 | 9 | @Override 10 | public float cost() { 11 | return 1.0f; 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/com/design/pattern/strategy/duck/SwimWithTurbineEngine.java: -------------------------------------------------------------------------------- 1 | 2 | package com.design.pattern.strategy.duck; 3 | 4 | public class SwimWithTurbineEngine implements SwimBehavior { 5 | @Override 6 | public void swim() { 7 | System.out.println("swim with turbine engine"); 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /src/com/design/pattern/strategy/duck/SwimWithWebbedFeet.java: -------------------------------------------------------------------------------- 1 | package com.design.pattern.strategy.duck; 2 | 3 | public class SwimWithWebbedFeet implements SwimBehavior { 4 | 5 | @Override 6 | public void swim() { 7 | System.out.println("swim with webbed feet"); 8 | } 9 | 10 | } 11 | -------------------------------------------------------------------------------- /src/com/design/pattern/visitor/ComputerPartVisitor.java: -------------------------------------------------------------------------------- 1 | package com.design.pattern.visitor; 2 | 3 | public interface ComputerPartVisitor { 4 | public void visit(Computer computer); 5 | public void visit(Mouse mouse); 6 | public void visit(Keyboard keyboard); 7 | public void visit(Monitor monitor); 8 | } -------------------------------------------------------------------------------- /src/com/design/pattern/strategy/employee/Merchant.java: -------------------------------------------------------------------------------- 1 | package com.design.pattern.strategy.employee; 2 | 3 | public class Merchant extends EmployeeType { 4 | 5 | @Override 6 | public int payAmount(Employee employee) { 7 | return employee.getMonthSalary() + employee.getBonus(); 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /src/com/design/pattern/prototype/Cookie.java: -------------------------------------------------------------------------------- 1 | package com.design.pattern.prototype; 2 | 3 | public class Cookie implements Cloneable { 4 | 5 | public String cookieName; 6 | public String cookieEndDate; 7 | 8 | public Object clone() throws CloneNotSupportedException { 9 | return (Cookie) super.clone(); 10 | } 11 | } -------------------------------------------------------------------------------- /src/com/design/pattern/strategy/employee/Salesman.java: -------------------------------------------------------------------------------- 1 | package com.design.pattern.strategy.employee; 2 | 3 | public class Salesman extends EmployeeType { 4 | 5 | @Override 6 | public int payAmount(Employee employee) { 7 | return employee.getMonthSalary() + employee.getCommission(); 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /src/com/design/pattern/interpreter/InterpreterException.java: -------------------------------------------------------------------------------- 1 | package com.design.pattern.interpreter; 2 | 3 | public class InterpreterException extends Exception { 4 | private static final long serialVersionUID = 8459803686326291973L; 5 | 6 | public InterpreterException(String message) { 7 | super(message); 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /src/com/design/pattern/command/army/SonGoku.java: -------------------------------------------------------------------------------- 1 | package com.design.pattern.command.army; 2 | 3 | public class SonGoku { 4 | public void kamehameha() { 5 | System.out.println("Ka me ha me ha ~"); 6 | } 7 | 8 | public void superSaiyan() { 9 | System.out.println("Super Saiyan, power up!!"); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /src/com/design/pattern/proxy/ProxyExample.java: -------------------------------------------------------------------------------- 1 | package com.design.pattern.proxy; 2 | 3 | class ProxyExample { 4 | public static void main(String[] args) { 5 | Image image1 = new ProxyImage("HiRes_10MB_Photo1"); 6 | 7 | image1.displayImage(); // loading necessary 8 | image1.displayImage(); // loading unnecessary 9 | } 10 | } -------------------------------------------------------------------------------- /src/com/design/pattern/singleton/AccountClient.java: -------------------------------------------------------------------------------- 1 | package com.design.pattern.singleton; 2 | 3 | public class AccountClient { 4 | public static void main(String[] args) { 5 | ATM atmKH = new ATM(); 6 | atmKH.deposit(3000); 7 | 8 | ATM atmTP = new ATM(); 9 | atmTP.withdraw(5000); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /src/com/design/pattern/builder/HawaiianPizzaBuilder.java: -------------------------------------------------------------------------------- 1 | package com.design.pattern.builder; 2 | 3 | public class HawaiianPizzaBuilder extends PizzaBuilder { 4 | public void buildDough() { pizza.dough = "cross"; } 5 | public void buildSauce() { pizza.sauce = "mild"; } 6 | public void buildTopping() { pizza.topping = "ham + pineapple"; } 7 | } 8 | -------------------------------------------------------------------------------- /src/com/design/pattern/builder/SpicyPizzaBuilder.java: -------------------------------------------------------------------------------- 1 | package com.design.pattern.builder; 2 | 3 | public class SpicyPizzaBuilder extends PizzaBuilder { 4 | public void buildDough() { pizza.dough = "pan baked"; } 5 | public void buildSauce() { pizza.sauce = "hot"; } 6 | public void buildTopping() { pizza.topping = "pepperoni + salami"; } 7 | } 8 | -------------------------------------------------------------------------------- /src/com/design/pattern/decorator/SubmarineSandwich.java: -------------------------------------------------------------------------------- 1 | package com.design.pattern.decorator; 2 | 3 | public class SubmarineSandwich implements Burger { 4 | 5 | @Override 6 | public String getDescription() { 7 | return "submarine sandwich"; 8 | } 9 | 10 | @Override 11 | public float cost() { 12 | return 1.10f; 13 | } 14 | 15 | } 16 | -------------------------------------------------------------------------------- /src/com/design/pattern/interpreter/expression/Expression.java: -------------------------------------------------------------------------------- 1 | package com.design.pattern.interpreter.expression; 2 | 3 | import java.util.Map; 4 | 5 | import com.design.pattern.interpreter.InterpreterException; 6 | 7 | public interface Expression { 8 | public double interpret(Map context) throws InterpreterException; 9 | } 10 | -------------------------------------------------------------------------------- /src/com/design/pattern/singleton/ATM.java: -------------------------------------------------------------------------------- 1 | package com.design.pattern.singleton; 2 | 3 | public class ATM { 4 | public void deposit(int depositMoney) { 5 | Account.getInstance().deposit(depositMoney); 6 | } 7 | 8 | public void withdraw(int withdrawMoney) { 9 | Account.getInstance().withdraw(withdrawMoney); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /src/com/design/pattern/State/TVContext.java: -------------------------------------------------------------------------------- 1 | package com.design.pattern.State; 2 | 3 | /** 4 | * Created by karenlin on 2015/4/14. 5 | */ 6 | public class TVContext { 7 | private State state; 8 | 9 | public void setState(State state) { 10 | this.state = state; 11 | } 12 | 13 | public void doAction() { 14 | this.state.doAction(); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /src/com/design/pattern/adapter/WildTurkey.java: -------------------------------------------------------------------------------- 1 | 2 | package com.design.pattern.adapter; 3 | 4 | public class WildTurkey implements Turkey { 5 | 6 | public void gobble() { 7 | System.out.println("Gobble gobble"); 8 | } 9 | 10 | public void fly() { 11 | System.out.println("I'm flying a short distance"); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/com/design/pattern/factorymethod/PdfFactory.java: -------------------------------------------------------------------------------- 1 | package com.design.pattern.factorymethod; 2 | 3 | public class PdfFactory extends DocumentFactory { 4 | 5 | @Override 6 | public Document create() { 7 | Document pdf = new PdfDocument(); 8 | System.out.println("Create the PdfDocument"); 9 | return pdf; 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /src/com/design/pattern/factorymethod/TxtFactory.java: -------------------------------------------------------------------------------- 1 | package com.design.pattern.factorymethod; 2 | 3 | public class TxtFactory extends DocumentFactory { 4 | 5 | @Override 6 | public Document create() { 7 | Document txt = new TxtDocument(); 8 | System.out.println("Create the TxtDocument"); 9 | return txt; 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /src/com/design/pattern/facade/FacadeClient.java: -------------------------------------------------------------------------------- 1 | package com.design.pattern.facade; 2 | 3 | public class FacadeClient { 4 | 5 | public static void main(String[] args) { 6 | ShapeMaker shapeMaker = new ShapeMaker(); 7 | 8 | shapeMaker.drawCircle(); 9 | shapeMaker.drawRectangle(); 10 | shapeMaker.drawTriangle(); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/com/design/pattern/factorymethod/FactoryClient.java: -------------------------------------------------------------------------------- 1 | package com.design.pattern.factorymethod; 2 | 3 | public class FactoryClient { 4 | public static void main(String args[]) { 5 | DocumentFactory documentFactory = new TxtFactory(); 6 | Document document = documentFactory.create(); 7 | 8 | document.open(); 9 | document.close(); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /src/com/design/pattern/composite/Employee.java: -------------------------------------------------------------------------------- 1 | package com.design.pattern.composite; 2 | 3 | public interface Employee { 4 | 5 | public void add(Employee employee); 6 | 7 | public void remove(Employee employee); 8 | 9 | public Employee getChild(int i); 10 | 11 | public String getName(); 12 | 13 | public String getTitle(); 14 | 15 | public void print(); 16 | } 17 | -------------------------------------------------------------------------------- /src/com/design/pattern/factorymethod/PdfDocument.java: -------------------------------------------------------------------------------- 1 | package com.design.pattern.factorymethod; 2 | 3 | public class PdfDocument implements Document { 4 | 5 | @Override 6 | public void open() { 7 | System.out.println("Open the PdfDocument"); 8 | } 9 | 10 | @Override 11 | public void close() { 12 | System.out.println("Close the pdfDocument"); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/com/design/pattern/factorymethod/TxtDocument.java: -------------------------------------------------------------------------------- 1 | package com.design.pattern.factorymethod; 2 | 3 | public class TxtDocument implements Document { 4 | 5 | @Override 6 | public void open() { 7 | System.out.println("Open the TxtDocument"); 8 | } 9 | 10 | @Override 11 | public void close() { 12 | System.out.println("Close the TxtDocument"); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/com/design/pattern/templatemethod/Tea.java: -------------------------------------------------------------------------------- 1 | 2 | package com.design.pattern.templatemethod; 3 | 4 | public class Tea extends CaffeineBeverage { 5 | 6 | @Override 7 | protected void brew() { 8 | System.out.println("Steeping the tea"); 9 | } 10 | 11 | @Override 12 | protected void addCondiments() { 13 | System.out.println("Adding Lemon"); 14 | } 15 | 16 | } 17 | -------------------------------------------------------------------------------- /src/com/design/pattern/command/command/WizardCommand.java: -------------------------------------------------------------------------------- 1 | package com.design.pattern.command.command; 2 | 3 | import com.design.pattern.command.army.Wizard; 4 | 5 | public class WizardCommand implements Command { 6 | 7 | private Wizard wizard; 8 | 9 | public WizardCommand(Wizard wizard) { 10 | this.wizard = wizard; 11 | } 12 | 13 | @Override 14 | public void attack() { 15 | wizard.spell(); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/com/design/pattern/decorator/Beef.java: -------------------------------------------------------------------------------- 1 | package com.design.pattern.decorator; 2 | 3 | public class Beef extends CondimentDecorator { 4 | 5 | public Beef(Burger burger) { 6 | super(burger); 7 | } 8 | 9 | @Override 10 | public String getDescription() { 11 | return burger.getDescription() + ", Beef"; 12 | } 13 | 14 | @Override 15 | public float cost() { 16 | return burger.cost() + 1.6f; 17 | } 18 | 19 | } 20 | -------------------------------------------------------------------------------- /src/com/design/pattern/visitor/Monitor.java: -------------------------------------------------------------------------------- 1 | package com.design.pattern.visitor; 2 | 3 | public class Monitor implements ComputerPart { 4 | 5 | @Override 6 | public void accept(ComputerPartVisitor computerPartVisitor) { 7 | computerPartVisitor.visit(this); 8 | } 9 | 10 | @Override 11 | public void accept(UserInputVisitor userInputVisitor) { 12 | userInputVisitor.visit(this); 13 | } 14 | } -------------------------------------------------------------------------------- /src/com/design/pattern/visitor/Mouse.java: -------------------------------------------------------------------------------- 1 | package com.design.pattern.visitor; 2 | 3 | public class Mouse implements ComputerPart { 4 | 5 | @Override 6 | public void accept(ComputerPartVisitor computerPartVisitor) { 7 | computerPartVisitor.visit(this); 8 | } 9 | 10 | @Override 11 | public void accept(UserInputVisitor userInputVisitor) { 12 | userInputVisitor.visit(this); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/com/design/pattern/command/command/WarriorCommand.java: -------------------------------------------------------------------------------- 1 | package com.design.pattern.command.command; 2 | 3 | import com.design.pattern.command.army.Warrior; 4 | 5 | public class WarriorCommand implements Command { 6 | 7 | private Warrior warrior; 8 | 9 | public WarriorCommand(Warrior warrior) { 10 | this.warrior = warrior; 11 | } 12 | 13 | @Override 14 | public void attack() { 15 | warrior.attack(); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/com/design/pattern/decorator/Bacon.java: -------------------------------------------------------------------------------- 1 | package com.design.pattern.decorator; 2 | 3 | public class Bacon extends CondimentDecorator { 4 | 5 | public Bacon(Burger burger) { 6 | super(burger); 7 | } 8 | 9 | @Override 10 | public String getDescription() { 11 | return burger.getDescription() + ", Bacon"; 12 | } 13 | 14 | @Override 15 | public float cost() { 16 | return burger.cost() + 1.5f; 17 | } 18 | 19 | } 20 | -------------------------------------------------------------------------------- /src/com/design/pattern/State/TVRemote.java: -------------------------------------------------------------------------------- 1 | package com.design.pattern.State; 2 | 3 | /** 4 | * Created by karenlin on 2015/4/14. 5 | */ 6 | public class TVRemote { 7 | public static void main(String[] args) { 8 | 9 | TVContext context = new TVContext(); 10 | 11 | context.setState(new TVStartState()); 12 | context.doAction(); 13 | 14 | context.setState(new TVStopState()); 15 | context.doAction(); 16 | 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/com/design/pattern/builder/PizzaBuilder.java: -------------------------------------------------------------------------------- 1 | package com.design.pattern.builder; 2 | 3 | public abstract class PizzaBuilder { 4 | protected Pizza pizza; 5 | 6 | public PizzaBuilder() { 7 | pizza = new Pizza(); 8 | } 9 | 10 | public Pizza getPizza() { 11 | return pizza; 12 | } 13 | 14 | public abstract void buildDough(); 15 | public abstract void buildSauce(); 16 | public abstract void buildTopping(); 17 | } 18 | 19 | -------------------------------------------------------------------------------- /src/com/design/pattern/decorator/Cheese.java: -------------------------------------------------------------------------------- 1 | package com.design.pattern.decorator; 2 | 3 | public class Cheese extends CondimentDecorator { 4 | 5 | public Cheese(Burger burger) { 6 | super(burger); 7 | } 8 | 9 | @Override 10 | public String getDescription() { 11 | return burger.getDescription() + ", Cheese"; 12 | } 13 | 14 | @Override 15 | public float cost() { 16 | return burger.cost() + 0.9f; 17 | } 18 | 19 | } 20 | -------------------------------------------------------------------------------- /src/com/design/pattern/decorator/Chicken.java: -------------------------------------------------------------------------------- 1 | package com.design.pattern.decorator; 2 | 3 | public class Chicken extends CondimentDecorator { 4 | 5 | public Chicken(Burger burger) { 6 | super(burger); 7 | } 8 | 9 | @Override 10 | public String getDescription() { 11 | return burger.getDescription() + ", Chicken"; 12 | } 13 | 14 | @Override 15 | public float cost() { 16 | return burger.cost() + 1.9f; 17 | } 18 | 19 | } 20 | -------------------------------------------------------------------------------- /src/com/design/pattern/decorator/Lettuce.java: -------------------------------------------------------------------------------- 1 | package com.design.pattern.decorator; 2 | 3 | public class Lettuce extends CondimentDecorator { 4 | 5 | public Lettuce(Burger burger) { 6 | super(burger); 7 | } 8 | 9 | @Override 10 | public String getDescription() { 11 | return burger.getDescription() + ", Lettuce"; 12 | } 13 | 14 | @Override 15 | public float cost() { 16 | return burger.cost() + 0.7f; 17 | } 18 | 19 | } 20 | -------------------------------------------------------------------------------- /src/com/design/pattern/templatemethod/Coffee.java: -------------------------------------------------------------------------------- 1 | 2 | package com.design.pattern.templatemethod; 3 | 4 | public class Coffee extends CaffeineBeverage { 5 | 6 | @Override 7 | protected void brew() { 8 | System.out.println("Dripping Coffee through filter"); 9 | } 10 | 11 | @Override 12 | protected void addCondiments() { 13 | System.out.println("Adding Sugar and Milk"); 14 | } 15 | 16 | } 17 | -------------------------------------------------------------------------------- /src/com/design/pattern/visitor/Keyboard.java: -------------------------------------------------------------------------------- 1 | package com.design.pattern.visitor; 2 | 3 | public class Keyboard implements ComputerPart { 4 | 5 | @Override 6 | public void accept(ComputerPartVisitor computerPartVisitor) { 7 | computerPartVisitor.visit(this); 8 | } 9 | 10 | @Override 11 | public void accept(UserInputVisitor userInputVisitor) { 12 | userInputVisitor.visit(this); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/com/design/pattern/bridge/drawing/V2Drawing.java: -------------------------------------------------------------------------------- 1 | package com.design.pattern.bridge.drawing; 2 | 3 | public class V2Drawing extends Drawing { 4 | 5 | @Override 6 | public void drawLine(double x1, double y1, double x2, double y2) { 7 | DP2.draw_line(x1, x2, y1, y2); 8 | } 9 | 10 | @Override 11 | public void drawCircle(double x, double y, double r) { 12 | DP2.draw_circle(x, y, r); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/com/design/pattern/bridge/drawing/V1Drawing.java: -------------------------------------------------------------------------------- 1 | package com.design.pattern.bridge.drawing; 2 | 3 | public class V1Drawing extends Drawing { 4 | 5 | @Override 6 | public void drawLine(double x1, double y1, double x2, double y2) { 7 | DP1.draw_a_line(x1, y1, x2, y2); 8 | } 9 | 10 | @Override 11 | public void drawCircle(double x, double y, double r) { 12 | DP1.draw_a_circle(x, y, r); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/com/design/pattern/proxy/ProxyImage.java: -------------------------------------------------------------------------------- 1 | package com.design.pattern.proxy; 2 | 3 | class ProxyImage implements Image { 4 | private String filename; 5 | private Image image; 6 | 7 | public ProxyImage(String filename) { 8 | this.filename = filename; 9 | } 10 | public void displayImage() { 11 | if (image == null) { 12 | image = new RealImage(filename); 13 | } 14 | image.displayImage(); 15 | } 16 | } -------------------------------------------------------------------------------- /src/com/design/pattern/command/command/GoblinCommand.java: -------------------------------------------------------------------------------- 1 | package com.design.pattern.command.command; 2 | 3 | import com.design.pattern.command.army.Goblin; 4 | 5 | public class GoblinCommand implements Command { 6 | 7 | private Goblin goblin; 8 | 9 | public GoblinCommand(Goblin goblin) { 10 | this.goblin = goblin; 11 | } 12 | 13 | @Override 14 | public void attack() { 15 | goblin.attack(); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/com/design/pattern/chain/OrcKing.java: -------------------------------------------------------------------------------- 1 | package com.design.pattern.chain; 2 | 3 | public class OrcKing { 4 | 5 | private RequestHandler chain; 6 | 7 | public OrcKing() { 8 | buildChain(); 9 | } 10 | 11 | public void makeRequest(Request request) { 12 | chain.handleRequest(request); 13 | } 14 | 15 | private void buildChain() { 16 | chain = new OrcCommander(new OrcOfficer(new OrcSoldier(null))); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/com/design/pattern/mediator/MediatorPatternDemo.java: -------------------------------------------------------------------------------- 1 | package com.design.pattern.mediator; 2 | 3 | public class MediatorPatternDemo { 4 | 5 | public static void main(String[] args) { 6 | ChatRoom chatRoom = new ChatRoom(); 7 | User robert = new User("Robert", chatRoom); 8 | User john = new User("John", chatRoom); 9 | 10 | robert.sendMessage("Hi! John!"); 11 | john.sendMessage("Hello! Robert!"); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/com/design/pattern/strategy/duck/ModelDuck.java: -------------------------------------------------------------------------------- 1 | 2 | package com.design.pattern.strategy.duck; 3 | 4 | public class ModelDuck extends Duck { 5 | 6 | public ModelDuck() { 7 | flyBehavior = new FlyNoWay(); 8 | quackBehavior = new MuteQuack(); 9 | swimBehavior = new SwimWithTurbineEngine(); 10 | } 11 | 12 | @Override 13 | public void display() { 14 | System.out.println("I'm a model duck"); 15 | } 16 | 17 | } 18 | -------------------------------------------------------------------------------- /src/com/design/pattern/command/command/KnightCommand.java: -------------------------------------------------------------------------------- 1 | package com.design.pattern.command.command; 2 | 3 | import com.design.pattern.command.army.Knight; 4 | 5 | public class KnightCommand implements Command{ 6 | 7 | private Knight knight; 8 | 9 | public KnightCommand(Knight knight) { 10 | this.knight = knight; 11 | } 12 | 13 | @Override 14 | public void attack() { 15 | knight.rideHorseAndAttack(); 16 | } 17 | 18 | } 19 | -------------------------------------------------------------------------------- /src/com/design/pattern/strategy/duck/MallardDuck.java: -------------------------------------------------------------------------------- 1 | 2 | package com.design.pattern.strategy.duck; 3 | 4 | public class MallardDuck extends Duck { 5 | 6 | public MallardDuck(){ 7 | flyBehavior = new FlyWithWings(); 8 | quackBehavior = new Quack(); 9 | swimBehavior = new SwimWithWebbedFeet(); 10 | } 11 | 12 | @Override 13 | public void display() { 14 | System.out.println("I'm a real Mallard duck"); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /src/com/design/pattern/strategy/duck/RedHeadDuck.java: -------------------------------------------------------------------------------- 1 | 2 | package com.design.pattern.strategy.duck; 3 | 4 | public class RedHeadDuck extends Duck { 5 | 6 | public RedHeadDuck() { 7 | flyBehavior = new FlyWithWings(); 8 | quackBehavior = new Quack(); 9 | swimBehavior = new SwimWithWebbedFeet(); 10 | } 11 | 12 | @Override 13 | public void display() { 14 | System.out.println("I'm a real Red Headed duck"); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /src/com/design/pattern/strategy/duck/RubberDuck.java: -------------------------------------------------------------------------------- 1 | 2 | package com.design.pattern.strategy.duck; 3 | 4 | import java.lang.*; 5 | 6 | public class RubberDuck extends Duck { 7 | 8 | public RubberDuck() { 9 | flyBehavior = new FlyWithWings(); 10 | quackBehavior = new Squeak(); 11 | swimBehavior = new Float(); 12 | } 13 | 14 | @Override 15 | public void display() { 16 | System.out.println("I'm a rubber duckie"); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/com/design/pattern/command/command/SonGokuCommand.java: -------------------------------------------------------------------------------- 1 | package com.design.pattern.command.command; 2 | 3 | import com.design.pattern.command.army.SonGoku; 4 | 5 | public class SonGokuCommand implements Command{ 6 | private SonGoku sonGoku; 7 | 8 | public SonGokuCommand(SonGoku sonGoku) { 9 | this.sonGoku = sonGoku; 10 | } 11 | 12 | @Override 13 | public void attack() { 14 | sonGoku.superSaiyan(); 15 | sonGoku.kamehameha(); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/com/design/pattern/templatemethod/StarBuzzTestDrive.java: -------------------------------------------------------------------------------- 1 | package com.design.pattern.templatemethod; 2 | 3 | public class StarBuzzTestDrive { 4 | public static void main(String[] args) { 5 | 6 | Tea tea = new Tea(); 7 | Coffee coffee = new Coffee(); 8 | 9 | System.out.println("\nMaking tea..."); 10 | tea.prepareRecipe(); 11 | 12 | System.out.println("\nMaking coffee..."); 13 | coffee.setCustomerWantsCondiments(false); 14 | coffee.prepareRecipe(); 15 | 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/com/design/pattern/builder/Waiter.java: -------------------------------------------------------------------------------- 1 | package com.design.pattern.builder; 2 | 3 | public class Waiter { 4 | private PizzaBuilder pizzaBuilder; 5 | 6 | public void setPizzaBuilder (PizzaBuilder pizzaBuilder) { 7 | this.pizzaBuilder = pizzaBuilder; 8 | } 9 | 10 | public Pizza getPizza() { 11 | return pizzaBuilder.getPizza(); 12 | } 13 | 14 | public void buildPizza() { 15 | pizzaBuilder.buildDough(); 16 | pizzaBuilder.buildSauce(); 17 | pizzaBuilder.buildTopping(); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/com/design/pattern/memento/Application.java: -------------------------------------------------------------------------------- 1 | package com.design.pattern.memento; 2 | 3 | // Originator 4 | public class Application { 5 | private String state = "default setting"; 6 | 7 | public Backup backup() { 8 | return new Backup(state); 9 | } 10 | 11 | public void recover(Backup backup) { 12 | this.state = backup.getState(); 13 | } 14 | 15 | public void setState(String state) { 16 | this.state = state; 17 | } 18 | 19 | public String getState() { 20 | return state; 21 | } 22 | } -------------------------------------------------------------------------------- /src/com/design/pattern/iterator/IteratorPatternDemo.java: -------------------------------------------------------------------------------- 1 | package com.design.pattern.iterator; 2 | 3 | public class IteratorPatternDemo { 4 | 5 | public static void main(String[] args) { 6 | NameRepository namesRepository = new NameRepository(); 7 | 8 | Iterator iterator = namesRepository.getIterator(); 9 | 10 | while (iterator.hasNext()) { 11 | String name = (String)iterator.next(); 12 | System.out.println("Name : " + name); 13 | } 14 | } 15 | } -------------------------------------------------------------------------------- /src/com/design/pattern/proxy/RealImage.java: -------------------------------------------------------------------------------- 1 | package com.design.pattern.proxy; 2 | 3 | class RealImage implements Image { 4 | private String filename; 5 | public RealImage(String filename) { 6 | this.filename = filename; 7 | loadImageFromDisk(); 8 | } 9 | 10 | private void loadImageFromDisk() { 11 | System.out.println("Loading " + filename); 12 | } 13 | 14 | public void displayImage() { 15 | System.out.println("Displaying " + filename); 16 | } 17 | } -------------------------------------------------------------------------------- /src/com/design/pattern/visitor/VisitorPatternDemo.java: -------------------------------------------------------------------------------- 1 | package com.design.pattern.visitor; 2 | 3 | public class VisitorPatternDemo { 4 | public static void main(String[] args) { 5 | 6 | ComputerPart computer = new Computer(); 7 | 8 | System.out.println("== Show all computer part: =="); 9 | computer.accept(new ComputerPartDisplayVisitor()); 10 | 11 | System.out.println("\n== Show user input part: =="); 12 | computer.accept(new UserInputVisitor()); 13 | } 14 | } -------------------------------------------------------------------------------- /src/com/design/pattern/command/command/MircoCommand.java: -------------------------------------------------------------------------------- 1 | package com.design.pattern.command.command; 2 | 3 | import java.util.List; 4 | 5 | public class MircoCommand implements Command{ 6 | private List commands; 7 | 8 | public MircoCommand(List commands) { 9 | this.commands = commands; 10 | } 11 | 12 | @Override 13 | public void attack() { 14 | for (int i = 0; i < commands.size(); i++) { 15 | commands.get(i).attack(); 16 | } 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/com/design/pattern/singleton/Government.java: -------------------------------------------------------------------------------- 1 | package com.design.pattern.singleton; 2 | 3 | public class Government { 4 | private int officer; 5 | 6 | public static Government getInstance() { 7 | // TODO refactor with singleton pattern and add thread safe mechanism 8 | return new Government(); 9 | } 10 | 11 | public void setOfficer(int officer) { 12 | this.officer = officer; 13 | } 14 | 15 | public int getOfficer() { 16 | return officer; 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/com/design/pattern/memento/Backup.java: -------------------------------------------------------------------------------- 1 | package com.design.pattern.memento; 2 | 3 | import java.util.Date; 4 | 5 | // Memento 6 | public class Backup { 7 | private String state; 8 | private Date date; 9 | 10 | public Backup(String state) { 11 | this.state = state; 12 | date = new Date(); 13 | } 14 | 15 | public String getState() { 16 | return state; 17 | } 18 | 19 | public void setState(String state) { 20 | this.state = state; 21 | } 22 | 23 | public Date getDate() { 24 | return date; 25 | } 26 | } -------------------------------------------------------------------------------- /src/com/design/pattern/bridge/BridgeClient.java: -------------------------------------------------------------------------------- 1 | package com.design.pattern.bridge; 2 | 3 | import com.design.pattern.bridge.shape.Shape; 4 | 5 | import java.util.List; 6 | 7 | public class BridgeClient { 8 | 9 | public static void main(String[] args) { 10 | List myShapes; 11 | Factory myFactory = new Factory(); 12 | 13 | myFactory.create(); 14 | myShapes = myFactory.getShapes(); 15 | for (Shape shape : myShapes) { 16 | shape.draw(); 17 | } 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/com/design/pattern/command/command/BaseballPlayerCommand.java: -------------------------------------------------------------------------------- 1 | package com.design.pattern.command.command; 2 | 3 | import com.design.pattern.command.army.BaseballPlayer; 4 | 5 | public class BaseballPlayerCommand implements Command{ 6 | 7 | private BaseballPlayer baseballPlayer; 8 | 9 | public BaseballPlayerCommand(BaseballPlayer baseballPlayer){ 10 | this.baseballPlayer = baseballPlayer; 11 | } 12 | 13 | @Override 14 | public void attack() { 15 | baseballPlayer.swingBat(); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/com/design/pattern/mediator/User.java: -------------------------------------------------------------------------------- 1 | package com.design.pattern.mediator; 2 | 3 | public class User { 4 | public String name; 5 | public ChatRoom chatRoom; 6 | public String getName() { 7 | return name; 8 | } 9 | 10 | public User(String name, ChatRoom chatRoom){ 11 | this.name = name; 12 | this.chatRoom = chatRoom; 13 | chatRoom.registerUser(this); 14 | } 15 | 16 | public void sendMessage(String message){ 17 | chatRoom.showMessage(this, message); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/com/design/pattern/adapter/classadapter/TurkeyClassAdapter.java: -------------------------------------------------------------------------------- 1 | package com.design.pattern.adapter.classadapter; 2 | 3 | import com.design.pattern.adapter.Duck; 4 | import com.design.pattern.adapter.WildTurkey; 5 | 6 | public class TurkeyClassAdapter extends WildTurkey implements Duck { 7 | 8 | @Override 9 | public void quack() { 10 | super.gobble(); 11 | } 12 | 13 | @Override 14 | public void fly() { 15 | for (int i = 0; i < 5; i++) { 16 | super.fly(); 17 | } 18 | } 19 | 20 | } 21 | -------------------------------------------------------------------------------- /src/com/design/pattern/interpreter/expression/NumberExpression.java: -------------------------------------------------------------------------------- 1 | package com.design.pattern.interpreter.expression; 2 | 3 | import java.util.Map; 4 | 5 | public class NumberExpression implements Expression { 6 | 7 | private final double value; 8 | 9 | public NumberExpression(double value) { 10 | this.value = value; 11 | } 12 | 13 | @Override 14 | public double interpret(Map context) { 15 | return value; 16 | } 17 | 18 | @Override 19 | public String toString() { 20 | return String.valueOf(value); 21 | } 22 | 23 | } 24 | -------------------------------------------------------------------------------- /src/com/design/pattern/visitor/UserInputVisitor.java: -------------------------------------------------------------------------------- 1 | package com.design.pattern.visitor; 2 | 3 | public class UserInputVisitor implements ComputerPartVisitor { 4 | 5 | @Override 6 | public void visit(Computer computer) {} 7 | 8 | @Override 9 | public void visit(Mouse mouse) { 10 | System.out.println("Displaying Mouse."); 11 | } 12 | 13 | @Override 14 | public void visit(Keyboard keyboard) { 15 | System.out.println("Displaying Keyboard."); 16 | } 17 | 18 | @Override 19 | public void visit(Monitor monitor) {} 20 | } -------------------------------------------------------------------------------- /src/com/design/pattern/bridge/shape/Circle.java: -------------------------------------------------------------------------------- 1 | package com.design.pattern.bridge.shape; 2 | 3 | import com.design.pattern.bridge.drawing.Drawing; 4 | 5 | public class Circle extends Shape { 6 | 7 | private double x; 8 | private double y; 9 | private double r; 10 | 11 | public Circle(Drawing drawing, double x, double y, double r) { 12 | super(drawing); 13 | this.x = x; 14 | this.y = y; 15 | this.r = r; 16 | } 17 | 18 | @Override 19 | public void draw() { 20 | drawCircle(x, y, r); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/com/design/pattern/observer/GuavaDaliyNewsDisplay.java: -------------------------------------------------------------------------------- 1 | 2 | package com.design.pattern.observer; 3 | 4 | public class GuavaDaliyNewsDisplay implements Observer { 5 | private String entertainmentNews; 6 | 7 | @Override 8 | public void update(String headlineNews, String sportsNews, String financeNews, String entertainmentNews) { 9 | this.entertainmentNews = entertainmentNews; 10 | display(); 11 | } 12 | 13 | public void display() { 14 | System.out.println("GuavaDaliy entertainmentNews: " + entertainmentNews); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /src/com/design/pattern/memento/Recovery.java: -------------------------------------------------------------------------------- 1 | package com.design.pattern.memento; 2 | 3 | import java.util.ArrayList; 4 | import java.util.Date; 5 | import java.util.List; 6 | 7 | // Caretaker 8 | public class Recovery { 9 | private List backups = new ArrayList(); 10 | 11 | public void add(Backup backup) { 12 | backups.add(backup); 13 | } 14 | 15 | public Backup retrieve(Date date) { 16 | for (Backup backup : backups) { 17 | if (backup.getDate().equals(date)) { 18 | backups.remove(backup); 19 | return backup; 20 | } 21 | } 22 | return null; 23 | } 24 | } -------------------------------------------------------------------------------- /src/com/design/pattern/facade/ShapeMaker.java: -------------------------------------------------------------------------------- 1 | package com.design.pattern.facade; 2 | 3 | public class ShapeMaker { 4 | private Shape circle; 5 | private Shape rectangle; 6 | private Shape triangle; 7 | 8 | public ShapeMaker() { 9 | circle = new Circle(); 10 | rectangle = new Rectangle(); 11 | triangle = new Triangle(); 12 | } 13 | 14 | public void drawCircle(){ 15 | circle.draw(); 16 | } 17 | public void drawRectangle(){ 18 | rectangle.draw(); 19 | } 20 | public void drawTriangle(){ 21 | triangle.draw(); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/com/design/pattern/bridge/shape/Shape.java: -------------------------------------------------------------------------------- 1 | package com.design.pattern.bridge.shape; 2 | 3 | import com.design.pattern.bridge.drawing.Drawing; 4 | 5 | public abstract class Shape { 6 | protected Drawing myDrawing; 7 | public abstract void draw(); 8 | 9 | public Shape(Drawing drawing) { 10 | myDrawing = drawing; 11 | } 12 | 13 | protected void drawLine(double x1, double y1, double x2, double y2) { 14 | myDrawing.drawLine(x1, y1, x2, y2); 15 | } 16 | 17 | protected void drawCircle(double x, double y, double r) { 18 | myDrawing.drawCircle(x, y, r); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/com/design/pattern/chain/OrcOfficer.java: -------------------------------------------------------------------------------- 1 | package com.design.pattern.chain; 2 | 3 | public class OrcOfficer extends RequestHandler { 4 | 5 | public OrcOfficer(RequestHandler next) { 6 | super(next); 7 | } 8 | 9 | @Override 10 | public void handleRequest(Request request) { 11 | if (request.getRequestType() == RequestType.COLLECT_TAX) { 12 | printHandling(request); 13 | } else { 14 | super.handleRequest(request); 15 | } 16 | } 17 | 18 | @Override 19 | public String toString() { 20 | return getClass().getSimpleName(); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/com/design/pattern/chain/OrcSoldier.java: -------------------------------------------------------------------------------- 1 | package com.design.pattern.chain; 2 | 3 | public class OrcSoldier extends RequestHandler { 4 | 5 | public OrcSoldier(RequestHandler next) { 6 | super(next); 7 | } 8 | 9 | @Override 10 | public void handleRequest(Request request) { 11 | if (request.getRequestType() == RequestType.DEFEND_CASTLE) { 12 | printHandling(request); 13 | } else { 14 | super.handleRequest(request); 15 | } 16 | } 17 | 18 | @Override 19 | public String toString() { 20 | return getClass().getSimpleName(); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/com/design/pattern/chain/OrcCommander.java: -------------------------------------------------------------------------------- 1 | package com.design.pattern.chain; 2 | 3 | public class OrcCommander extends RequestHandler { 4 | 5 | public OrcCommander(RequestHandler next) { 6 | super(next); 7 | } 8 | 9 | @Override 10 | public void handleRequest(Request request) { 11 | if (request.getRequestType() == RequestType.TRAIN_SOLDIER) { 12 | printHandling(request); 13 | } else { 14 | super.handleRequest(request); 15 | } 16 | } 17 | 18 | @Override 19 | public String toString() { 20 | return getClass().getSimpleName(); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/com/design/pattern/bridge/shape/Rectangle.java: -------------------------------------------------------------------------------- 1 | package com.design.pattern.bridge.shape; 2 | 3 | import com.design.pattern.bridge.drawing.Drawing; 4 | 5 | public class Rectangle extends Shape { 6 | 7 | private double x1; 8 | private double y1; 9 | private double x2; 10 | private double y2; 11 | 12 | public Rectangle(Drawing drawing, double x1, double y1, double x2, double y2) { 13 | super(drawing); 14 | this.x1 = x1; 15 | this.y1 = y1; 16 | this.x2 = x2; 17 | this.y2 = y2; 18 | } 19 | 20 | @Override 21 | public void draw() { 22 | drawLine(x1, y1, x2, y2); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/com/design/pattern/adapter/objectadapter/TurkeyObjectAdapter.java: -------------------------------------------------------------------------------- 1 | package com.design.pattern.adapter.objectadapter; 2 | 3 | import com.design.pattern.adapter.Duck; 4 | import com.design.pattern.adapter.Turkey; 5 | 6 | public class TurkeyObjectAdapter implements Duck { 7 | 8 | private Turkey turkey; 9 | 10 | public TurkeyObjectAdapter(Turkey turkey) { 11 | this.turkey = turkey; 12 | } 13 | 14 | @Override 15 | public void quack() { 16 | turkey.gobble(); 17 | } 18 | 19 | @Override 20 | public void fly() { 21 | for (int i = 0; i < 5; i++) { 22 | turkey.fly(); 23 | } 24 | } 25 | 26 | } 27 | -------------------------------------------------------------------------------- /src/com/design/pattern/observer/YahuNewsDisplay.java: -------------------------------------------------------------------------------- 1 | 2 | package com.design.pattern.observer; 3 | 4 | public class YahuNewsDisplay implements Observer { 5 | private String headlineNews; 6 | private String sportsNews; 7 | 8 | @Override 9 | public void update(String headlineNews, String sportsNews, String financeNews, String entertainmentNews) { 10 | this.headlineNews = headlineNews; 11 | this.sportsNews = sportsNews; 12 | display(); 13 | } 14 | 15 | public void display() { 16 | System.out.println("Yahu headlineNews: " + headlineNews); 17 | System.out.println("Yahu sportsNews: " + sportsNews); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/com/design/pattern/strategy/employee/WorkSpace.java: -------------------------------------------------------------------------------- 1 | package com.design.pattern.strategy.employee; 2 | 3 | public class WorkSpace { 4 | 5 | public static void main(String[] args) { 6 | 7 | Employee salesmanEmployee = new Employee(new Salesman()); 8 | Employee engineerEmployee = new Employee(new Engineer()); 9 | Employee merchantEmployee = new Employee(new Merchant()); 10 | 11 | System.out.println("salesmanEmployee:" + salesmanEmployee.payAmount()); 12 | System.out.println("engineerEmployee:" + engineerEmployee.payAmount()); 13 | System.out.println("merchantEmployee:" + merchantEmployee.payAmount()); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/com/design/pattern/visitor/ComputerPartDisplayVisitor.java: -------------------------------------------------------------------------------- 1 | package com.design.pattern.visitor; 2 | 3 | public class ComputerPartDisplayVisitor implements ComputerPartVisitor { 4 | 5 | @Override 6 | public void visit(Computer computer) { 7 | System.out.println("Displaying Computer."); 8 | } 9 | 10 | @Override 11 | public void visit(Mouse mouse) { 12 | System.out.println("Displaying Mouse."); 13 | } 14 | 15 | @Override 16 | public void visit(Keyboard keyboard) { 17 | System.out.println("Displaying Keyboard."); 18 | } 19 | 20 | @Override 21 | public void visit(Monitor monitor) { 22 | System.out.println("Displaying Monitor."); 23 | } 24 | } -------------------------------------------------------------------------------- /src/com/design/pattern/mediator/ChatRoom.java: -------------------------------------------------------------------------------- 1 | package com.design.pattern.mediator; 2 | 3 | import java.util.ArrayList; 4 | import java.util.Date; 5 | 6 | public class ChatRoom { 7 | public ArrayList users = new ArrayList(); 8 | 9 | public void registerUser(User user) { 10 | users.add(user); 11 | } 12 | 13 | public void showMessage(User user, String message){ 14 | System.out.println(new Date().toString() + " [" + user.getName() + "] : " + message); 15 | for (User targetUser: users) { 16 | if (targetUser != user) { 17 | System.out.println(" [" + targetUser.getName() + "] be notified!"); 18 | } 19 | } 20 | } 21 | 22 | } 23 | -------------------------------------------------------------------------------- /src/com/design/pattern/memento/Main.java: -------------------------------------------------------------------------------- 1 | package com.design.pattern.memento; 2 | 3 | import java.util.Date; 4 | 5 | public class Main { 6 | 7 | public static void main(String[] args) { 8 | Application application = new Application(); 9 | Recovery recovery = new Recovery(); 10 | 11 | System.out.println(application.getState()); 12 | 13 | Backup backup = application.backup(); // 建立備忘 14 | recovery.add(backup); // 加入備忘錄 15 | 16 | application.setState("customer setting"); 17 | System.out.println(application.getState()); 18 | 19 | Date date = backup.getDate(); // 假設 date 是使用者自行設定所要取得的還原時間! 20 | application.recover(recovery.retrieve(date)); // 取得備忘來還原 21 | System.out.println(application.getState()); 22 | } 23 | 24 | } -------------------------------------------------------------------------------- /src/com/design/pattern/chain/RequestHandler.java: -------------------------------------------------------------------------------- 1 | package com.design.pattern.chain; 2 | 3 | public abstract class RequestHandler { 4 | 5 | public RequestHandler next; 6 | 7 | public RequestHandler(RequestHandler next) { 8 | this.next = next; 9 | } 10 | 11 | public void handleRequest(Request request) { 12 | if (next != null) { 13 | next.handleRequest(request); 14 | }else { 15 | System.out.println("Oh no,no one can handle it"); 16 | } 17 | } 18 | 19 | protected void printHandling(Request request) { 20 | System.out.println(this + " handling request \"" + request + "\""); 21 | } 22 | 23 | @Override 24 | public abstract String toString(); 25 | 26 | } 27 | -------------------------------------------------------------------------------- /src/com/design/pattern/composite/CompositeClient.java: -------------------------------------------------------------------------------- 1 | package com.design.pattern.composite; 2 | 3 | public class CompositeClient { 4 | public static StringBuffer g_indent = new StringBuffer(); 5 | 6 | public static void main(String[] args) { 7 | Employee john = new Developer("John", "Developer"); 8 | Employee mary = new Developer("Mary", "Developer"); 9 | Employee pm = new Manager("Bob", "PM"); 10 | pm.add(john); 11 | pm.add(mary); 12 | 13 | Employee jason = new Developer("Michael", "Sales"); 14 | Manager generalManager = new Manager("BigPerson", "CEO"); 15 | generalManager.add(jason); 16 | generalManager.add(pm); 17 | generalManager.print(); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/com/design/pattern/strategy/employee/Employee.java: -------------------------------------------------------------------------------- 1 | package com.design.pattern.strategy.employee; 2 | 3 | public class Employee { 4 | 5 | private EmployeeType employeeType; 6 | 7 | private int monthSalary = 28000; 8 | private int commission = 8000; 9 | private int bonus = 10000; 10 | 11 | public Employee(EmployeeType employeeType) { 12 | this.employeeType = employeeType; 13 | } 14 | 15 | public int payAmount() { 16 | return employeeType.payAmount(this); 17 | } 18 | 19 | public int getMonthSalary() { 20 | return monthSalary; 21 | } 22 | 23 | public int getCommission() { 24 | return commission; 25 | } 26 | 27 | public int getBonus() { 28 | return bonus; 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /src/com/design/pattern/interpreter/expression/VariableExpression.java: -------------------------------------------------------------------------------- 1 | package com.design.pattern.interpreter.expression; 2 | 3 | import java.util.Map; 4 | 5 | import com.design.pattern.interpreter.InterpreterException; 6 | 7 | public class VariableExpression implements Expression { 8 | 9 | private final String name; 10 | 11 | public VariableExpression(String name) { 12 | this.name = name; 13 | } 14 | 15 | @Override 16 | public double interpret(Map context) throws InterpreterException { 17 | if (context.containsKey(name)) { 18 | return context.get(name); 19 | } else { 20 | throw new InterpreterException("Variable not found: " + name); 21 | } 22 | } 23 | 24 | @Override 25 | public String toString() { 26 | return name; 27 | } 28 | 29 | } 30 | -------------------------------------------------------------------------------- /src/com/design/pattern/observer/DnnNewsDisplay.java: -------------------------------------------------------------------------------- 1 | 2 | package com.design.pattern.observer; 3 | 4 | public class DnnNewsDisplay implements Observer { 5 | private String headlineNews; 6 | private String sportsNews; 7 | private String financeNews; 8 | 9 | @Override 10 | public void update(String headlineNews, String sportsNews, String financeNews, String entertainmentNews) { 11 | this.headlineNews = headlineNews; 12 | this.sportsNews = sportsNews; 13 | this.financeNews = financeNews; 14 | display(); 15 | } 16 | 17 | public void display() { 18 | System.out.println("Dnn headlineNews: " + headlineNews); 19 | System.out.println("Dnn sportsNews: " + sportsNews); 20 | System.out.println("Dnn finaceNews: " + financeNews); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/com/design/pattern/singleton/Account.java: -------------------------------------------------------------------------------- 1 | package com.design.pattern.singleton; 2 | 3 | public class Account { 4 | private static Account account; 5 | private int money = 10000; 6 | 7 | private Account() { 8 | 9 | } 10 | 11 | public synchronized static Account getInstance() { 12 | if (account == null) { 13 | account = new Account(); 14 | } 15 | return account; 16 | } 17 | 18 | public void deposit(int depositMoney) { 19 | money += depositMoney; 20 | System.out.println("deposit " + depositMoney + ", Account balance is "+money); 21 | } 22 | 23 | public void withdraw(int withdrawMoney) { 24 | money -= withdrawMoney; 25 | System.out.println("withdraw "+ withdrawMoney + ", Account balance is "+money); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/com/design/pattern/visitor/Computer.java: -------------------------------------------------------------------------------- 1 | package com.design.pattern.visitor; 2 | 3 | public class Computer implements ComputerPart { 4 | 5 | ComputerPart[] parts; 6 | 7 | public Computer(){ 8 | parts = new ComputerPart[] {new Mouse(), new Keyboard(), new Monitor()}; 9 | } 10 | 11 | @Override 12 | public void accept(ComputerPartVisitor computerPartVisitor) { 13 | for (int i = 0; i < parts.length; i++) { 14 | parts[i].accept(computerPartVisitor); 15 | } 16 | computerPartVisitor.visit(this); 17 | } 18 | 19 | @Override 20 | public void accept(UserInputVisitor userInputVisitor) { 21 | for (int i = 0; i < parts.length; i++) { 22 | parts[i].accept(userInputVisitor); 23 | } 24 | userInputVisitor.visit(this); 25 | } 26 | } -------------------------------------------------------------------------------- /src/com/design/pattern/chain/OrcNationMain.java: -------------------------------------------------------------------------------- 1 | package com.design.pattern.chain; 2 | 3 | public class OrcNationMain { 4 | public static void main(String[] args) { 5 | OrcKing orcKing = new OrcKing(); 6 | 7 | Request defendCastleRequest = new Request(RequestType.DEFEND_CASTLE, "defend castle"); 8 | orcKing.makeRequest(defendCastleRequest); 9 | 10 | Request collectTaxRequest = new Request(RequestType.COLLECT_TAX, "collect tax"); 11 | orcKing.makeRequest(collectTaxRequest); 12 | 13 | Request trainSoldierRequest = new Request(RequestType.TRAIN_SOLDIER, "train soldier"); 14 | orcKing.makeRequest(trainSoldierRequest); 15 | 16 | Request buildHouseRequest = new Request(RequestType.BUILD_HOUSE, "build house"); 17 | orcKing.makeRequest(buildHouseRequest); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/com/design/pattern/observer/CccNewsDisplay.java: -------------------------------------------------------------------------------- 1 | 2 | package com.design.pattern.observer; 3 | 4 | public class CccNewsDisplay implements Observer { 5 | private String headlineNews; 6 | private String sportsNews; 7 | private String entertainmentNews; 8 | 9 | @Override 10 | public void update(String headlineNews, String sportsNews, String financeNews, String entertainmentNews) { 11 | this.headlineNews = headlineNews; 12 | this.sportsNews = sportsNews; 13 | this.entertainmentNews = entertainmentNews; 14 | display(); 15 | } 16 | 17 | public void display() { 18 | System.out.println("Ccc headlineNews: " + headlineNews); 19 | System.out.println("Ccc sportsNews: " + sportsNews); 20 | System.out.println("Ccc entertainmentNews: " + entertainmentNews); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/com/design/pattern/interpreter/Interpreter.java: -------------------------------------------------------------------------------- 1 | package com.design.pattern.interpreter; 2 | 3 | import java.util.List; 4 | 5 | import com.design.pattern.interpreter.expression.Expression; 6 | import com.design.pattern.interpreter.parser.Parser; 7 | import com.design.pattern.interpreter.parser.Token; 8 | import com.design.pattern.interpreter.parser.Tokenizer; 9 | 10 | public class Interpreter { 11 | 12 | private final List tokens; 13 | private final Expression rootExpression; 14 | 15 | public Interpreter(String expressionString) throws InterpreterException { 16 | tokens = Tokenizer.tokenize(expressionString); 17 | rootExpression = Parser.parse(tokens); 18 | } 19 | 20 | public List getTokens() { 21 | return tokens; 22 | } 23 | 24 | public Expression getRootExpression() { 25 | return rootExpression; 26 | } 27 | 28 | } 29 | -------------------------------------------------------------------------------- /src/com/design/pattern/iterator/NameRepository.java: -------------------------------------------------------------------------------- 1 | package com.design.pattern.iterator; 2 | 3 | import java.util.ArrayList; 4 | 5 | public class NameRepository implements Container { 6 | public String names[] = {"Ethan", "Jason", "Karen", "Ascii"}; 7 | 8 | @Override 9 | public Iterator getIterator() { 10 | return new NameIterator(); 11 | } 12 | 13 | private class NameIterator implements Iterator { 14 | 15 | int index; 16 | 17 | @Override 18 | public boolean hasNext() { 19 | if(index < names.length){ 20 | return true; 21 | } 22 | return false; 23 | } 24 | 25 | @Override 26 | public Object next() { 27 | if(hasNext()){ 28 | return names[index++]; 29 | } 30 | return null; 31 | } 32 | } 33 | } -------------------------------------------------------------------------------- /src/com/design/pattern/bridge/drawing/DP2.java: -------------------------------------------------------------------------------- 1 | package com.design.pattern.bridge.drawing; 2 | 3 | public class DP2 { 4 | 5 | public static void draw_line(double x1, double x2, double y1, double y2) { 6 | System.out.println(String.format("DP2 draw line, (%s, %s) -> (%s, %s)", x1, y1, x1, y2)); 7 | System.out.println(String.format("DP2 draw line, (%s, %s) -> (%s, %s)", x1, y2, x2, y2)); 8 | System.out.println(String.format("DP2 draw line, (%s, %s) -> (%s, %s)", x2, y2, x2, y1)); 9 | System.out.println(String.format("DP2 draw line, (%s, %s) -> (%s, %s)", x2, y1, x1, y1)); 10 | System.out.println(); 11 | } 12 | 13 | public static void draw_circle(double x, double y, double r) { 14 | System.out.println(String.format("DP2 draw circle, center: (%s, %s), radius: %s", x, y ,r)); 15 | System.out.println(); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/com/design/pattern/bridge/drawing/DP1.java: -------------------------------------------------------------------------------- 1 | package com.design.pattern.bridge.drawing; 2 | 3 | public class DP1 { 4 | 5 | public static void draw_a_line(double x1, double y1, double x2, double y2) { 6 | System.out.println(String.format("DP1 draw line, (%s, %s) -> (%s, %s)", x1, y1, x2, y1)); 7 | System.out.println(String.format("DP1 draw line, (%s, %s) -> (%s, %s)", x2, y1, x2, y2)); 8 | System.out.println(String.format("DP1 draw line, (%s, %s) -> (%s, %s)", x2, y2, x1, y2)); 9 | System.out.println(String.format("DP1 draw line, (%s, %s) -> (%s, %s)", x1, y2, x1, y1)); 10 | System.out.println(); 11 | } 12 | 13 | public static void draw_a_circle(double x, double y, double r) { 14 | System.out.println(String.format("DP1 draw circle, center: (%s, %s), radius: %s", x, y ,r)); 15 | System.out.println(); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/com/design/pattern/strategy/duck/Duck.java: -------------------------------------------------------------------------------- 1 | 2 | package com.design.pattern.strategy.duck; 3 | 4 | 5 | 6 | public abstract class Duck { 7 | 8 | protected FlyBehavior flyBehavior; 9 | protected QuackBehavior quackBehavior; 10 | protected SwimBehavior swimBehavior; 11 | 12 | public void setFlyBehavior (FlyBehavior fb) { 13 | flyBehavior = fb; 14 | } 15 | 16 | public void setQuackBehavior(QuackBehavior qb) { 17 | quackBehavior = qb; 18 | } 19 | 20 | public void setSwimBehavior(SwimBehavior sb) { 21 | swimBehavior = sb; 22 | } 23 | 24 | public abstract void display(); 25 | 26 | public void swin() { 27 | swimBehavior.swim(); 28 | } 29 | 30 | public void quack() { 31 | quackBehavior.quack(); 32 | } 33 | 34 | public void fly() { 35 | flyBehavior.fly(); 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /src/com/design/pattern/composite/Developer.java: -------------------------------------------------------------------------------- 1 | package com.design.pattern.composite; 2 | 3 | public class Developer implements Employee { 4 | private String name; 5 | private String title; 6 | 7 | public Developer(String name, String title) { 8 | this.name = name; 9 | this.title = title; 10 | } 11 | 12 | public void add(Employee employee) { 13 | } 14 | 15 | public void remove(Employee employee) { 16 | } 17 | 18 | public Employee getChild(int i) { 19 | return null; 20 | } 21 | 22 | public String getName() { 23 | return name; 24 | } 25 | 26 | public String getTitle() { 27 | return title; 28 | } 29 | 30 | public void print() { 31 | System.out.println(CompositeClient.g_indent + "Name : " + getName()); 32 | System.out.println(CompositeClient.g_indent + "Title: " + getTitle()); 33 | } 34 | } -------------------------------------------------------------------------------- /src/com/design/pattern/interpreter/expression/AddExpression.java: -------------------------------------------------------------------------------- 1 | package com.design.pattern.interpreter.expression; 2 | 3 | import java.util.Map; 4 | 5 | import com.design.pattern.interpreter.InterpreterException; 6 | 7 | public class AddExpression implements Expression { 8 | 9 | private final Expression leftExpression; 10 | private final Expression rightExpression; 11 | 12 | public AddExpression(Expression leftExpression, Expression rightExpression) { 13 | this.leftExpression = leftExpression; 14 | this.rightExpression = rightExpression; 15 | } 16 | 17 | @Override 18 | public double interpret(Map context) throws InterpreterException { 19 | return leftExpression.interpret(context) + rightExpression.interpret(context); 20 | } 21 | 22 | @Override 23 | public String toString() { 24 | return String.format("(%s + %s)", leftExpression, rightExpression); 25 | } 26 | 27 | } 28 | -------------------------------------------------------------------------------- /src/com/design/pattern/interpreter/expression/MultiplyExpression.java: -------------------------------------------------------------------------------- 1 | package com.design.pattern.interpreter.expression; 2 | 3 | import java.util.Map; 4 | 5 | import com.design.pattern.interpreter.InterpreterException; 6 | 7 | public class MultiplyExpression implements Expression { 8 | 9 | private final Expression leftExpression; 10 | private final Expression rightExpression; 11 | 12 | public MultiplyExpression(Expression leftExpression, Expression rightExpression) { 13 | this.leftExpression = leftExpression; 14 | this.rightExpression = rightExpression; 15 | } 16 | 17 | @Override 18 | public double interpret(Map context) throws InterpreterException { 19 | return leftExpression.interpret(context) * rightExpression.interpret(context); 20 | } 21 | 22 | @Override 23 | public String toString() { 24 | return String.format("(%s * %s)", leftExpression, rightExpression); 25 | } 26 | 27 | } 28 | -------------------------------------------------------------------------------- /src/com/design/pattern/singleton/Country.java: -------------------------------------------------------------------------------- 1 | package com.design.pattern.singleton; 2 | 3 | public class Country { 4 | public static void main(String[] args) { 5 | 6 | //TODO add thread safe singleton 7 | for (int i = 0; i < 10; i++) { 8 | new Thread(new Runnable() { 9 | @Override 10 | public void run() { 11 | Government governmentFortestTreadSafe = Government.getInstance(); 12 | } 13 | }).start(); 14 | } 15 | 16 | //TODO refactor with singleton pattern 17 | Government government = new Government(); 18 | government.setOfficer(100); 19 | System.out.println("government has " + government.getOfficer() + " officers. \n"); 20 | 21 | 22 | government = new Government(); 23 | System.out.println("government has " + government.getOfficer() + " officers."); 24 | 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/com/design/pattern/chain/Request.java: -------------------------------------------------------------------------------- 1 | package com.design.pattern.chain; 2 | 3 | public class Request { 4 | 5 | private String requestDescription; 6 | private RequestType requestType; 7 | 8 | public Request(RequestType requestType, String requestDescription) { 9 | this.setRequestType(requestType); 10 | this.setRequestDescription(requestDescription); 11 | } 12 | 13 | public String getRequestDescription() { 14 | return requestDescription; 15 | } 16 | 17 | public void setRequestDescription(String requestDescription) { 18 | this.requestDescription = requestDescription; 19 | } 20 | 21 | public RequestType getRequestType() { 22 | return requestType; 23 | } 24 | 25 | public void setRequestType(RequestType requestType) { 26 | this.requestType = requestType; 27 | } 28 | 29 | @Override 30 | public String toString() { 31 | return getRequestDescription(); 32 | } 33 | } -------------------------------------------------------------------------------- /src/com/design/pattern/adapter/classadapter/DuckTestDriveByClassAdapter.java: -------------------------------------------------------------------------------- 1 | 2 | package com.design.pattern.adapter.classadapter; 3 | 4 | 5 | import com.design.pattern.adapter.Duck; 6 | import com.design.pattern.adapter.MallardDuck; 7 | import com.design.pattern.adapter.WildTurkey; 8 | 9 | public class DuckTestDriveByClassAdapter { 10 | 11 | public static void main(String[] args) { 12 | 13 | MallardDuck duck = new MallardDuck(); 14 | WildTurkey turkey = new WildTurkey(); 15 | Duck fakeDuck = new TurkeyClassAdapter(); 16 | 17 | System.out.println("The Turkey says..."); 18 | turkey.gobble(); 19 | turkey.fly(); 20 | 21 | System.out.println("\nThe Duck says..."); 22 | testDuck(duck); 23 | 24 | System.out.println("\nThe fake Duck says..."); 25 | testDuck(fakeDuck); 26 | 27 | } 28 | 29 | public static void testDuck(Duck duck) { 30 | duck.quack(); 31 | duck.fly(); 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /src/com/design/pattern/adapter/objectadapter/DuckTestDriveByObjectAdapter.java: -------------------------------------------------------------------------------- 1 | 2 | package com.design.pattern.adapter.objectadapter; 3 | 4 | 5 | import com.design.pattern.adapter.Duck; 6 | import com.design.pattern.adapter.MallardDuck; 7 | import com.design.pattern.adapter.WildTurkey; 8 | 9 | public class DuckTestDriveByObjectAdapter { 10 | 11 | public static void main(String[] args) { 12 | 13 | MallardDuck duck = new MallardDuck(); 14 | WildTurkey turkey = new WildTurkey(); 15 | Duck fakeDuck = new TurkeyObjectAdapter(turkey); 16 | 17 | System.out.println("The Turkey says..."); 18 | turkey.gobble(); 19 | turkey.fly(); 20 | 21 | System.out.println("\nThe Duck says..."); 22 | testDuck(duck); 23 | 24 | System.out.println("\nThe fake Duck says..."); 25 | testDuck(fakeDuck); 26 | } 27 | 28 | public static void testDuck(Duck duck) { 29 | duck.quack(); 30 | duck.fly(); 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /src/com/design/pattern/builder/builderDemo.java: -------------------------------------------------------------------------------- 1 | package com.design.pattern.builder; 2 | 3 | public class builderDemo { 4 | public static void main(String[] args) { 5 | Waiter waiter = new Waiter(); //Director 6 | 7 | waiter.setPizzaBuilder(new HawaiianPizzaBuilder()); 8 | waiter.buildPizza(); 9 | Pizza hawaiianPizza = waiter.getPizza(); //Product 10 | System.out.println("-------- Hawaiian Pizza ---------"); 11 | System.out.println("Dough: " + hawaiianPizza.dough); 12 | System.out.println("Sauce: " + hawaiianPizza.sauce); 13 | System.out.println("Topping: " + hawaiianPizza.topping + "\n"); 14 | 15 | 16 | waiter.setPizzaBuilder(new SpicyPizzaBuilder()); 17 | waiter.buildPizza(); 18 | Pizza spicyPizza = waiter.getPizza(); 19 | System.out.println("-------- Spicy Pizza ---------"); 20 | System.out.println("Dough: " + spicyPizza.dough); 21 | System.out.println("Sauce: " + spicyPizza.sauce); 22 | System.out.println("Topping: " + spicyPizza.topping + "\n"); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/com/design/pattern/templatemethod/CaffeineBeverage.java: -------------------------------------------------------------------------------- 1 | 2 | package com.design.pattern.templatemethod; 3 | 4 | public abstract class CaffeineBeverage { 5 | 6 | private boolean isNeedToAddCondiments = true; 7 | 8 | public final void prepareRecipe() { 9 | boilWater(); 10 | brew(); 11 | pourInCup(); 12 | if (customerWantsCondiments()) { 13 | addCondiments(); 14 | } 15 | } 16 | 17 | protected abstract void brew(); 18 | 19 | protected abstract void addCondiments(); 20 | 21 | private void boilWater() { 22 | System.out.println("Boiling water"); 23 | } 24 | 25 | private void pourInCup() { 26 | System.out.println("Pouring into cup"); 27 | } 28 | 29 | public boolean customerWantsCondiments() { 30 | return isNeedToAddCondiments; 31 | } 32 | 33 | public void setCustomerWantsCondiments(boolean needToAddCondiment) { 34 | isNeedToAddCondiments = needToAddCondiment; 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /src/com/design/pattern/strategy/duck/MiniDuckSimulator.java: -------------------------------------------------------------------------------- 1 | 2 | package com.design.pattern.strategy.duck; 3 | 4 | public class MiniDuckSimulator { 5 | 6 | public static void main(String[] args) { 7 | 8 | MallardDuck mallardDuck = new MallardDuck(); 9 | RubberDuck rubberDuck = new RubberDuck(); 10 | RedHeadDuck readHeadDuck = new RedHeadDuck(); 11 | ModelDuck modelDuck = new ModelDuck(); 12 | 13 | mallardDuck.display(); 14 | mallardDuck.quack(); 15 | mallardDuck.swin(); 16 | mallardDuck.fly(); 17 | rubberDuck.display(); 18 | rubberDuck.quack(); 19 | rubberDuck.fly(); 20 | rubberDuck.swin(); 21 | readHeadDuck.display(); 22 | readHeadDuck.quack(); 23 | readHeadDuck.fly(); 24 | readHeadDuck.swin(); 25 | modelDuck.display(); 26 | modelDuck.quack(); 27 | modelDuck.setFlyBehavior(new FlyWithRocket()); 28 | modelDuck.fly(); 29 | modelDuck.swin(); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /src/com/design/pattern/interpreter/parser/Token.java: -------------------------------------------------------------------------------- 1 | package com.design.pattern.interpreter.parser; 2 | 3 | import com.design.pattern.interpreter.InterpreterException; 4 | 5 | public class Token { 6 | public static enum TokenType { 7 | SPACE, 8 | NUMBER, 9 | ADD, 10 | MULTIPLY, 11 | VARIABLE, 12 | EPSILON, // The end of the entire expression. 13 | } 14 | 15 | private final TokenType type; 16 | private final String string; 17 | 18 | public Token(TokenType type, String string) { 19 | this.type = type; 20 | this.string = string; 21 | } 22 | 23 | @Override 24 | public String toString() { 25 | return String.format("(%s, \"%s\")", type, string); 26 | } 27 | 28 | public TokenType getType() { 29 | return type; 30 | } 31 | 32 | public String getString() { 33 | return string; 34 | } 35 | 36 | public double getAsNumber() throws InterpreterException { 37 | if (type != TokenType.NUMBER) { 38 | throw new InterpreterException("Incorrect token type. "); 39 | } 40 | return Double.valueOf(string); 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /src/com/design/pattern/bridge/Factory.java: -------------------------------------------------------------------------------- 1 | package com.design.pattern.bridge; 2 | 3 | import com.design.pattern.bridge.drawing.Drawing; 4 | import com.design.pattern.bridge.drawing.V1Drawing; 5 | import com.design.pattern.bridge.drawing.V2Drawing; 6 | import com.design.pattern.bridge.shape.Circle; 7 | import com.design.pattern.bridge.shape.Rectangle; 8 | import com.design.pattern.bridge.shape.Shape; 9 | 10 | import java.util.ArrayList; 11 | import java.util.List; 12 | 13 | public class Factory { 14 | 15 | private List shapes = new ArrayList(); 16 | 17 | public Factory() { 18 | } 19 | 20 | public void create() { 21 | Drawing v1Drawing = new V1Drawing(); 22 | Drawing v2Drawing = new V2Drawing(); 23 | 24 | shapes.add(new Rectangle(v1Drawing, 2, 2, 5, 5)); 25 | shapes.add(new Circle(v1Drawing, 2, 2, 5)); 26 | shapes.add(new Rectangle(v2Drawing, 1, 1, 7, 7)); 27 | shapes.add(new Circle(v2Drawing, 3, 3, 6)); 28 | } 29 | 30 | public List getShapes() { 31 | return shapes; 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /src/com/design/pattern/builder2/UserDemo.java: -------------------------------------------------------------------------------- 1 | package com.design.pattern.builder2; 2 | 3 | public class UserDemo { 4 | public static void main(String[] args) { 5 | 6 | User userKaren = new User.UserBuilder("Karen", "Lin").build(); 7 | 8 | System.out.println("User's first Name: " + userKaren.getFirstName()); 9 | System.out.println("User's last Name: " + userKaren.getLastName()); 10 | System.out.println("User's age: " + userKaren.getAge()); 11 | System.out.println("User's phone: " + userKaren.getPhone()); 12 | System.out.println("User's address: " + userKaren.getAddress() + "\n"); 13 | 14 | User userGrass = new User.UserBuilder("Grass", "Dig").age(18).phone("7533967").build(); 15 | 16 | System.out.println("User's first Name: " + userGrass.getFirstName()); 17 | System.out.println("User's last Name: " + userGrass.getLastName()); 18 | System.out.println("User's age: " + userGrass.getAge()); 19 | System.out.println("User's phone: " + userGrass.getPhone()); 20 | System.out.println("User's address: " + userGrass.getAddress()); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/com/design/pattern/decorator/BurgerQueen.java: -------------------------------------------------------------------------------- 1 | package com.design.pattern.decorator; 2 | 3 | public class BurgerQueen { 4 | 5 | public static void main(String[] args) { 6 | // Make a beef marine sandwich. 7 | Burger submarineSandwichBeef = new Beef(new SubmarineSandwich()); 8 | System.out.println(submarineSandwichBeef.getDescription()); 9 | System.out.println(submarineSandwichBeef.cost() + "\n"); 10 | 11 | // Make a cheese sandwich. 12 | Burger cheeseSandwich = new Cheese(new Sandwich()); 13 | System.out.println(cheeseSandwich.getDescription()); 14 | System.out.println(cheeseSandwich.cost() + "\n"); 15 | 16 | // Make a lettuce chicken whopper. 17 | Burger lettuceChickenWhopper = new Lettuce(new Chicken(new WhopperBurger())); 18 | System.out.println(lettuceChickenWhopper.getDescription()); 19 | System.out.println(lettuceChickenWhopper.cost() + "\n"); 20 | 21 | // Make a bacon cheese whopper burger. 22 | Burger baconCheeseWhopper = new Bacon(new Cheese(new WhopperBurger())); 23 | System.out.println(baconCheeseWhopper.getDescription()); 24 | System.out.println(baconCheeseWhopper.cost() + "\n"); 25 | } 26 | 27 | } -------------------------------------------------------------------------------- /src/com/design/pattern/observer/NewsStation.java: -------------------------------------------------------------------------------- 1 | 2 | package com.design.pattern.observer; 3 | 4 | public class NewsStation { 5 | 6 | public static void main(String[] args) { 7 | NewsData newsData = new NewsData(); 8 | CccNewsDisplay cccNewsDisplay = new CccNewsDisplay(); 9 | DnnNewsDisplay dnnNewsDisplay = new DnnNewsDisplay(); 10 | GuavaDaliyNewsDisplay guavaDaliyNewsDisplay = new GuavaDaliyNewsDisplay(); 11 | YahuNewsDisplay yahuNewsDisplay = new YahuNewsDisplay(); 12 | 13 | newsData.registerObserver(cccNewsDisplay); 14 | newsData.registerObserver(dnnNewsDisplay); 15 | newsData.registerObserver(guavaDaliyNewsDisplay); 16 | newsData.registerObserver(yahuNewsDisplay); 17 | 18 | newsData.setHeadlineNews("'Big objects found' in AirAsia hunt"); 19 | newsData.setFinanceNews("US shares barely budge in 2015"); 20 | newsData.setEntertainmentNews("Bono guitar fears after bike crash"); 21 | newsData.setSportsNews("World Tennis Championship: Andy Murray beats Rafael Nadal"); 22 | 23 | newsData.updateNews(); 24 | 25 | } 26 | 27 | } 28 | -------------------------------------------------------------------------------- /src/com/design/pattern/prototype/CookieMachine.java: -------------------------------------------------------------------------------- 1 | package com.design.pattern.prototype; 2 | 3 | public class CookieMachine { 4 | 5 | private Cookie cookie;//cookie必須是可複製的 6 | 7 | public CookieMachine(Cookie cookie) { 8 | this.cookie = cookie; 9 | } 10 | 11 | public Cookie makeCookie() { 12 | try { 13 | return (Cookie) cookie.clone(); 14 | } catch (CloneNotSupportedException e) { 15 | e.printStackTrace(); 16 | } 17 | return null; 18 | } 19 | 20 | public static void main(String args[]) { 21 | String[] nameArray = {"Jason", "Ethan", "Daniel", "Wendy", "Ascii", "Ryan", "Karen"}; 22 | Cookie tempCookie = null; 23 | Cookie cookie = new Cookie(); 24 | cookie.cookieEndDate = "2015/12/31"; 25 | CookieMachine cm = new CookieMachine(cookie); //設置原型 26 | for (int i = 0; i < nameArray.length; i++) { 27 | tempCookie = cm.makeCookie();//通過複製原型返回多個cookie 28 | tempCookie.cookieName = nameArray[i]; 29 | System.out.println("========= new cookie ========"); 30 | System.out.println("cookie name = " + tempCookie.cookieName); 31 | System.out.println("cookie end date = " + tempCookie.cookieEndDate); 32 | } 33 | } 34 | } -------------------------------------------------------------------------------- /src/com/design/pattern/command/remotecontrol/SimpleRemoteControl.java: -------------------------------------------------------------------------------- 1 | package com.design.pattern.command.remotecontrol; 2 | 3 | import com.design.pattern.command.command.Command; 4 | 5 | import java.util.ArrayList; 6 | import java.util.List; 7 | 8 | public class SimpleRemoteControl { 9 | private List commands; 10 | 11 | public SimpleRemoteControl() { 12 | commands = new ArrayList(); 13 | } 14 | 15 | public void addCommand(Command command) { 16 | commands.add(command); 17 | } 18 | 19 | public void buttonWasPressed(int index) { 20 | commands.get(index).attack(); 21 | } 22 | 23 | public int getCommandsSize(){ 24 | return commands.size(); 25 | } 26 | 27 | @Override 28 | public String toString() { 29 | 30 | StringBuffer stringBuff = new StringBuffer(); 31 | stringBuff.append("\n------------Remote Control------------\n"); 32 | 33 | for (int i = 0; i < commands.size(); i++) { 34 | stringBuff.append("[slot " + i + "] " + commands.get(i).getClass().getName() + "\n"); 35 | } 36 | return stringBuff.toString(); 37 | } 38 | 39 | 40 | } 41 | -------------------------------------------------------------------------------- /src/com/design/pattern/composite/Manager.java: -------------------------------------------------------------------------------- 1 | package com.design.pattern.composite; 2 | 3 | import java.util.ArrayList; 4 | import java.util.List; 5 | 6 | public class Manager implements Employee { 7 | private String name; 8 | private String title; 9 | private List employees = new ArrayList(); 10 | 11 | public Manager(String name, String title) { 12 | this.name = name; 13 | this.title = title; 14 | } 15 | 16 | @Override 17 | public void add(Employee employee) { 18 | employees.add(employee); 19 | } 20 | 21 | @Override 22 | public void remove(Employee employee) { 23 | employees.remove(employee); 24 | } 25 | 26 | @Override 27 | public Employee getChild(int i) { 28 | return employees.get(i); 29 | } 30 | 31 | @Override 32 | public String getName() { 33 | return name; 34 | } 35 | 36 | @Override 37 | public String getTitle() { 38 | return title; 39 | } 40 | 41 | @Override 42 | public void print() { 43 | System.out.println(CompositeClient.g_indent + "Name : " + getName()); 44 | System.out.println(CompositeClient.g_indent + "Title: " + getTitle()); 45 | System.out.println("---------------------------"); 46 | 47 | for (Employee employee : employees) { 48 | CompositeClient.g_indent.append(" "); 49 | employee.print(); 50 | CompositeClient.g_indent.setLength(CompositeClient.g_indent.length() - 3); 51 | } 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /src/com/design/pattern/builder2/User.java: -------------------------------------------------------------------------------- 1 | package com.design.pattern.builder2; 2 | 3 | public class User { 4 | private final String firstName; // required 5 | private final String lastName; // required 6 | private final int age; // optional 7 | private final String phone; // optional 8 | private final String address; // optional 9 | 10 | private User(UserBuilder builder) { 11 | this.firstName = builder.firstName; 12 | this.lastName = builder.lastName; 13 | this.age = builder.age; 14 | this.phone = builder.phone; 15 | this.address = builder.address; 16 | } 17 | 18 | public String getFirstName() { 19 | return firstName; 20 | } 21 | 22 | public String getLastName() { 23 | return lastName; 24 | } 25 | 26 | public int getAge() { 27 | return age; 28 | } 29 | 30 | public String getPhone() { 31 | return phone; 32 | } 33 | 34 | public String getAddress() { 35 | return address; 36 | } 37 | 38 | public static class UserBuilder { 39 | private final String firstName; 40 | private final String lastName; 41 | private int age; 42 | private String phone; 43 | private String address; 44 | 45 | public UserBuilder(String firstName, String lastName) { 46 | this.firstName = firstName; 47 | this.lastName = lastName; 48 | } 49 | 50 | public UserBuilder age(int age) { 51 | this.age = age; 52 | return this; 53 | } 54 | 55 | public UserBuilder phone(String phone) { 56 | this.phone = phone; 57 | return this; 58 | } 59 | 60 | public UserBuilder address(String address) { 61 | this.address = address; 62 | return this; 63 | } 64 | 65 | public User build() { 66 | return new User(this); 67 | } 68 | } 69 | } 70 | -------------------------------------------------------------------------------- /src/com/design/pattern/interpreter/Main.java: -------------------------------------------------------------------------------- 1 | package com.design.pattern.interpreter; 2 | 3 | import java.util.HashMap; 4 | import java.util.List; 5 | import java.util.Map; 6 | 7 | import com.design.pattern.interpreter.parser.Token; 8 | 9 | public class Main { 10 | 11 | static final boolean VERBOSE_PARSE = false; 12 | static final boolean VERBOSE_DEBUG = false; 13 | static final double EPS = 1e-7; 14 | static final Map context = new HashMap(); 15 | static { 16 | context.put("age", 18.0); 17 | context.put("height", 170.0); 18 | } 19 | 20 | private static void execute(String expressionString, double excepted) { 21 | System.out.println("Attempting to evaluate: " + expressionString); 22 | try { 23 | Interpreter interpreter = new Interpreter(expressionString); 24 | if (VERBOSE_PARSE) { 25 | printTokens(interpreter.getTokens()); 26 | System.out.println("Parse tree: " 27 | + interpreter.getRootExpression()); 28 | } 29 | double value = interpreter.getRootExpression().interpret(context); 30 | boolean correct = Math.abs(value - excepted) < EPS; 31 | System.out.println(String.format( 32 | "* %s!! Excepted: %.4f, evaluated: %.4f", 33 | correct ? "Correct" : "Incorrect", excepted, value)); 34 | } catch (InterpreterException e) { 35 | System.out.println("Error: " + e); 36 | if (VERBOSE_DEBUG) { 37 | e.printStackTrace(); 38 | } 39 | } 40 | } 41 | 42 | private static void printTokens(List tokens) { 43 | StringBuffer buffer = new StringBuffer("Tokens: "); 44 | for (Token token : tokens) { 45 | buffer.append(token); 46 | } 47 | System.out.println(buffer); 48 | } 49 | 50 | public static void main(String[] args) { 51 | execute("1.5", 1.5); 52 | execute("1 + 2 + 3 + 4 + 5", 1 + 2 + 3 + 4 + 5); 53 | execute("2 * 3 + 5 * 7", 2 * 3 + 5 * 7); 54 | execute("age * 10 + height * 1.5", get("age") * 10 + get("height") * 1.5); 55 | } 56 | 57 | public static double get(String key) { 58 | return context.get(key); 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /src/com/design/pattern/observer/NewsData.java: -------------------------------------------------------------------------------- 1 | 2 | package com.design.pattern.observer; 3 | 4 | import java.util.ArrayList; 5 | import java.util.List; 6 | 7 | public class NewsData implements Subject { 8 | private String headlineNews; 9 | private String sportsNews; 10 | private String financeNews; 11 | private String entertainmentNews; 12 | 13 | private List observerArrayList; 14 | 15 | public NewsData() { 16 | observerArrayList = new ArrayList(); 17 | } 18 | 19 | @Override 20 | public void registerObserver(Observer object) { 21 | observerArrayList.add(object); 22 | } 23 | 24 | @Override 25 | public void removeObserver(Observer object) { 26 | if (observerArrayList.contains(object)) { 27 | observerArrayList.remove(object); 28 | } 29 | } 30 | 31 | @Override 32 | public void notifyObservers() { 33 | for (int i = 0; i < observerArrayList.size(); i++) { 34 | ((Observer) observerArrayList.get(i)).update(headlineNews, sportsNews, financeNews, entertainmentNews); 35 | } 36 | } 37 | 38 | public void updateNews() { 39 | notifyObservers(); 40 | } 41 | 42 | public String getHeadlineNews() { 43 | return headlineNews; 44 | } 45 | 46 | public String getSportsNews() { 47 | return sportsNews; 48 | } 49 | 50 | public void setFinanceNews(String financeNews) { 51 | this.financeNews = financeNews; 52 | } 53 | 54 | public void setEntertainmentNews(String entertainmentNews) { 55 | this.entertainmentNews = entertainmentNews; 56 | } 57 | 58 | public void setHeadlineNews(String headlineNews) { 59 | this.headlineNews = headlineNews; 60 | } 61 | 62 | public void setSportsNews(String sportsNews) { 63 | this.sportsNews = sportsNews; 64 | } 65 | 66 | public String getFinanceNews() { 67 | return financeNews; 68 | } 69 | 70 | public String getEntertainmentNews() { 71 | return entertainmentNews; 72 | } 73 | } 74 | -------------------------------------------------------------------------------- /src/com/design/pattern/interpreter/parser/Tokenizer.java: -------------------------------------------------------------------------------- 1 | package com.design.pattern.interpreter.parser; 2 | import java.util.ArrayList; 3 | import java.util.List; 4 | import java.util.regex.Matcher; 5 | import java.util.regex.Pattern; 6 | 7 | import com.design.pattern.interpreter.InterpreterException; 8 | import com.design.pattern.interpreter.parser.Token.TokenType; 9 | 10 | public class Tokenizer { 11 | private static class TokenRule { 12 | private final Pattern pattern; 13 | private final TokenType type; 14 | 15 | public TokenRule(String pattern, TokenType type) { 16 | this.pattern = Pattern.compile(pattern); 17 | this.type = type; 18 | } 19 | 20 | public Pattern getPattern() { 21 | return pattern; 22 | } 23 | 24 | public TokenType getType() { 25 | return type; 26 | } 27 | } 28 | 29 | private static final List rules = new ArrayList(); 30 | static { 31 | rules.add(new TokenRule("^\\d+(\\.\\d+)?", TokenType.NUMBER)); 32 | rules.add(new TokenRule("^[ \t\n\r]+", TokenType.SPACE)); 33 | rules.add(new TokenRule("^\\+", TokenType.ADD)); 34 | rules.add(new TokenRule("^\\*", TokenType.MULTIPLY)); 35 | rules.add(new TokenRule("^[A-Za-z][A-Za-z0-9]*", TokenType.VARIABLE)); 36 | } 37 | 38 | public static List tokenize(String exprStr) throws InterpreterException { 39 | Tokenizer tokenizer = new Tokenizer(exprStr); 40 | return tokenizer.tokenize(); 41 | } 42 | 43 | private final String exprStr; 44 | 45 | private Tokenizer(String exprStr) { 46 | this.exprStr = exprStr; 47 | } 48 | 49 | private List tokenize() throws InterpreterException { 50 | List tokens = new ArrayList(); 51 | int pos = 0; 52 | int len = exprStr.length(); 53 | while (pos < len) { 54 | CharSequence sequence = exprStr.subSequence(pos, len); 55 | boolean matched = false; 56 | for (TokenRule rule : rules) { 57 | Matcher matcher = rule.getPattern().matcher(sequence); 58 | if (!matcher.find()) { 59 | continue; 60 | } 61 | matched = true; 62 | pos += matcher.end(); 63 | TokenType type = rule.getType(); 64 | if (type != TokenType.SPACE) { 65 | Token token = new Token(type, matcher.group()); 66 | tokens.add(token); 67 | } 68 | break; 69 | } 70 | if (!matched) { 71 | throw new InterpreterException("Tokenizer error at: \"" + sequence + "\""); 72 | } 73 | } 74 | tokens.add(new Token(TokenType.EPSILON, "")); 75 | return tokens; 76 | } 77 | } 78 | -------------------------------------------------------------------------------- /src/com/design/pattern/interpreter/parser/Parser.java: -------------------------------------------------------------------------------- 1 | package com.design.pattern.interpreter.parser; 2 | 3 | import java.util.List; 4 | 5 | import com.design.pattern.interpreter.InterpreterException; 6 | import com.design.pattern.interpreter.expression.AddExpression; 7 | import com.design.pattern.interpreter.expression.Expression; 8 | import com.design.pattern.interpreter.expression.MultiplyExpression; 9 | import com.design.pattern.interpreter.expression.NumberExpression; 10 | import com.design.pattern.interpreter.expression.VariableExpression; 11 | import com.design.pattern.interpreter.parser.Token.TokenType; 12 | 13 | public class Parser { 14 | private final List tokens; 15 | int next = 0; 16 | 17 | public static Expression parse(List tokens) throws InterpreterException { 18 | return new Parser(tokens).parse(); 19 | } 20 | 21 | private Parser(List tokens) { 22 | this.tokens = tokens; 23 | } 24 | 25 | private Expression parse() throws InterpreterException { 26 | next = 0; 27 | Expression expression = expression(); 28 | except(TokenType.EPSILON); 29 | return expression; 30 | } 31 | 32 | private Expression expression() throws InterpreterException { 33 | Expression expression = term(); 34 | while (accept(TokenType.ADD)) { 35 | expression = new AddExpression(expression, term()); 36 | } 37 | return expression; 38 | 39 | } 40 | 41 | private Expression term() throws InterpreterException { 42 | Expression expression = factor(); 43 | while (accept(TokenType.MULTIPLY)) { 44 | expression = new MultiplyExpression(expression, term()); 45 | } 46 | return expression; 47 | } 48 | 49 | private Expression factor() throws InterpreterException { 50 | if (accept(TokenType.NUMBER)) { 51 | return new NumberExpression(current().getAsNumber()); 52 | } 53 | except(TokenType.VARIABLE); 54 | return new VariableExpression(current().getString()); 55 | } 56 | 57 | private boolean accept(TokenType tokenType) { 58 | if (tokens.get(next).getType() == tokenType) { 59 | ++next; 60 | return true; 61 | } else { 62 | return false; 63 | } 64 | } 65 | 66 | private void except(TokenType tokenType) throws InterpreterException { 67 | if (!accept(tokenType)) { 68 | throw new InterpreterException( 69 | "Parser error. Unexcepted token at: \"" 70 | + getRemainingString() + "\""); 71 | } 72 | } 73 | 74 | private Token current() { 75 | return tokens.get(next - 1); 76 | } 77 | 78 | private String getRemainingString() { 79 | StringBuffer buffer = new StringBuffer(); 80 | for (int i = next; i < tokens.size(); ++i) { 81 | if (i != next) 82 | buffer.append(" "); 83 | buffer.append(tokens.get(i).getString()); 84 | } 85 | return buffer.toString(); 86 | } 87 | 88 | } 89 | -------------------------------------------------------------------------------- /src/com/design/pattern/command/FightMain.java: -------------------------------------------------------------------------------- 1 | package com.design.pattern.command; 2 | 3 | import com.design.pattern.command.army.BaseballPlayer; 4 | import com.design.pattern.command.army.Goblin; 5 | import com.design.pattern.command.army.Knight; 6 | import com.design.pattern.command.army.SonGoku; 7 | import com.design.pattern.command.army.Warrior; 8 | import com.design.pattern.command.army.Wizard; 9 | import com.design.pattern.command.command.BaseballPlayerCommand; 10 | import com.design.pattern.command.command.Command; 11 | import com.design.pattern.command.command.GoblinCommand; 12 | import com.design.pattern.command.command.KnightCommand; 13 | import com.design.pattern.command.command.MircoCommand; 14 | import com.design.pattern.command.command.SonGokuCommand; 15 | import com.design.pattern.command.command.WarriorCommand; 16 | import com.design.pattern.command.command.WizardCommand; 17 | import com.design.pattern.command.remotecontrol.SimpleRemoteControl; 18 | 19 | import java.util.ArrayList; 20 | import java.util.List; 21 | 22 | public class FightMain { 23 | 24 | public static void main(String[] args) { 25 | SimpleRemoteControl remoteControl = new SimpleRemoteControl(); 26 | 27 | Knight knight = new Knight(); 28 | Wizard wizard = new Wizard(); 29 | Warrior warrior = new Warrior(); 30 | Goblin goblin = new Goblin(); 31 | BaseballPlayer baseballPlayer = new BaseballPlayer(); 32 | SonGoku sonGoku = new SonGoku(); 33 | 34 | Command knightCommand = new KnightCommand(knight); 35 | Command wizardCommand = new WizardCommand(wizard); 36 | Command warriorCommand = new WarriorCommand(warrior); 37 | Command goblinCommand = new GoblinCommand(goblin); 38 | Command baseballPlayerCommand = new BaseballPlayerCommand(baseballPlayer); 39 | Command sonGoKuCommand = new SonGokuCommand(sonGoku); 40 | 41 | List commandList= new ArrayList(); 42 | commandList.add(sonGoKuCommand); 43 | commandList.add(baseballPlayerCommand); 44 | Command mircoCommand = new MircoCommand(commandList); 45 | 46 | remoteControl.addCommand(knightCommand); 47 | remoteControl.addCommand(wizardCommand); 48 | remoteControl.addCommand(warriorCommand); 49 | remoteControl.addCommand(goblinCommand); 50 | remoteControl.addCommand(baseballPlayerCommand); 51 | remoteControl.addCommand(sonGoKuCommand); 52 | remoteControl.addCommand(mircoCommand); 53 | 54 | System.out.println(remoteControl); 55 | 56 | for (int i = 0; i < remoteControl.getCommandsSize(); i++) { 57 | System.out.println("-------------"+i+"----------------"); 58 | remoteControl.buttonWasPressed(i); 59 | } 60 | 61 | } 62 | } 63 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # DesignPattern 2 | 3 | ### Purpose: 4 | 希望大家能夠透過實際動手寫幾個小例子,來了解 design pattern 的精神,並且透過讀書會的方式多多交流對 design pattern 的想法 5 | 6 | ### How to use: 7 | 這個 repository 分成三個分支 8 | * master: 將 dev 的問題使用 design pattern 來改寫,提供大家參考用 9 | * practice: 用來讀書會練習的題目,其中有部分的 code 已經使用 design pattern 改寫,另外一部分,拿來當作練習; 10 | 適合初學者練習使用 11 | * dev: 還沒使用 design pattern 重構前的問題,讓大家先看到問題,進而從中發想該如何使用 design pattern 來重構; 12 | 如果覺得對自己的實力有信心,不妨試著從這個 branch 開始進行重構 13 | 14 | ### Preparation: 15 | #### 1.IDE 16 | 兩者擇一,建議使用 IntelliJ 17 | * [IntelliJ](https://www.jetbrains.com/idea/) 18 | * [Eclipse](https://eclipse.org/downloads/) 19 | 20 | #### 2.Clone this repository 21 |
git clone git@github.com:rewind927/DesignPattern.git
22 | #### 3.Import this project 23 | * [How to import this project by IntelliJ](https://github.com/rewind927/DesignPattern/wiki/How-to-import-this-project-by-IntelliJ) 24 | 25 | ### Book List: 26 | * [Design Patterns](http://www.amazon.com/Design-Patterns-Elements-Reusable-Object-Oriented/dp/0201633612) 27 | * [Head First Design Patterns](http://shop.oreilly.com/product/9780596007126.do) 28 | 29 | ### Pattern List: 30 | 31 | #### Creational 32 | * [Abstract Factory](https://github.com/rewind927/DesignPattern/wiki/AbstractFactory) 33 | * Builder 34 | * [Factory Method](https://github.com/rewind927/DesignPattern/wiki/FactoryMethod) 35 | * Prototype 36 | * [Singleton](https://github.com/rewind927/DesignPattern/wiki/Singleton) 37 | 38 | #### Structural 39 | * [Adapter](https://github.com/rewind927/DesignPattern/wiki/Adapter) 40 | * [Bridge](https://github.com/rewind927/DesignPattern/wiki/Bridge) 41 | * [Composite](https://github.com/rewind927/DesignPattern/wiki/Composite) 42 | * [Decorator](https://github.com/rewind927/DesignPattern/wiki/Decorator) 43 | * [Facade](https://github.com/rewind927/DesignPattern/wiki/Facade) 44 | * [Flyweight](https://github.com/rewind927/DesignPattern/wiki/Flyweight) 45 | * Proxy 46 | 47 | #### Behavioral 48 | * [Chain of responsibility](https://github.com/rewind927/DesignPattern/wiki/Chain-of-Resposibility) 49 | * [Command](https://github.com/rewind927/DesignPattern/wiki/Command) 50 | * Interpreter 51 | * [Iterator](https://github.com/rewind927/DesignPattern/wiki/Iterator) 52 | * Mediator 53 | * [Memento](https://github.com/rewind927/DesignPattern/wiki/Memento) 54 | * State 55 | * [Observer](https://github.com/rewind927/DesignPattern/wiki/Observer) 56 | * [Strategy](https://github.com/rewind927/DesignPattern/wiki/Strategy) 57 | * [Template method](https://github.com/rewind927/DesignPattern/wiki/Template-method) 58 | * [Visitor](https://github.com/rewind927/DesignPattern/wiki/Visitor) 59 | 60 | ### Reference: 61 | 1. [Head First Design Patterns](http://www.headfirstlabs.com/books/hfdp/) 62 | 2. [iluwatar java-design-patterns](https://github.com/iluwatar/java-design-patterns) 63 | --------------------------------------------------------------------------------