├── .gitignore ├── README.md ├── pom.xml └── src ├── main ├── java │ └── com │ │ └── job │ │ └── designpattern │ │ ├── abstractfactory │ │ ├── Access.java │ │ ├── AccessDepartment.java │ │ ├── AccessFactory.java │ │ ├── AccessUser.java │ │ ├── Department.java │ │ ├── IDepartment.java │ │ ├── IFactory.java │ │ ├── IUser.java │ │ ├── SqlServer.java │ │ ├── SqlServerDepartment.java │ │ ├── SqlServerFactory.java │ │ ├── SqlServerUser.java │ │ └── User.java │ │ ├── adapter │ │ ├── Action.java │ │ ├── Database.java │ │ ├── ForeignCenter.java │ │ ├── Forwards.java │ │ ├── Guards.java │ │ ├── Player.java │ │ └── Translator.java │ │ ├── bridge │ │ ├── HandsetAddressList.java │ │ ├── HandsetBrand.java │ │ ├── HandsetBrandM.java │ │ ├── HandsetBrandN.java │ │ ├── HandsetData.java │ │ ├── HandsetGame.java │ │ └── HandsetSoft.java │ │ ├── builder │ │ ├── Person.java │ │ ├── PersonBuilder.java │ │ ├── PersonDirector.java │ │ ├── PersonFatBuilder.java │ │ └── PersonThinBuilder.java │ │ ├── chainofresponsibility │ │ ├── CommonManager.java │ │ ├── GeneralManager.java │ │ ├── Majordomo.java │ │ ├── Manager.java │ │ ├── Request.java │ │ └── RequestData.java │ │ ├── command │ │ ├── BakeChickenWingCommand.java │ │ ├── BakeMuttonCommand.java │ │ ├── Barbecuer.java │ │ ├── Command.java │ │ ├── CommandData.java │ │ └── Waiter.java │ │ ├── composite │ │ ├── Company.java │ │ ├── ConcreteCompany.java │ │ ├── Database.java │ │ ├── Duty.java │ │ ├── FinanceCompany.java │ │ └── HRCompany.java │ │ ├── decorator │ │ ├── BigTrouser.java │ │ ├── Finery.java │ │ ├── LeatherShoes.java │ │ ├── Person.java │ │ ├── Sneakers.java │ │ ├── Suit.java │ │ ├── TShirts.java │ │ └── Tie.java │ │ ├── facade │ │ ├── Fund.java │ │ ├── NationalDept.java │ │ ├── Realty.java │ │ └── Stock.java │ │ ├── factorymethod │ │ ├── IFactory.java │ │ ├── LeiFeng.java │ │ ├── Undergraduate.java │ │ ├── UndergraduateFactory.java │ │ ├── Volunteer.java │ │ └── VolunteerFactory.java │ │ ├── flyweight │ │ ├── ConcreteWebsite.java │ │ ├── UseData.java │ │ ├── User.java │ │ ├── Website.java │ │ ├── WebsiteFactory.java │ │ └── circle │ │ │ ├── Circle.java │ │ │ ├── FlyweightPatternDemo.java │ │ │ ├── README.md │ │ │ ├── Shape.java │ │ │ └── ShapeFactory.java │ │ ├── interpreter │ │ ├── Expression.java │ │ ├── Note.java │ │ ├── PlayContext.java │ │ ├── PlayData.java │ │ ├── Scale.java │ │ └── Speed.java │ │ ├── iterator │ │ ├── Aggregate.java │ │ ├── ConcreteAggregate.java │ │ ├── ConcreteIterator.java │ │ ├── ConcreteIteratorDesc.java │ │ └── Iterator.java │ │ ├── mediator │ │ ├── Country.java │ │ ├── Iran.java │ │ ├── MessageData.java │ │ ├── USA.java │ │ ├── UnitedNations.java │ │ └── UnitedNationsSecurityCouncil.java │ │ ├── memento │ │ ├── GameRole.java │ │ ├── RoleStateCaretaker.java │ │ └── RoleStateMemento.java │ │ ├── observer │ │ ├── Boss.java │ │ ├── NBAObserver.java │ │ ├── Observer.java │ │ ├── StockObserver.java │ │ └── Subject.java │ │ ├── prototype │ │ ├── Prize.java │ │ ├── Resume.java │ │ └── WorkExperience.java │ │ ├── proxy │ │ ├── GiveGift.java │ │ ├── Proxy.java │ │ ├── Pursuit.java │ │ └── SchoolGirl.java │ │ ├── simplefactory │ │ ├── Operation.java │ │ ├── OperationAddition.java │ │ ├── OperationDivision.java │ │ ├── OperationFactory.java │ │ ├── OperationMultiplication.java │ │ ├── OperationSubtraction.java │ │ └── README.md │ │ ├── singleton │ │ ├── Hungry.java │ │ └── Lazy.java │ │ ├── state │ │ ├── AfternoonState.java │ │ ├── EveningState.java │ │ ├── ForenoonState.java │ │ ├── NoonState.java │ │ ├── RestState.java │ │ ├── SleepingState.java │ │ ├── State.java │ │ └── Work.java │ │ ├── strategy │ │ ├── CashContext.java │ │ ├── CashNormal.java │ │ ├── CashRebate.java │ │ ├── CashReturn.java │ │ └── CashSuper.java │ │ ├── templatemethod │ │ ├── TestPaper.java │ │ ├── TestPaperA.java │ │ └── TestPaperB.java │ │ └── visitor │ │ ├── Action.java │ │ ├── Amativeness.java │ │ ├── ConclusionData.java │ │ ├── Failing.java │ │ ├── Man.java │ │ ├── Marriage.java │ │ ├── ObjectStructure.java │ │ ├── Person.java │ │ ├── Success.java │ │ └── Woman.java └── resources │ ├── book │ └── 大话设计模式(带目录完整版).pdf │ └── uml │ ├── AbstractfactoryUml.png │ ├── AbstractfactoryUml.puml │ ├── AdapterUml.png │ ├── AdapterUml.puml │ ├── BridgeUml.png │ ├── BridgeUml.puml │ ├── BuilderUml.png │ ├── BuilderUml.puml │ ├── ChainofresponsibilityUml.png │ ├── ChainofresponsibilityUml.puml │ ├── CommandUml.png │ ├── CommandUml.puml │ ├── CompositeUml.png │ ├── CompositeUml.puml │ ├── DecoratorUml.png │ ├── DecoratorUml.puml │ ├── FacadeUml.png │ ├── FacadeUml.puml │ ├── FactoryMethodUml.png │ ├── FactoryMethodUml.puml │ ├── FlyweightUml.png │ ├── FlyweightUml.puml │ ├── InterpreterUml.png │ ├── InterpreterUml.puml │ ├── IteratorUml.png │ ├── IteratorUml.puml │ ├── MediatorUml.png │ ├── MediatorUml.puml │ ├── MementoUml.png │ ├── MementoUml.puml │ ├── ObserverUml.png │ ├── ObserverUml.puml │ ├── PrototypeUml.png │ ├── PrototypeUml.puml │ ├── ProxyUml.png │ ├── ProxyUml.puml │ ├── SimplefactoryUml.png │ ├── SimplefactoryUml.puml │ ├── SingletonUml.png │ ├── SingletonUml.puml │ ├── StateUml.png │ ├── StateUml.puml │ ├── StrategyUml.png │ ├── StrategyUml.puml │ ├── TemplatemethodUml.png │ ├── TemplatemethodUml.puml │ ├── VisitorUml.png │ └── VisitorUml.puml └── test └── java └── com └── job └── designpattern ├── abstractfactory └── AbstractFactoryTest.java ├── adapter └── AdapterTest.java ├── bridge └── BridgeTest.java ├── builder └── BuilderTest.java ├── chainofresponsibility └── Chainofresponsibility.java ├── command └── CommandTest.java ├── composite └── CompositeTest.java ├── decorator └── DecoratorTest.java ├── facade └── FacadeTest.java ├── factorymethod └── FactoryMethodTest.java ├── flyweight └── FlyweightTest.java ├── interpreter └── InterpreterTest.java ├── iterator └── IteratorTest.java ├── mediator └── MediatorTest.java ├── memento └── MementoTest.java ├── observer └── ObserverTest.java ├── prototyple └── PrototypeTest.java ├── proxy └── ProxyTest.java ├── simplefactory └── SimpleFactoryTest.java ├── singleton └── SingletonTest.java ├── state └── StateTest.java ├── strategy └── StrategyTest.java ├── templatemethod └── TemplateMethodTest.java └── visitor └── VisitorTest.java /.gitignore: -------------------------------------------------------------------------------- 1 | .idea 2 | design-pattern.iml 3 | target/ -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Design Pattern 2 | 3 | [![Join the chat at https://gitter.im/design-p/Lobby](https://badges.gitter.im/design-p/Lobby.svg)](https://gitter.im/design-p/Lobby?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) 4 | [![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat-square)](http://makeapullrequest.com) 5 | 6 | ##### 该项目包含了所列举的设计模式 7 | * [代码实现](https://github.com/ToryZhou/design-pattern/tree/master/src/main/java/com/job/designpattern) 8 | * [类图源文件](https://github.com/ToryZhou/design-pattern/tree/master/src/main/resources/uml) 9 | * [单元测试](https://github.com/ToryZhou/design-pattern/tree/master/src/test/java/com/job/designpattern) 10 | 11 | ##### 原则 12 | - 单一职责原则,就一个类而言,应该仅有一个引起它变化的原因 13 | - 开放-封闭原则,软件实体(类、模块、函数等等)可以扩展,但是不可以修改 14 | - 依赖倒转原则,高层模块不应该依赖低层模块,都应该依赖抽象。抽象不应该依赖细节,细节应该依赖抽象 15 | - 里氏代换原则,子类必须能替换掉它们的父类型 16 | - 迪米特法则,也叫最少知识原则,如果两个类不必彼此直接通信,那么这两个类就不应当发生直接的相互作用。如果其中一个类需要调用另一个类的某一个方法的话,可以通过第三者转发这个调用 17 | - 合成/聚合复用原则(CARP),尽量使用合成/聚合,尽量不要使用类继承 18 | 19 | ##### 设计模式种类 20 | 1. [简单工厂模式(Simple Factory)](https://github.com/ToryZhou/design-pattern/tree/master/src/main/java/com/job/designpattern/simplefactory), 21 | 它是由一个工厂对象决定创建出哪一种产品类的实例,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一。 22 | ![Simple Factory](https://github.com/ToryZhou/design-pattern/raw/master/src/main/resources/uml/SimplefactoryUml.png) 23 | 24 | 2. [策略模式(Strategy)](https://github.com/ToryZhou/design-pattern/tree/master/src/main/java/com/job/designpattern/strategy), 25 | 它定义了算法家族,分别封装起来,让它们之间可以相互替换,此模式让算法的变化,不会影响到使用算法的客户。 26 | ![Strategy](https://github.com/ToryZhou/design-pattern/raw/master/src/main/resources/uml/StrategyUml.png) 27 | 28 | 3. [装饰模式(Decorator)](https://github.com/ToryZhou/design-pattern/tree/master/src/main/java/com/job/designpattern/decorator), 29 | 动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活。 30 | ![Decorator](https://github.com/ToryZhou/design-pattern/raw/master/src/main/resources/uml/DecoratorUml.png) 31 | 32 | 4. [代理模式(Proxy)](https://github.com/ToryZhou/design-pattern/tree/master/src/main/java/com/job/designpattern/proxy), 33 | 为其他对象提供一种代理以控制对这个对象的访问。 34 | ![Proxy](https://github.com/ToryZhou/design-pattern/raw/master/src/main/resources/uml/ProxyUml.png) 35 | 36 | 5. [工厂方法模式(Factory Method)](https://github.com/ToryZhou/design-pattern/tree/master/src/main/java/com/job/designpattern/factorymethod), 37 | 定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到它的子类。 38 | ![Factory Method](https://github.com/ToryZhou/design-pattern/raw/master/src/main/resources/uml/FactoryMethodUml.png) 39 | 40 | 6. [原型模式(Prototype)](https://github.com/ToryZhou/design-pattern/tree/master/src/main/java/com/job/designpattern/prototype), 41 | 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。 42 | ![Prototype](https://github.com/ToryZhou/design-pattern/raw/master/src/main/resources/uml/PrototypeUml.png) 43 | 44 | 7. [模板方法模式(Template Method)](https://github.com/ToryZhou/design-pattern/tree/master/src/main/java/com/job/designpattern/templatemethod), 45 | 定义一个操作中的算法骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可以重定义该算法的某些特定步骤。 46 | ![Template Method](https://github.com/ToryZhou/design-pattern/raw/master/src/main/resources/uml/TemplatemethodUml.png) 47 | 48 | 8. [外观模式(Facade)](https://github.com/ToryZhou/design-pattern/tree/master/src/main/java/com/job/designpattern/facade), 49 | 又叫门面模式,为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。 50 | ![Facade](https://github.com/ToryZhou/design-pattern/raw/master/src/main/resources/uml/FacadeUml.png) 51 | 52 | 9. [建造者模式(Builder)](https://github.com/ToryZhou/design-pattern/tree/master/src/main/java/com/job/designpattern/builder), 53 | 又叫生成器模式,将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。 54 | ![Builder](https://github.com/ToryZhou/design-pattern/raw/master/src/main/resources/uml/BuilderUml.png) 55 | 56 | 10. [观察者模式(Observer)](https://github.com/ToryZhou/design-pattern/tree/master/src/main/java/com/job/designpattern/observer), 57 | 又叫发布-订阅模式(Publish/Subscribe), 定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。 58 | ![Observer](https://github.com/ToryZhou/design-pattern/raw/master/src/main/resources/uml/ObserverUml.png) 59 | 60 | 11. [抽象工厂模式(Abstract Factory)](https://github.com/ToryZhou/design-pattern/tree/master/src/main/java/com/job/designpattern/abstractfactory), 61 | 提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。 62 | ![Abstract Factory](https://github.com/ToryZhou/design-pattern/raw/master/src/main/resources/uml/AbstractfactoryUml.png) 63 | 64 | 12. [状态模式(State)](https://github.com/ToryZhou/design-pattern/tree/master/src/main/java/com/job/designpattern/state), 65 | 当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。 66 | ![State](https://github.com/ToryZhou/design-pattern/raw/master/src/main/resources/uml/StateUml.png) 67 | 68 | 13. [适配器模式(Adapter)](https://github.com/ToryZhou/design-pattern/tree/master/src/main/java/com/job/designpattern/adapter), 69 | 将一个类的接口转换为客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以在一起工作。 70 | ![Adapter](https://github.com/ToryZhou/design-pattern/raw/master/src/main/resources/uml/AdapterUml.png) 71 | 72 | 14. [备忘录模式(Memento)](https://github.com/ToryZhou/design-pattern/tree/master/src/main/java/com/job/designpattern/memento), 73 | 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样就可将该对象恢复到原先保存的状态。 74 | ![Memento](https://github.com/ToryZhou/design-pattern/raw/master/src/main/resources/uml/MementoUml.png) 75 | 76 | 15. [组合模式(Composite)](https://github.com/ToryZhou/design-pattern/tree/master/src/main/java/com/job/designpattern/composite), 77 | 将对象组合成树形结构以表示‘部分-整体’的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。 78 | ![Composite](https://github.com/ToryZhou/design-pattern/raw/master/src/main/resources/uml/CompositeUml.png) 79 | 80 | 16. [迭代器模式(Iterator)](https://github.com/ToryZhou/design-pattern/tree/master/src/main/java/com/job/designpattern/iterator), 81 | 提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示。 82 | ![Iterator](https://github.com/ToryZhou/design-pattern/raw/master/src/main/resources/uml/IteratorUml.png) 83 | 84 | 17. [单例模式(Singleton)](https://github.com/ToryZhou/design-pattern/tree/master/src/main/java/com/job/designpattern/singleton), 85 | 保证一个类仅有一个实例,并且提供一个访问它的全局访问点。 86 | ![Singleton](https://github.com/ToryZhou/design-pattern/raw/master/src/main/resources/uml/SingletonUml.png) 87 | 88 | 18. [桥接模式(Bridge)](https://github.com/ToryZhou/design-pattern/tree/master/src/main/java/com/job/designpattern/bridge), 89 | 将抽象部分与它的实现部分分离,使它们都可以独立地变化。 90 | ![Bridge](https://github.com/ToryZhou/design-pattern/raw/master/src/main/resources/uml/BridgeUml.png) 91 | 92 | 19. [命令模式(Command)](https://github.com/ToryZhou/design-pattern/tree/master/src/main/java/com/job/designpattern/command), 93 | 将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。 94 | ![Command](https://github.com/ToryZhou/design-pattern/raw/master/src/main/resources/uml/CommandUml.png) 95 | 96 | 20. [职责链模式(Chain of Responsibility)](https://github.com/ToryZhou/design-pattern/tree/master/src/main/java/com/job/designpattern/chainofresponsibility), 97 | 使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,知道有一个对象处理它为止。 98 | ![Chain of Responsibility](https://github.com/ToryZhou/design-pattern/raw/master/src/main/resources/uml/ChainofresponsibilityUml.png) 99 | 100 | 21. [中介者模式(Mediator)](https://github.com/ToryZhou/design-pattern/tree/master/src/main/java/com/job/designpattern/mediator), 101 | 又叫调停者模式,用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显示地相互作用,从而使其耦合松散,而且可以独立地改变它们之间的交互。 102 | ![Mediator](https://github.com/ToryZhou/design-pattern/raw/master/src/main/resources/uml/MediatorUml.png) 103 | 104 | 22. [亨元模式(Flyweight)](https://github.com/ToryZhou/design-pattern/tree/master/src/main/java/com/job/designpattern/flyweight), 105 | 运用共享技术有效地支持大量细粒度的对象。 106 | ![Flyweight](https://github.com/ToryZhou/design-pattern/raw/master/src/main/resources/uml/FlyweightUml.png) 107 | 108 | 23. [解释器模式(Interpreter)](https://github.com/ToryZhou/design-pattern/tree/master/src/main/java/com/job/designpattern/interpreter), 109 | 给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。 110 | ![Interpreter](https://github.com/ToryZhou/design-pattern/raw/master/src/main/resources/uml/InterpreterUml.png) 111 | 112 | 24. [访问者模式(Visitor)](https://github.com/ToryZhou/design-pattern/tree/master/src/main/java/com/job/designpattern/visitor), 113 | 表示一个作用于某对象结构中的各元素的操作。可以在不改变各元素的类的前提下定义作用于这些元素的新操作。 114 | ![Visitor](https://github.com/ToryZhou/design-pattern/raw/master/src/main/resources/uml/VisitorUml.png) 115 | ``` 116 | 说明: 117 | UML类图使用 Idea PlantUML plugin 118 | 同时需要下载安装 [graphviz](https://graphviz.gitlab.io/download/) 119 | 需要安装graphviz到默认目录 [参考说明](http://plantuml.com/graphviz-dot) 120 | 121 | ubuntu需要 122 | sudo apt install graphviz 123 | ``` 124 | -------------------------------------------------------------------------------- /pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 4.0.0 6 | 7 | com.job 8 | design-pattern 9 | 1.0-SNAPSHOT 10 | 11 | 12 | 13 | org.apache.maven.plugins 14 | maven-compiler-plugin 15 | 16 | 8 17 | 8 18 | 19 | 20 | 21 | 22 | 23 | 24 | junit 25 | junit 26 | 4.13.1 27 | test 28 | 29 | 30 | org.projectlombok 31 | lombok 32 | 1.16.20 33 | provided 34 | 35 | 36 | 37 | 38 | -------------------------------------------------------------------------------- /src/main/java/com/job/designpattern/abstractfactory/Access.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.abstractfactory; 2 | 3 | import java.util.HashMap; 4 | import java.util.Map; 5 | 6 | 7 | public class Access { 8 | 9 | private static Access access = new Access(); 10 | 11 | private Map userMap; 12 | private Map departmentMap; 13 | 14 | private Access() { 15 | this.userMap = new HashMap<>(); 16 | this.departmentMap = new HashMap<>(); 17 | } 18 | 19 | public synchronized static Access getInstance() { 20 | return access; 21 | } 22 | 23 | public Map getUserMap() { 24 | return userMap; 25 | } 26 | 27 | public void setUserMap(Map userMap) { 28 | this.userMap = userMap; 29 | } 30 | 31 | public Map getDepartmentMap() { 32 | return departmentMap; 33 | } 34 | 35 | public void setDepartmentMap(Map departmentMap) { 36 | this.departmentMap = departmentMap; 37 | } 38 | 39 | public void addUser(User user) { 40 | this.userMap.put(user.getId(), user); 41 | } 42 | 43 | public User getUser(String id) { 44 | return this.userMap.get(id); 45 | } 46 | 47 | public void addDepartment(Department department) { 48 | this.departmentMap.put(department.getId(), department); 49 | } 50 | 51 | public Department getDepartment(String id) { 52 | return this.departmentMap.get(id); 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /src/main/java/com/job/designpattern/abstractfactory/AccessDepartment.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.abstractfactory; 2 | 3 | public class AccessDepartment implements IDepartment { 4 | @Override 5 | public void insert(Department department) { 6 | Access.getInstance().addDepartment(department); 7 | } 8 | 9 | @Override 10 | public Department get(String id) { 11 | return Access.getInstance().getDepartment(id); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/main/java/com/job/designpattern/abstractfactory/AccessFactory.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.abstractfactory; 2 | 3 | public class AccessFactory implements IFactory { 4 | @Override 5 | public IUser createUser() { 6 | return new AccessUser(); 7 | } 8 | 9 | @Override 10 | public IDepartment createDepartment() { 11 | return new AccessDepartment(); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/main/java/com/job/designpattern/abstractfactory/AccessUser.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.abstractfactory; 2 | 3 | public class AccessUser implements IUser { 4 | @Override 5 | public void insert(User user) { 6 | Access.getInstance().addUser(user); 7 | } 8 | 9 | @Override 10 | public User get(String id) { 11 | return Access.getInstance().getUser(id); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/main/java/com/job/designpattern/abstractfactory/Department.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.abstractfactory; 2 | 3 | import lombok.Data; 4 | 5 | @Data 6 | public class Department { 7 | private String id; 8 | private String name; 9 | 10 | public Department(String id, String name) { 11 | this.id = id; 12 | this.name = name; 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/main/java/com/job/designpattern/abstractfactory/IDepartment.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.abstractfactory; 2 | 3 | public interface IDepartment { 4 | void insert(Department department); 5 | 6 | Department get(String id); 7 | } 8 | -------------------------------------------------------------------------------- /src/main/java/com/job/designpattern/abstractfactory/IFactory.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.abstractfactory; 2 | 3 | public interface IFactory { 4 | IUser createUser(); 5 | 6 | IDepartment createDepartment(); 7 | } 8 | -------------------------------------------------------------------------------- /src/main/java/com/job/designpattern/abstractfactory/IUser.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.abstractfactory; 2 | 3 | public interface IUser { 4 | void insert(User user); 5 | 6 | User get(String id); 7 | } 8 | -------------------------------------------------------------------------------- /src/main/java/com/job/designpattern/abstractfactory/SqlServer.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.abstractfactory; 2 | 3 | import java.util.HashMap; 4 | import java.util.Map; 5 | 6 | 7 | public class SqlServer { 8 | 9 | private static SqlServer sqlServer = new SqlServer(); 10 | 11 | private Map userMap; 12 | private Map departmentMap; 13 | 14 | private SqlServer() { 15 | this.userMap = new HashMap<>(); 16 | this.departmentMap = new HashMap<>(); 17 | } 18 | 19 | public synchronized static SqlServer getInstance() { 20 | return sqlServer; 21 | } 22 | 23 | public Map getUserMap() { 24 | return userMap; 25 | } 26 | 27 | public void setUserMap(Map userMap) { 28 | this.userMap = userMap; 29 | } 30 | 31 | public Map getDepartmentMap() { 32 | return departmentMap; 33 | } 34 | 35 | public void setDepartmentMap(Map departmentMap) { 36 | this.departmentMap = departmentMap; 37 | } 38 | 39 | public void addUser(User user) { 40 | this.userMap.put(user.getId(), user); 41 | } 42 | 43 | public User getUser(String id) { 44 | return this.userMap.get(id); 45 | } 46 | 47 | public void addDepartment(Department department) { 48 | this.departmentMap.put(department.getId(), department); 49 | } 50 | 51 | public Department getDepartment(String id) { 52 | return this.departmentMap.get(id); 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /src/main/java/com/job/designpattern/abstractfactory/SqlServerDepartment.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.abstractfactory; 2 | 3 | public class SqlServerDepartment implements IDepartment { 4 | @Override 5 | public void insert(Department department) { 6 | SqlServer.getInstance().addDepartment(department); 7 | } 8 | 9 | @Override 10 | public Department get(String id) { 11 | return SqlServer.getInstance().getDepartment(id); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/main/java/com/job/designpattern/abstractfactory/SqlServerFactory.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.abstractfactory; 2 | 3 | public class SqlServerFactory implements IFactory { 4 | @Override 5 | public IUser createUser() { 6 | return new SqlServerUser(); 7 | } 8 | 9 | @Override 10 | public IDepartment createDepartment() { 11 | return new SqlServerDepartment(); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/main/java/com/job/designpattern/abstractfactory/SqlServerUser.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.abstractfactory; 2 | 3 | public class SqlServerUser implements IUser { 4 | @Override 5 | public void insert(User user) { 6 | SqlServer.getInstance().addUser(user); 7 | } 8 | 9 | @Override 10 | public User get(String id) { 11 | return SqlServer.getInstance().getUser(id); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/main/java/com/job/designpattern/abstractfactory/User.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.abstractfactory; 2 | 3 | import lombok.Data; 4 | 5 | @Data 6 | public class User { 7 | private String id; 8 | private String name; 9 | 10 | public User(String id, String name) { 11 | this.id = id; 12 | this.name = name; 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/main/java/com/job/designpattern/adapter/Action.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.adapter; 2 | 3 | import lombok.Data; 4 | 5 | import java.util.UUID; 6 | 7 | @Data 8 | public class Action { 9 | private String id; 10 | private String name; 11 | private String clazz; 12 | private String method; 13 | 14 | 15 | public Action(String name, String clazz, String method) { 16 | this.id = UUID.randomUUID().toString(); 17 | this.name = name; 18 | this.clazz = clazz; 19 | this.method = method; 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/main/java/com/job/designpattern/adapter/Database.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.adapter; 2 | 3 | import java.util.HashMap; 4 | import java.util.Map; 5 | 6 | @Deprecated 7 | public class Database { 8 | 9 | private static Database database = new Database(); 10 | 11 | private Map actionMap; 12 | 13 | private Database() { 14 | this.actionMap = new HashMap<>(); 15 | } 16 | 17 | public synchronized static Database getInstance() { 18 | return database; 19 | } 20 | 21 | public void addAction(Action action) { 22 | this.actionMap.put(action.getId(), action); 23 | } 24 | 25 | public Action getAction(String id) { 26 | return this.actionMap.get(id); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/com/job/designpattern/adapter/ForeignCenter.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.adapter; 2 | 3 | public class ForeignCenter { 4 | 5 | private String name; 6 | 7 | public ForeignCenter(String name) { 8 | this.name = name; 9 | } 10 | 11 | public Action attackForeign() { 12 | return new Action(this.name, Thread.currentThread().getStackTrace()[1].getClassName(), Thread.currentThread().getStackTrace()[1].getMethodName()); 13 | } 14 | 15 | public Action defenseForeign() { 16 | return new Action(this.name, Thread.currentThread().getStackTrace()[1].getClassName(), Thread.currentThread().getStackTrace()[1].getMethodName()); 17 | } 18 | 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/com/job/designpattern/adapter/Forwards.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.adapter; 2 | 3 | public class Forwards extends Player { 4 | 5 | public Forwards(String name) { 6 | super(name); 7 | } 8 | 9 | @Override 10 | public Action attack() { 11 | return new Action(super.name, Thread.currentThread().getStackTrace()[1].getClassName(), Thread.currentThread().getStackTrace()[1].getMethodName()); 12 | } 13 | 14 | @Override 15 | public Action defense() { 16 | return new Action(super.name, Thread.currentThread().getStackTrace()[1].getClassName(), Thread.currentThread().getStackTrace()[1].getMethodName()); 17 | } 18 | 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/com/job/designpattern/adapter/Guards.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.adapter; 2 | 3 | public class Guards extends Player { 4 | 5 | public Guards(String name) { 6 | super(name); 7 | } 8 | 9 | @Override 10 | public Action attack() { 11 | return new Action(super.name, Thread.currentThread().getStackTrace()[1].getClassName(), Thread.currentThread().getStackTrace()[1].getMethodName()); 12 | } 13 | 14 | @Override 15 | public Action defense() { 16 | return new Action(super.name, Thread.currentThread().getStackTrace()[1].getClassName(), Thread.currentThread().getStackTrace()[1].getMethodName()); 17 | } 18 | 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/com/job/designpattern/adapter/Player.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.adapter; 2 | 3 | public abstract class Player { 4 | protected String name; 5 | 6 | public Player(String name) { 7 | this.name = name; 8 | } 9 | 10 | public abstract Action attack(); 11 | 12 | public abstract Action defense(); 13 | 14 | } 15 | -------------------------------------------------------------------------------- /src/main/java/com/job/designpattern/adapter/Translator.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.adapter; 2 | 3 | public class Translator extends Player { 4 | 5 | private ForeignCenter foreignCenter; 6 | 7 | public Translator(String name) { 8 | super(name); 9 | this.foreignCenter = new ForeignCenter(name); 10 | } 11 | 12 | @Override 13 | public Action attack() { 14 | return foreignCenter.attackForeign(); 15 | } 16 | 17 | @Override 18 | public Action defense() { 19 | return foreignCenter.defenseForeign(); 20 | } 21 | 22 | } 23 | -------------------------------------------------------------------------------- /src/main/java/com/job/designpattern/bridge/HandsetAddressList.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.bridge; 2 | 3 | public class HandsetAddressList extends HandsetSoft { 4 | @Override 5 | public void run() { 6 | HandsetData.getInstance().getList().add(this.getClass().getSimpleName()); 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /src/main/java/com/job/designpattern/bridge/HandsetBrand.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.bridge; 2 | 3 | public abstract class HandsetBrand { 4 | protected HandsetSoft handsetSoft; 5 | 6 | public void setHandsetSoft(HandsetSoft handsetSoft) { 7 | this.handsetSoft = handsetSoft; 8 | } 9 | 10 | public abstract void run(); 11 | 12 | } 13 | -------------------------------------------------------------------------------- /src/main/java/com/job/designpattern/bridge/HandsetBrandM.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.bridge; 2 | 3 | public class HandsetBrandM extends HandsetBrand { 4 | @Override 5 | public void run() { 6 | handsetSoft.run(); 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /src/main/java/com/job/designpattern/bridge/HandsetBrandN.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.bridge; 2 | 3 | public class HandsetBrandN extends HandsetBrand { 4 | 5 | @Override 6 | public void run() { 7 | handsetSoft.run(); 8 | } 9 | 10 | } 11 | -------------------------------------------------------------------------------- /src/main/java/com/job/designpattern/bridge/HandsetData.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.bridge; 2 | 3 | import lombok.Getter; 4 | import lombok.Setter; 5 | 6 | import java.util.ArrayList; 7 | import java.util.List; 8 | 9 | public class HandsetData { 10 | private static HandsetData handsetData = new HandsetData(); 11 | 12 | @Getter 13 | @Setter 14 | private List list =new ArrayList<>(); 15 | 16 | private HandsetData() { 17 | } 18 | 19 | public static HandsetData getInstance(){ 20 | return handsetData; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/main/java/com/job/designpattern/bridge/HandsetGame.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.bridge; 2 | 3 | public class HandsetGame extends HandsetSoft { 4 | @Override 5 | public void run() { 6 | HandsetData.getInstance().getList().add(this.getClass().getSimpleName()); 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /src/main/java/com/job/designpattern/bridge/HandsetSoft.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.bridge; 2 | 3 | public abstract class HandsetSoft { 4 | 5 | public abstract void run(); 6 | } 7 | -------------------------------------------------------------------------------- /src/main/java/com/job/designpattern/builder/Person.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.builder; 2 | 3 | import lombok.Data; 4 | 5 | @Data 6 | public class Person { 7 | private String head; 8 | private String body; 9 | private String armLeft; 10 | private String armRight; 11 | private String legLeft; 12 | private String legRight; 13 | 14 | public static final String HEAD = "head"; 15 | public static final String BODY = "body"; 16 | public static final String ARM_LEFT = "armLeft"; 17 | public static final String ARM_RIGHT = "armRight"; 18 | public static final String LEG_LEFT = "legLeft"; 19 | public static final String LEG_RIGHT = "legRight"; 20 | 21 | public void drawHead(String characteristic) { 22 | this.head = HEAD + characteristic; 23 | } 24 | 25 | public void drawBody(String characteristic) { 26 | this.body = BODY + characteristic; 27 | } 28 | 29 | public void drawArmLeft(String characteristic) { 30 | this.armLeft = ARM_LEFT + characteristic; 31 | } 32 | 33 | public void drawArmRight(String characteristic) { 34 | this.armRight = ARM_RIGHT + characteristic; 35 | } 36 | 37 | public void drawLegLeft(String characteristic) { 38 | this.legLeft = LEG_LEFT + characteristic; 39 | } 40 | 41 | public void drawLegRight(String characteristic) { 42 | this.legRight = LEG_RIGHT + characteristic; 43 | } 44 | 45 | 46 | } 47 | -------------------------------------------------------------------------------- /src/main/java/com/job/designpattern/builder/PersonBuilder.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.builder; 2 | 3 | public abstract class PersonBuilder { 4 | public abstract void buildHead(); 5 | 6 | public abstract void buildBody(); 7 | 8 | public abstract void buildArmLeft(); 9 | 10 | public abstract void buildArmRight(); 11 | 12 | public abstract void buildLegLeft(); 13 | 14 | public abstract void buildLegRight(); 15 | 16 | public abstract Person getResult(); 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/com/job/designpattern/builder/PersonDirector.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.builder; 2 | 3 | public class PersonDirector { 4 | public void createPerson(PersonBuilder personBuilder) { 5 | personBuilder.buildHead(); 6 | personBuilder.buildBody(); 7 | personBuilder.buildArmLeft(); 8 | personBuilder.buildArmRight(); 9 | personBuilder.buildLegLeft(); 10 | personBuilder.buildLegRight(); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/main/java/com/job/designpattern/builder/PersonFatBuilder.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.builder; 2 | 3 | public class PersonFatBuilder extends PersonBuilder { 4 | public static final String FAT = "Fat"; 5 | 6 | private Person person; 7 | 8 | public PersonFatBuilder() { 9 | this.person = new Person(); 10 | } 11 | 12 | @Override 13 | public void buildHead() { 14 | person.drawHead(FAT); 15 | } 16 | 17 | @Override 18 | public void buildBody() { 19 | person.drawBody(FAT); 20 | } 21 | 22 | @Override 23 | public void buildArmLeft() { 24 | person.drawArmLeft(FAT); 25 | } 26 | 27 | @Override 28 | public void buildArmRight() { 29 | person.drawArmRight(FAT); 30 | } 31 | 32 | @Override 33 | public void buildLegLeft() { 34 | person.drawLegLeft(FAT); 35 | } 36 | 37 | @Override 38 | public void buildLegRight() { 39 | person.drawLegRight(FAT); 40 | } 41 | 42 | @Override 43 | public Person getResult() { 44 | return person; 45 | } 46 | 47 | } 48 | -------------------------------------------------------------------------------- /src/main/java/com/job/designpattern/builder/PersonThinBuilder.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.builder; 2 | 3 | public class PersonThinBuilder extends PersonBuilder { 4 | public static final String THIN = "Thin"; 5 | 6 | private Person person; 7 | 8 | public PersonThinBuilder() { 9 | this.person = new Person(); 10 | } 11 | 12 | @Override 13 | public void buildHead() { 14 | person.drawHead(THIN); 15 | } 16 | 17 | @Override 18 | public void buildBody() { 19 | person.drawBody(THIN); 20 | } 21 | 22 | @Override 23 | public void buildArmLeft() { 24 | person.drawArmLeft(THIN); 25 | } 26 | 27 | @Override 28 | public void buildArmRight() { 29 | person.drawArmRight(THIN); 30 | } 31 | 32 | @Override 33 | public void buildLegLeft() { 34 | person.drawLegLeft(THIN); 35 | } 36 | 37 | @Override 38 | public void buildLegRight() { 39 | person.drawLegRight(THIN); 40 | } 41 | 42 | @Override 43 | public Person getResult() { 44 | return person; 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /src/main/java/com/job/designpattern/chainofresponsibility/CommonManager.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.chainofresponsibility; 2 | 3 | import java.util.Objects; 4 | 5 | public class CommonManager extends Manager { 6 | public CommonManager(String name) { 7 | super(name); 8 | } 9 | 10 | @Override 11 | public void requestApplications(Request request) { 12 | if (Request.REQUEST_TYPE_LEAVE.equals(request.getRequestType()) && request.getNumber() <= 2) { 13 | request.setHandler(this.getClass().getSimpleName()); 14 | request.setStatus(Request.STATUS_YES); 15 | RequestData.getInstance().getRequestList().add(request); 16 | } else if (Objects.nonNull(superior)) { 17 | superior.requestApplications(request); 18 | } 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/com/job/designpattern/chainofresponsibility/GeneralManager.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.chainofresponsibility; 2 | 3 | public class GeneralManager extends Manager { 4 | public GeneralManager(String name) { 5 | super(name); 6 | } 7 | 8 | @Override 9 | public void requestApplications(Request request) { 10 | request.setHandler(this.getClass().getSimpleName()); 11 | if (Request.REQUEST_TYPE_LEAVE.equals(request.getRequestType())) { 12 | request.setStatus(Request.STATUS_YES); 13 | } else if (Request.REQUEST_TYPE_RAISE.equals(request.getRequestType()) && request.getNumber() <= 500) { 14 | request.setStatus(Request.STATUS_YES); 15 | } else if (request.getNumber() > 500) { 16 | request.setStatus(Request.STATUS_NO); 17 | } 18 | RequestData.getInstance().getRequestList().add(request); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/com/job/designpattern/chainofresponsibility/Majordomo.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.chainofresponsibility; 2 | 3 | import java.util.Objects; 4 | 5 | public class Majordomo extends Manager { 6 | public Majordomo(String name) { 7 | super(name); 8 | } 9 | 10 | @Override 11 | public void requestApplications(Request request) { 12 | if (Request.REQUEST_TYPE_LEAVE.equals(request.getRequestType()) && request.getNumber() <= 5) { 13 | request.setHandler(this.getClass().getSimpleName()); 14 | request.setStatus(Request.STATUS_YES); 15 | RequestData.getInstance().getRequestList().add(request); 16 | } else if (Objects.nonNull(superior)) { 17 | superior.requestApplications(request); 18 | } 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/com/job/designpattern/chainofresponsibility/Manager.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.chainofresponsibility; 2 | 3 | public abstract class Manager { 4 | protected String name; 5 | protected Manager superior; 6 | 7 | public Manager(String name) { 8 | this.name = name; 9 | } 10 | 11 | public void setSuperior(Manager superior) { 12 | this.superior = superior; 13 | } 14 | 15 | public abstract void requestApplications(Request request); 16 | } 17 | -------------------------------------------------------------------------------- /src/main/java/com/job/designpattern/chainofresponsibility/Request.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.chainofresponsibility; 2 | 3 | import lombok.Data; 4 | 5 | @Data 6 | public class Request { 7 | private String requestType; 8 | private String requestContent; 9 | private int number; 10 | 11 | private String handler; 12 | 13 | private String status; 14 | 15 | public static String REQUEST_TYPE_LEAVE = "leave"; 16 | public static String REQUEST_TYPE_RAISE = "raise"; 17 | 18 | public static String STATUS_YES = "yes"; 19 | public static String STATUS_NO = "no"; 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/com/job/designpattern/chainofresponsibility/RequestData.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.chainofresponsibility; 2 | 3 | import lombok.Getter; 4 | import lombok.Setter; 5 | 6 | import java.util.ArrayList; 7 | import java.util.List; 8 | 9 | public class RequestData { 10 | 11 | private static RequestData requestData = new RequestData(); 12 | 13 | @Getter 14 | @Setter 15 | private List requestList = new ArrayList<>(); 16 | 17 | private RequestData() { 18 | } 19 | 20 | public static RequestData getInstance() { 21 | return requestData; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/main/java/com/job/designpattern/command/BakeChickenWingCommand.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.command; 2 | 3 | public class BakeChickenWingCommand extends Command { 4 | public BakeChickenWingCommand(Barbecuer barbecuer) { 5 | super(barbecuer); 6 | } 7 | 8 | @Override 9 | public void executeCommand() { 10 | barbecuer.bakeChickenWing(); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/main/java/com/job/designpattern/command/BakeMuttonCommand.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.command; 2 | 3 | public class BakeMuttonCommand extends Command { 4 | 5 | public BakeMuttonCommand(Barbecuer barbecuer) { 6 | super(barbecuer); 7 | } 8 | 9 | @Override 10 | public void executeCommand() { 11 | barbecuer.bakeMutton(); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/main/java/com/job/designpattern/command/Barbecuer.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.command; 2 | 3 | public class Barbecuer { 4 | 5 | public void bakeMutton(){ 6 | String methodName = Thread.currentThread().getStackTrace()[1].getMethodName(); 7 | CommandData.getInstance().getBakeList().add(methodName); 8 | } 9 | 10 | public void bakeChickenWing(){ 11 | String methodName = Thread.currentThread().getStackTrace()[1].getMethodName(); 12 | CommandData.getInstance().getBakeList().add(methodName); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/main/java/com/job/designpattern/command/Command.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.command; 2 | 3 | public abstract class Command { 4 | 5 | protected Barbecuer barbecuer; 6 | 7 | public Command(Barbecuer barbecuer) { 8 | this.barbecuer = barbecuer; 9 | } 10 | 11 | public abstract void executeCommand(); 12 | } 13 | -------------------------------------------------------------------------------- /src/main/java/com/job/designpattern/command/CommandData.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.command; 2 | 3 | import lombok.Getter; 4 | import lombok.Setter; 5 | 6 | import java.util.ArrayList; 7 | import java.util.List; 8 | 9 | public class CommandData { 10 | private static CommandData commandData = new CommandData(); 11 | 12 | @Getter 13 | @Setter 14 | private List bakeList = new ArrayList<>(); 15 | 16 | @Getter 17 | @Setter 18 | private List logList = new ArrayList<>(); 19 | 20 | private CommandData() { 21 | 22 | } 23 | 24 | public static CommandData getInstance() { 25 | return commandData; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/main/java/com/job/designpattern/command/Waiter.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.command; 2 | 3 | import java.util.ArrayList; 4 | import java.util.List; 5 | 6 | public class Waiter { 7 | 8 | private List orders = new ArrayList<>(); 9 | 10 | public void setOrder(Command command) { 11 | if (BakeChickenWingCommand.class.getSimpleName().equals(command.getClass().getSimpleName())) { 12 | CommandData.getInstance().getLogList().add("No chicken wing"); 13 | } else { 14 | orders.add(command); 15 | CommandData.getInstance().getLogList().add(Thread.currentThread().getStackTrace()[1].getMethodName() + command.getClass().getSimpleName()); 16 | } 17 | } 18 | 19 | public void cancelOrder(Command command) { 20 | orders.remove(command); 21 | CommandData.getInstance().getLogList().add(Thread.currentThread().getStackTrace()[1].getMethodName() + command.getClass().getSimpleName()); 22 | } 23 | 24 | public void inform() { 25 | orders.forEach(Command::executeCommand); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/main/java/com/job/designpattern/composite/Company.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.composite; 2 | 3 | public abstract class Company { 4 | protected String name; 5 | 6 | public Company(String name) { 7 | this.name = name; 8 | } 9 | 10 | public abstract void add(Company company); 11 | public abstract void remove(Company company); 12 | public abstract void display(int depth); 13 | public abstract void lineOfDuty(); 14 | 15 | } 16 | -------------------------------------------------------------------------------- /src/main/java/com/job/designpattern/composite/ConcreteCompany.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.composite; 2 | 3 | import java.util.ArrayList; 4 | import java.util.List; 5 | 6 | public class ConcreteCompany extends Company { 7 | private List companyList; 8 | 9 | public ConcreteCompany(String name) { 10 | super(name); 11 | this.companyList = new ArrayList<>(); 12 | } 13 | 14 | @Override 15 | public void add(Company company) { 16 | companyList.add(company); 17 | } 18 | 19 | @Override 20 | public void remove(Company company) { 21 | companyList.remove(company); 22 | } 23 | 24 | @Override 25 | public void display(int depth) { 26 | Database.getInstance().addDuty(new Duty(this.name, depth)); 27 | companyList.forEach(item -> item.display(depth + 2)); 28 | } 29 | 30 | @Override 31 | public void lineOfDuty() { 32 | companyList.forEach(Company::lineOfDuty); 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /src/main/java/com/job/designpattern/composite/Database.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.composite; 2 | 3 | import java.util.HashMap; 4 | import java.util.Map; 5 | 6 | public class Database { 7 | 8 | private static Database database = new Database(); 9 | 10 | private Map dutyMap; 11 | 12 | private Database() { 13 | this.dutyMap = new HashMap<>(); 14 | } 15 | 16 | public synchronized static Database getInstance() { 17 | return database; 18 | } 19 | 20 | public void addDuty(Duty duty) { 21 | this.dutyMap.put(duty.getCompanyName(), duty); 22 | } 23 | 24 | public Duty getDuty(String companyName) { 25 | return this.dutyMap.get(companyName); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/main/java/com/job/designpattern/composite/Duty.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.composite; 2 | 3 | import lombok.Data; 4 | 5 | @Data 6 | public class Duty { 7 | private String companyName; 8 | private int depth; 9 | private String dutyName; 10 | 11 | public Duty(String companyName, int depth) { 12 | this.companyName = companyName; 13 | this.depth = depth; 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/main/java/com/job/designpattern/composite/FinanceCompany.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.composite; 2 | 3 | public class FinanceCompany extends Company { 4 | 5 | public FinanceCompany(String name) { 6 | super(name); 7 | } 8 | 9 | @Override 10 | public void add(Company company) { 11 | } 12 | 13 | @Override 14 | public void remove(Company company) { 15 | } 16 | 17 | @Override 18 | public void display(int depth) { 19 | Database.getInstance().addDuty(new Duty(this.name, depth)); 20 | } 21 | 22 | @Override 23 | public void lineOfDuty() { 24 | Database.getInstance().getDuty(this.name).setDutyName(this.getClass().getSimpleName()); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/main/java/com/job/designpattern/composite/HRCompany.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.composite; 2 | 3 | import java.util.ArrayList; 4 | import java.util.List; 5 | 6 | public class HRCompany extends Company { 7 | 8 | public HRCompany(String name) { 9 | super(name); 10 | } 11 | 12 | @Override 13 | public void add(Company company) { 14 | } 15 | 16 | @Override 17 | public void remove(Company company) { 18 | } 19 | 20 | @Override 21 | public void display(int depth) { 22 | Database.getInstance().addDuty(new Duty(this.name, depth)); 23 | } 24 | 25 | @Override 26 | public void lineOfDuty() { 27 | Database.getInstance().getDuty(this.name).setDutyName(this.getClass().getSimpleName()); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /src/main/java/com/job/designpattern/decorator/BigTrouser.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.decorator; 2 | 3 | import java.util.List; 4 | 5 | public class BigTrouser extends Finery { 6 | 7 | @Override 8 | public void show() { 9 | System.out.println(this.getClass().getSimpleName()); 10 | super.show(); 11 | } 12 | 13 | @Override 14 | public List putOn(List fineryList) { 15 | fineryList.add(this.getClass().getSimpleName()); 16 | return super.putOn(fineryList); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/com/job/designpattern/decorator/Finery.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.decorator; 2 | 3 | import java.util.List; 4 | 5 | public class Finery extends Person { 6 | 7 | protected Person component; 8 | 9 | public void decorate(Person component) { 10 | this.component = component; 11 | } 12 | 13 | @Override 14 | public void show() { 15 | component.show(); 16 | } 17 | 18 | @Override 19 | public List putOn(List fineryList) { 20 | return component.putOn(fineryList); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/main/java/com/job/designpattern/decorator/LeatherShoes.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.decorator; 2 | 3 | import java.util.List; 4 | 5 | public class LeatherShoes extends Finery { 6 | 7 | @Override 8 | public void show() { 9 | System.out.println(this.getClass().getSimpleName()); 10 | super.show(); 11 | } 12 | 13 | @Override 14 | public List putOn(List fineryList) { 15 | fineryList.add(this.getClass().getSimpleName()); 16 | return super.putOn(fineryList); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/com/job/designpattern/decorator/Person.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.decorator; 2 | 3 | import lombok.Getter; 4 | 5 | import java.util.List; 6 | 7 | public class Person { 8 | 9 | @Getter 10 | private String name; 11 | 12 | public Person() { 13 | } 14 | 15 | public Person(String name) { 16 | this.name = name; 17 | } 18 | 19 | public void show() { 20 | System.out.println("装扮的 " + name); 21 | } 22 | 23 | public List putOn(List fineryList) { 24 | fineryList.add(Person.class.getSimpleName()); 25 | return fineryList; 26 | } 27 | 28 | 29 | } 30 | -------------------------------------------------------------------------------- /src/main/java/com/job/designpattern/decorator/Sneakers.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.decorator; 2 | 3 | import java.util.List; 4 | 5 | public class Sneakers extends Finery { 6 | 7 | @Override 8 | public void show() { 9 | System.out.println(this.getClass().getSimpleName()); 10 | super.show(); 11 | } 12 | 13 | @Override 14 | public List putOn(List fineryList) { 15 | fineryList.add(this.getClass().getSimpleName()); 16 | return super.putOn(fineryList); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/com/job/designpattern/decorator/Suit.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.decorator; 2 | 3 | import java.util.List; 4 | 5 | public class Suit extends Finery { 6 | 7 | @Override 8 | public void show() { 9 | System.out.println(this.getClass().getSimpleName()); 10 | super.show(); 11 | } 12 | 13 | @Override 14 | public List putOn(List fineryList) { 15 | fineryList.add(this.getClass().getSimpleName()); 16 | return super.putOn(fineryList); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/com/job/designpattern/decorator/TShirts.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.decorator; 2 | 3 | import java.util.List; 4 | 5 | public class TShirts extends Finery { 6 | 7 | @Override 8 | public void show() { 9 | System.out.println(this.getClass().getSimpleName()); 10 | super.show(); 11 | } 12 | 13 | @Override 14 | public List putOn(List fineryList) { 15 | fineryList.add(this.getClass().getSimpleName()); 16 | return super.putOn(fineryList); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/com/job/designpattern/decorator/Tie.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.decorator; 2 | 3 | import java.util.List; 4 | 5 | public class Tie extends Finery { 6 | 7 | @Override 8 | public void show() { 9 | System.out.println(this.getClass().getSimpleName()); 10 | super.show(); 11 | } 12 | 13 | @Override 14 | public List putOn(List fineryList) { 15 | fineryList.add(this.getClass().getSimpleName()); 16 | return super.putOn(fineryList); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/com/job/designpattern/facade/Fund.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.facade; 2 | 3 | import java.util.List; 4 | 5 | public class Fund { 6 | 7 | private NationalDept nationalDept; 8 | private Realty realty; 9 | private Stock stock; 10 | 11 | public Fund() { 12 | this.nationalDept = new NationalDept(); 13 | this.realty = new Realty(); 14 | this.stock = new Stock(); 15 | } 16 | 17 | public void buyFund(List assetList) { 18 | nationalDept.buy(assetList); 19 | realty.buy(assetList); 20 | stock.buy(assetList); 21 | } 22 | 23 | public void sellFund(List assetList) { 24 | nationalDept.sell(assetList); 25 | realty.sell(assetList); 26 | stock.sell(assetList); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/com/job/designpattern/facade/NationalDept.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.facade; 2 | 3 | import java.util.List; 4 | 5 | public class NationalDept { 6 | 7 | public void buy(List assetList) { 8 | assetList.add(this.getClass().getSimpleName()); 9 | } 10 | 11 | public void sell(List assetList) { 12 | assetList.remove(this.getClass().getSimpleName()); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/main/java/com/job/designpattern/facade/Realty.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.facade; 2 | 3 | import java.util.List; 4 | 5 | public class Realty { 6 | 7 | public void buy(List assetList) { 8 | assetList.add(this.getClass().getSimpleName()); 9 | } 10 | 11 | public void sell(List assetList) { 12 | assetList.remove(this.getClass().getSimpleName()); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/main/java/com/job/designpattern/facade/Stock.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.facade; 2 | 3 | import java.util.List; 4 | 5 | public class Stock { 6 | public void buy(List assetList) { 7 | assetList.add(this.getClass().getSimpleName()); 8 | } 9 | 10 | public void sell(List assetList) { 11 | assetList.remove(this.getClass().getSimpleName()); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/main/java/com/job/designpattern/factorymethod/IFactory.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.factorymethod; 2 | 3 | public interface IFactory { 4 | LeiFeng createLeiFeng(); 5 | } 6 | -------------------------------------------------------------------------------- /src/main/java/com/job/designpattern/factorymethod/LeiFeng.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.factorymethod; 2 | 3 | import lombok.Data; 4 | 5 | @Data 6 | public class LeiFeng { 7 | 8 | private boolean doSweep; 9 | private boolean doWash; 10 | private boolean doBuyRice; 11 | private String whichOne; 12 | 13 | public void sweep() { 14 | this.doSweep = true; 15 | } 16 | 17 | public void wash() { 18 | this.doWash = true; 19 | } 20 | 21 | public void buyRice() { 22 | this.doBuyRice = true; 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/main/java/com/job/designpattern/factorymethod/Undergraduate.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.factorymethod; 2 | 3 | public class Undergraduate extends LeiFeng { 4 | 5 | public Undergraduate() { 6 | setWhichOne(this.getClass().getSimpleName()); 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /src/main/java/com/job/designpattern/factorymethod/UndergraduateFactory.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.factorymethod; 2 | 3 | public class UndergraduateFactory implements IFactory { 4 | @Override 5 | public LeiFeng createLeiFeng() { 6 | return new Undergraduate(); 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /src/main/java/com/job/designpattern/factorymethod/Volunteer.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.factorymethod; 2 | 3 | public class Volunteer extends LeiFeng { 4 | public Volunteer() { 5 | setWhichOne(this.getClass().getSimpleName()); 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /src/main/java/com/job/designpattern/factorymethod/VolunteerFactory.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.factorymethod; 2 | 3 | public class VolunteerFactory implements IFactory { 4 | @Override 5 | public LeiFeng createLeiFeng() { 6 | return new Volunteer(); 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /src/main/java/com/job/designpattern/flyweight/ConcreteWebsite.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.flyweight; 2 | 3 | import lombok.Getter; 4 | import lombok.Setter; 5 | 6 | public class ConcreteWebsite extends Website { 7 | 8 | @Getter 9 | @Setter 10 | private String name; 11 | 12 | public ConcreteWebsite(String name) { 13 | this.name = name; 14 | } 15 | 16 | @Override 17 | public void use(User user) { 18 | UseData.getInstance().getList().add(user.getName() + " " + Thread.currentThread().getStackTrace()[1].getMethodName() + " " + this.name); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/com/job/designpattern/flyweight/UseData.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.flyweight; 2 | 3 | import lombok.Getter; 4 | import lombok.Setter; 5 | 6 | import java.util.ArrayList; 7 | import java.util.List; 8 | 9 | public class UseData { 10 | 11 | private static UseData useData = new UseData(); 12 | 13 | @Getter 14 | @Setter 15 | private List list = new ArrayList<>(); 16 | 17 | private UseData() { 18 | } 19 | 20 | public static UseData getInstance(){ 21 | return useData; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/main/java/com/job/designpattern/flyweight/User.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.flyweight; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Data; 5 | 6 | @Data 7 | @AllArgsConstructor 8 | public class User { 9 | private String name; 10 | } 11 | -------------------------------------------------------------------------------- /src/main/java/com/job/designpattern/flyweight/Website.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.flyweight; 2 | 3 | public abstract class Website { 4 | public abstract void use(User user); 5 | } 6 | -------------------------------------------------------------------------------- /src/main/java/com/job/designpattern/flyweight/WebsiteFactory.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.flyweight; 2 | 3 | import java.util.Hashtable; 4 | 5 | public class WebsiteFactory { 6 | 7 | private Hashtable hashtable = new Hashtable<>(); 8 | 9 | public Website getWebsiteCategory(String key) { 10 | if (!hashtable.contains(key)) { 11 | hashtable.put(key, new ConcreteWebsite(key)); 12 | } 13 | return hashtable.get(key); 14 | } 15 | 16 | public int getWebsiteCount(){ 17 | return this.hashtable.size(); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/com/job/designpattern/flyweight/circle/Circle.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.flyweight.circle; 2 | 3 | /** 4 | * @author toryzhou 5 | * @since 10/20/20 6 | */ 7 | public class Circle implements Shape { 8 | private String color; 9 | private int x; 10 | private int y; 11 | private int radius; 12 | 13 | public Circle(String color){ 14 | this.color = color; 15 | } 16 | 17 | public void setX(int x) { 18 | this.x = x; 19 | } 20 | 21 | public void setY(int y) { 22 | this.y = y; 23 | } 24 | 25 | public void setRadius(int radius) { 26 | this.radius = radius; 27 | } 28 | 29 | @Override 30 | public void draw() { 31 | System.out.println("Circle: Draw() [Color : " + color 32 | +", x : " + x +", y :" + y +", radius :" + radius); 33 | } 34 | 35 | // 需要看下x的值 36 | public int getX() { 37 | return x; 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /src/main/java/com/job/designpattern/flyweight/circle/FlyweightPatternDemo.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.flyweight.circle; 2 | 3 | /** 4 | * @author toryzhou 5 | * @since 10/20/20 6 | */ 7 | public class FlyweightPatternDemo { 8 | private static final String colors[] = 9 | { "Red", "Green", "Blue", "White", "Black" }; 10 | public static void main(String[] args) { 11 | 12 | for(int i=0; i < 20; ++i) { 13 | Circle circle = 14 | (Circle)ShapeFactory.getCircle(getRandomColor()); 15 | circle.setX(getRandomX()); 16 | circle.setY(getRandomY()); 17 | circle.setRadius(100); 18 | circle.draw(); 19 | } 20 | 21 | //为了直观展示,所以输出结果看, 看看x的值 22 | Circle circle1 = (Circle)ShapeFactory.getCircle("Red"); 23 | circle1.setX(1); 24 | System.out.println("size: " + ShapeFactory.getCircleMap().size()); 25 | Circle circle2 = (Circle)ShapeFactory.getCircle("Red"); 26 | circle2.setX(2); 27 | System.out.println("size: " + ShapeFactory.getCircleMap().size()); 28 | System.out.println("circle1.getX(): " + circle1.getX()); 29 | System.out.println("circle2.getX(): " + circle2.getX()); 30 | circle1.draw(); 31 | circle2.draw(); 32 | // 结论: x的值是外部状态,是会随着客户端环境变化,所以circle1的 x 的值也改变了 33 | 34 | } 35 | private static String getRandomColor() { 36 | return colors[(int)(Math.random()*colors.length)]; 37 | } 38 | private static int getRandomX() { 39 | return (int)(Math.random()*100 ); 40 | } 41 | private static int getRandomY() { 42 | return (int)(Math.random()*100); 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /src/main/java/com/job/designpattern/flyweight/circle/README.md: -------------------------------------------------------------------------------- 1 | 需要分离出外部状态和内部状态,而且外部状态具有固有化的性质,不应该随着内部状态的变化而变化 2 | 3 | 辅助参考 4 | https://www.cnblogs.com/adamjwh/p/9070107.html 5 | https://baike.baidu.com/item/%E4%BA%AB%E5%85%83%E6%A8%A1%E5%BC%8F/10541959?fr=aladdin 6 | https://blog.csdn.net/hnkfwhw/article/details/84200313 -------------------------------------------------------------------------------- /src/main/java/com/job/designpattern/flyweight/circle/Shape.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.flyweight.circle; 2 | 3 | /** 4 | * @author toryzhou 5 | * @since 10/20/20 6 | */ 7 | public interface Shape { 8 | void draw(); 9 | } 10 | -------------------------------------------------------------------------------- /src/main/java/com/job/designpattern/flyweight/circle/ShapeFactory.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.flyweight.circle; 2 | 3 | import java.util.HashMap; 4 | 5 | /** 6 | * @author toryzhou 7 | * @since 10/20/20 8 | */ 9 | public class ShapeFactory { 10 | private static final HashMap circleMap = new HashMap<>(); 11 | 12 | public static Shape getCircle(String color) { 13 | Circle circle = (Circle)circleMap.get(color); 14 | 15 | if(circle == null) { 16 | circle = new Circle(color); 17 | circleMap.put(color, circle); 18 | System.out.println("Creating circle of color : " + color); 19 | } 20 | return circle; 21 | } 22 | 23 | // 需要看下对象数量,检查有没有共享 24 | public static HashMap getCircleMap() { 25 | return circleMap; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/main/java/com/job/designpattern/interpreter/Expression.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.interpreter; 2 | 3 | public abstract class Expression { 4 | 5 | public void interpret(PlayContext context) { 6 | if (context.getText().length() == 0) { 7 | } else { 8 | String playKey = context.getText().substring(0, 1); 9 | context.setText(context.getText().substring(2)); 10 | double playValue = Double.valueOf(context.getText().substring(0, context.getText().indexOf(" "))); 11 | context.setText(context.getText().substring(context.getText().indexOf(" ") + 1)); 12 | execute(playKey, playValue); 13 | } 14 | } 15 | 16 | public abstract void execute(String key, double value); 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/com/job/designpattern/interpreter/Note.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.interpreter; 2 | 3 | public class Note extends Expression { 4 | @Override 5 | public void execute(String key, double value) { 6 | String note = ""; 7 | switch (key) { 8 | case "C": 9 | note = "1"; 10 | break; 11 | case "D": 12 | note = "2"; 13 | break; 14 | case "E": 15 | note = "3"; 16 | break; 17 | case "F": 18 | note = "4"; 19 | break; 20 | case "G": 21 | note = "5"; 22 | break; 23 | case "A": 24 | note = "6"; 25 | break; 26 | case "B": 27 | note = "7"; 28 | break; 29 | } 30 | PlayData playData = PlayData.getInstance(); 31 | playData.setPlay(playData.getPlay() + " " + note); 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /src/main/java/com/job/designpattern/interpreter/PlayContext.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.interpreter; 2 | 3 | import lombok.Data; 4 | 5 | @Data 6 | public class PlayContext { 7 | 8 | private String text; 9 | } 10 | -------------------------------------------------------------------------------- /src/main/java/com/job/designpattern/interpreter/PlayData.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.interpreter; 2 | 3 | import lombok.Getter; 4 | import lombok.Setter; 5 | 6 | public class PlayData { 7 | private static PlayData playData = new PlayData(); 8 | 9 | @Getter 10 | @Setter 11 | private String play = ""; 12 | 13 | private PlayData() { 14 | } 15 | 16 | public static PlayData getInstance() { 17 | return playData; 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/com/job/designpattern/interpreter/Scale.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.interpreter; 2 | 3 | public class Scale extends Expression { 4 | @Override 5 | public void execute(String key, double value) { 6 | String scale = ""; 7 | switch ((int) value) { 8 | case 1: 9 | scale = "bass"; 10 | break; 11 | case 2: 12 | scale = "mediant"; 13 | break; 14 | case 3: 15 | scale = "alt"; 16 | break; 17 | } 18 | PlayData playData = PlayData.getInstance(); 19 | playData.setPlay(playData.getPlay() + " " + scale); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/main/java/com/job/designpattern/interpreter/Speed.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.interpreter; 2 | 3 | public class Speed extends Expression { 4 | @Override 5 | public void execute(String key, double value) { 6 | String speed = ""; 7 | if (value < 500) { 8 | speed = "fast"; 9 | } else if (value >= 1000) { 10 | speed = "slow"; 11 | } else { 12 | speed = "medium"; 13 | } 14 | PlayData playData = PlayData.getInstance(); 15 | playData.setPlay(playData.getPlay()+ " " + speed); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/com/job/designpattern/iterator/Aggregate.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.iterator; 2 | 3 | public abstract class Aggregate { 4 | public abstract Iterator createIterator(); 5 | } 6 | -------------------------------------------------------------------------------- /src/main/java/com/job/designpattern/iterator/ConcreteAggregate.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.iterator; 2 | 3 | import java.util.ArrayList; 4 | import java.util.List; 5 | 6 | public class ConcreteAggregate extends Aggregate { 7 | 8 | private List list = new ArrayList<>(); 9 | 10 | @Override 11 | public Iterator createIterator() { 12 | return new ConcreteIterator(this); 13 | } 14 | 15 | public int count() { 16 | return list.size(); 17 | } 18 | 19 | public Object get(int index) { 20 | return list.get(index); 21 | } 22 | 23 | public void add(Object object) { 24 | list.add(object); 25 | } 26 | 27 | public void set(int index, Object object) { 28 | list.set(index, object); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /src/main/java/com/job/designpattern/iterator/ConcreteIterator.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.iterator; 2 | 3 | public class ConcreteIterator extends Iterator { 4 | private ConcreteAggregate concreteAggregate; 5 | 6 | private int current = 0; 7 | 8 | public ConcreteIterator(ConcreteAggregate concreteAggregate) { 9 | this.concreteAggregate = concreteAggregate; 10 | } 11 | 12 | @Override 13 | public Object first() { 14 | return concreteAggregate.get(0); 15 | } 16 | 17 | @Override 18 | public Object next() { 19 | Object result = null; 20 | current++; 21 | if (current < concreteAggregate.count()) { 22 | result = concreteAggregate.get(current); 23 | } 24 | return result; 25 | } 26 | 27 | @Override 28 | public boolean isDone() { 29 | return current >= concreteAggregate.count(); 30 | } 31 | 32 | @Override 33 | public Object currentItem() { 34 | return concreteAggregate.get(current); 35 | } 36 | 37 | @Override 38 | public int current() { 39 | return current; 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /src/main/java/com/job/designpattern/iterator/ConcreteIteratorDesc.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.iterator; 2 | 3 | public class ConcreteIteratorDesc extends Iterator { 4 | private ConcreteAggregate concreteAggregate; 5 | 6 | private int current; 7 | 8 | public ConcreteIteratorDesc(ConcreteAggregate concreteAggregate) { 9 | this.concreteAggregate = concreteAggregate; 10 | this.current = concreteAggregate.count()-1; 11 | } 12 | 13 | @Override 14 | public Object first() { 15 | return concreteAggregate.get(current); 16 | } 17 | 18 | @Override 19 | public Object next() { 20 | Object result = null; 21 | current--; 22 | if (current >= 0) { 23 | result = concreteAggregate.get(current); 24 | } 25 | return result; 26 | } 27 | 28 | @Override 29 | public boolean isDone() { 30 | return current < 0; 31 | } 32 | 33 | @Override 34 | public Object currentItem() { 35 | return concreteAggregate.get(current); 36 | } 37 | 38 | @Override 39 | public int current() { 40 | return current; 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /src/main/java/com/job/designpattern/iterator/Iterator.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.iterator; 2 | 3 | public abstract class Iterator { 4 | 5 | public abstract Object first(); 6 | public abstract Object next(); 7 | public abstract boolean isDone(); 8 | public abstract Object currentItem(); 9 | public abstract int current(); 10 | 11 | } 12 | -------------------------------------------------------------------------------- /src/main/java/com/job/designpattern/mediator/Country.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.mediator; 2 | 3 | public abstract class Country { 4 | protected UnitedNations unitedNations; 5 | 6 | public Country(UnitedNations unitedNations) { 7 | this.unitedNations = unitedNations; 8 | } 9 | 10 | public abstract void declare(String message); 11 | 12 | public abstract void getMessage(String message); 13 | 14 | } 15 | -------------------------------------------------------------------------------- /src/main/java/com/job/designpattern/mediator/Iran.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.mediator; 2 | 3 | public class Iran extends Country { 4 | public Iran(UnitedNations unitedNations) { 5 | super(unitedNations); 6 | } 7 | 8 | @Override 9 | public void declare(String message) { 10 | unitedNations.declare(message, this); 11 | } 12 | 13 | @Override 14 | public void getMessage(String message) { 15 | MessageData.getInstance().getList().add(this.getClass().getSimpleName() + Thread.currentThread().getStackTrace()[1].getMethodName() + message); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/com/job/designpattern/mediator/MessageData.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.mediator; 2 | 3 | import lombok.Getter; 4 | import lombok.Setter; 5 | 6 | import java.util.ArrayList; 7 | import java.util.List; 8 | 9 | public class MessageData { 10 | private static MessageData messageData = new MessageData(); 11 | 12 | @Getter 13 | @Setter 14 | private List list = new ArrayList<>(); 15 | 16 | private MessageData() { 17 | } 18 | 19 | public static MessageData getInstance() { 20 | return messageData; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/main/java/com/job/designpattern/mediator/USA.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.mediator; 2 | 3 | public class USA extends Country { 4 | 5 | public USA(UnitedNations unitedNations) { 6 | super(unitedNations); 7 | } 8 | 9 | @Override 10 | public void declare(String message) { 11 | unitedNations.declare(message, this); 12 | } 13 | 14 | @Override 15 | public void getMessage(String message) { 16 | MessageData.getInstance().getList().add(this.getClass().getSimpleName() + Thread.currentThread().getStackTrace()[1].getMethodName() + message); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/com/job/designpattern/mediator/UnitedNations.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.mediator; 2 | 3 | public abstract class UnitedNations { 4 | public abstract void declare(String message, Country country); 5 | } 6 | -------------------------------------------------------------------------------- /src/main/java/com/job/designpattern/mediator/UnitedNationsSecurityCouncil.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.mediator; 2 | 3 | import lombok.Getter; 4 | import lombok.Setter; 5 | 6 | public class UnitedNationsSecurityCouncil extends UnitedNations { 7 | 8 | @Getter 9 | @Setter 10 | private USA usa; 11 | @Getter 12 | @Setter 13 | private Iran iran; 14 | 15 | @Override 16 | public void declare(String message, Country country) { 17 | if (country instanceof USA){ 18 | iran.getMessage(message); 19 | }else if(country instanceof Iran){ 20 | usa.getMessage(message); 21 | } 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/main/java/com/job/designpattern/memento/GameRole.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.memento; 2 | 3 | import lombok.Data; 4 | 5 | @Data 6 | public class GameRole { 7 | 8 | private int vitality; 9 | private int attack; 10 | private int defense; 11 | 12 | public void initState() { 13 | this.vitality = 100; 14 | this.attack = 100; 15 | this.defense = 100; 16 | } 17 | 18 | public void fight() { 19 | this.vitality = 0; 20 | this.attack = 0; 21 | this.defense = 0; 22 | } 23 | 24 | public RoleStateMemento saveState() { 25 | return new RoleStateMemento(vitality, attack, defense); 26 | } 27 | 28 | public void recoveryState(RoleStateMemento roleStateMemento) { 29 | this.vitality = roleStateMemento.getVitality(); 30 | this.attack = roleStateMemento.getAttack(); 31 | this.defense = roleStateMemento.getDefense(); 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /src/main/java/com/job/designpattern/memento/RoleStateCaretaker.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.memento; 2 | 3 | import lombok.Data; 4 | 5 | @Data 6 | public class RoleStateCaretaker { 7 | 8 | private RoleStateMemento roleStateMemento; 9 | 10 | } 11 | -------------------------------------------------------------------------------- /src/main/java/com/job/designpattern/memento/RoleStateMemento.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.memento; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Data; 5 | 6 | @Data 7 | @AllArgsConstructor 8 | public class RoleStateMemento { 9 | private int vitality; 10 | private int attack; 11 | private int defense; 12 | } 13 | -------------------------------------------------------------------------------- /src/main/java/com/job/designpattern/observer/Boss.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.observer; 2 | 3 | import java.util.ArrayList; 4 | import java.util.List; 5 | 6 | public class Boss implements Subject { 7 | private List observerList = new ArrayList<>(); 8 | 9 | private String status; 10 | 11 | @Override 12 | public void attach(Observer observer) { 13 | observerList.add(observer); 14 | } 15 | 16 | @Override 17 | public void detach(Observer observer) { 18 | observerList.remove(observer); 19 | } 20 | 21 | @Override 22 | public void inform() { 23 | //当所需要通知的对象方法不一致时,得使用事件委托,可以用放射来获取委托的参数和方法 24 | observerList.forEach(Observer::update); 25 | } 26 | 27 | @Override 28 | public String getStatus() { 29 | return status; 30 | } 31 | 32 | @Override 33 | public void setStatus(String status) { 34 | this.status = status; 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /src/main/java/com/job/designpattern/observer/NBAObserver.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.observer; 2 | 3 | import lombok.Getter; 4 | import lombok.Setter; 5 | 6 | @Setter 7 | @Getter 8 | public class NBAObserver extends Observer { 9 | private boolean watchingNBA; 10 | 11 | private String status; 12 | 13 | public NBAObserver(String name, Subject subject) { 14 | super(name, subject); 15 | this.watchingNBA = true; 16 | } 17 | 18 | @Override 19 | public void update() { 20 | this.watchingNBA = false; 21 | this.status = subject.getStatus(); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/main/java/com/job/designpattern/observer/Observer.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.observer; 2 | 3 | public abstract class Observer { 4 | protected String name; 5 | protected Subject subject; 6 | 7 | public Observer(String name, Subject subject) { 8 | this.name = name; 9 | this.subject = subject; 10 | } 11 | 12 | public abstract void update(); 13 | } 14 | -------------------------------------------------------------------------------- /src/main/java/com/job/designpattern/observer/StockObserver.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.observer; 2 | 3 | import lombok.Getter; 4 | import lombok.Setter; 5 | 6 | @Getter 7 | @Setter 8 | public class StockObserver extends Observer { 9 | 10 | private boolean watchingStock; 11 | private String status; 12 | 13 | public StockObserver(String name, Subject subject) { 14 | super(name, subject); 15 | this.watchingStock = true; 16 | } 17 | 18 | @Override 19 | public void update() { 20 | this.watchingStock = false; 21 | this.status = subject.getStatus(); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/main/java/com/job/designpattern/observer/Subject.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.observer; 2 | 3 | public interface Subject { 4 | void attach(Observer observer); 5 | 6 | void detach(Observer observer); 7 | 8 | void inform(); 9 | 10 | String getStatus(); 11 | 12 | void setStatus(String status); 13 | 14 | } 15 | -------------------------------------------------------------------------------- /src/main/java/com/job/designpattern/prototype/Prize.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.prototype; 2 | 3 | import lombok.Data; 4 | 5 | @Data 6 | public class Prize implements Cloneable { 7 | private String name; 8 | 9 | public Prize(String name) { 10 | this.name = name; 11 | } 12 | 13 | @Override 14 | public Prize clone() throws CloneNotSupportedException { 15 | return (Prize) super.clone(); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/com/job/designpattern/prototype/Resume.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.prototype; 2 | 3 | import lombok.Data; 4 | 5 | @Data 6 | public class Resume implements Cloneable { 7 | 8 | private String name; 9 | //String 是特殊的引用类型会进行深拷贝 10 | private String sex; 11 | //值类型在clone时会复制到新对象 12 | private int age; 13 | 14 | private WorkExperience workExperience; 15 | 16 | //引用类型会浅拷贝,拷贝时引用的还是同一个对象,要深拷贝需要一层一层拷贝 17 | private Prize prize; 18 | 19 | public Resume(String name) { 20 | this.name = name; 21 | this.workExperience = new WorkExperience(); 22 | } 23 | 24 | public void setPersonalInfo(String sex, int age) { 25 | this.sex = sex; 26 | this.age = age; 27 | } 28 | 29 | public void setWorkExperience(String timeArea, String company) { 30 | this.workExperience.setTimeArea(timeArea); 31 | this.workExperience.setCompany(company); 32 | } 33 | 34 | @Override 35 | public Resume clone() throws CloneNotSupportedException { 36 | return (Resume) super.clone(); 37 | } 38 | 39 | public Resume deepClone() throws CloneNotSupportedException { 40 | Resume resume = (Resume) super.clone(); 41 | resume.workExperience = workExperience.clone(); 42 | resume.prize = prize.clone(); 43 | return resume; 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /src/main/java/com/job/designpattern/prototype/WorkExperience.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.prototype; 2 | 3 | import lombok.Data; 4 | 5 | @Data 6 | public class WorkExperience implements Cloneable { 7 | private String timeArea; 8 | private String company; 9 | 10 | public WorkExperience clone() throws CloneNotSupportedException { 11 | return (WorkExperience) super.clone(); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/main/java/com/job/designpattern/proxy/GiveGift.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.proxy; 2 | 3 | public interface GiveGift { 4 | void giveDolls(); 5 | void giveFlowers(); 6 | void giveChocolate(); 7 | } 8 | -------------------------------------------------------------------------------- /src/main/java/com/job/designpattern/proxy/Proxy.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.proxy; 2 | 3 | public class Proxy implements GiveGift { 4 | private Pursuit pursuit; 5 | 6 | public Proxy(SchoolGirl schoolGirl) { 7 | this.pursuit = new Pursuit(schoolGirl); 8 | } 9 | 10 | @Override 11 | public void giveDolls() { 12 | pursuit.giveDolls(); 13 | } 14 | 15 | @Override 16 | public void giveFlowers() { 17 | pursuit.giveFlowers(); 18 | } 19 | 20 | @Override 21 | public void giveChocolate() { 22 | pursuit.giveChocolate(); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/main/java/com/job/designpattern/proxy/Pursuit.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.proxy; 2 | 3 | public class Pursuit implements GiveGift { 4 | 5 | private SchoolGirl schoolGirl; 6 | 7 | public Pursuit(SchoolGirl schoolGirl) { 8 | this.schoolGirl = schoolGirl; 9 | } 10 | 11 | @Override 12 | public void giveDolls() { 13 | schoolGirl.setHasDolls(true); 14 | } 15 | 16 | @Override 17 | public void giveFlowers() { 18 | schoolGirl.setHasFlowers(true); 19 | } 20 | 21 | @Override 22 | public void giveChocolate() { 23 | schoolGirl.setHasChocolate(true); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /src/main/java/com/job/designpattern/proxy/SchoolGirl.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.proxy; 2 | 3 | import lombok.Data; 4 | 5 | @Data 6 | public class SchoolGirl { 7 | boolean hasDolls; 8 | boolean hasFlowers; 9 | boolean hasChocolate; 10 | } 11 | -------------------------------------------------------------------------------- /src/main/java/com/job/designpattern/simplefactory/Operation.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.simplefactory; 2 | 3 | import lombok.Data; 4 | 5 | @Data 6 | public abstract class Operation { 7 | 8 | private double numberA; 9 | private double numberB; 10 | 11 | public double calculate() { 12 | return 0.0; 13 | } 14 | 15 | } 16 | -------------------------------------------------------------------------------- /src/main/java/com/job/designpattern/simplefactory/OperationAddition.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.simplefactory; 2 | 3 | public class OperationAddition extends Operation { 4 | 5 | @Override 6 | public double calculate() { 7 | return super.getNumberA() + super.getNumberB(); 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /src/main/java/com/job/designpattern/simplefactory/OperationDivision.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.simplefactory; 2 | 3 | public class OperationDivision extends Operation { 4 | 5 | @Override 6 | public double calculate() { 7 | return super.getNumberA() / super.getNumberB(); 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /src/main/java/com/job/designpattern/simplefactory/OperationFactory.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.simplefactory; 2 | 3 | public class OperationFactory { 4 | 5 | public static final String ADD = "+"; 6 | public static final String SUB = "-"; 7 | public static final String MUL = "*"; 8 | public static final String DIV = "/"; 9 | 10 | public static Operation createOperation(String type) { 11 | Operation operation = null; 12 | switch (type) { 13 | case ADD: 14 | operation = new OperationAddition(); 15 | break; 16 | case SUB: 17 | operation = new OperationSubtraction(); 18 | break; 19 | case MUL: 20 | operation = new OperationMultiplication(); 21 | break; 22 | case DIV: 23 | operation = new OperationDivision(); 24 | break; 25 | default: 26 | } 27 | return operation; 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /src/main/java/com/job/designpattern/simplefactory/OperationMultiplication.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.simplefactory; 2 | 3 | public class OperationMultiplication extends Operation{ 4 | 5 | @Override 6 | public double calculate() { 7 | return super.getNumberA() * super.getNumberB(); 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /src/main/java/com/job/designpattern/simplefactory/OperationSubtraction.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.simplefactory; 2 | 3 | public class OperationSubtraction extends Operation { 4 | @Override 5 | public double calculate() { 6 | return super.getNumberA() - super.getNumberB(); 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /src/main/java/com/job/designpattern/simplefactory/README.md: -------------------------------------------------------------------------------- 1 | 简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式。 2 | 3 | 简单工厂模式不属于23种GOF设计模式,但是可以被认为是一种特殊的工厂方法模式。 4 | 5 | 简单工厂模式最大的缺点是违背了“开闭原则”,当增加了新的产品时,需要去修改简单工厂类的结构。工厂方法模式主要是针对单一产品结构的情景,而抽象工厂模式是针对多级产品结构的场景。 -------------------------------------------------------------------------------- /src/main/java/com/job/designpattern/singleton/Hungry.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.singleton; 2 | 3 | import lombok.Getter; 4 | import lombok.Setter; 5 | 6 | public class Hungry { 7 | private static Hungry hungry =new Hungry(); 8 | 9 | @Getter 10 | @Setter 11 | private String name; 12 | 13 | private Hungry() { 14 | } 15 | 16 | public static Hungry getInstance(){ 17 | return hungry; 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/com/job/designpattern/singleton/Lazy.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.singleton; 2 | 3 | import lombok.Getter; 4 | import lombok.Setter; 5 | 6 | public class Lazy { 7 | 8 | private static Lazy lazy; 9 | 10 | @Getter 11 | @Setter 12 | private String name; 13 | 14 | private Lazy() { 15 | } 16 | public static Lazy getInstance() { 17 | if (null == lazy) { 18 | synchronized (Lazy.class) { 19 | if (lazy == null) { 20 | lazy = new Lazy(); 21 | } 22 | } 23 | } 24 | return lazy; 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/main/java/com/job/designpattern/state/AfternoonState.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.state; 2 | 3 | public class AfternoonState extends State { 4 | @Override 5 | public void writeProgram(Work work) { 6 | if (work.getHour() < 17) { 7 | work.setStateName(this.getClass().getSimpleName()); 8 | } else { 9 | work.setCurrentState(new EveningState()); 10 | work.writeProgram(); 11 | } 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/main/java/com/job/designpattern/state/EveningState.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.state; 2 | 3 | public class EveningState extends State { 4 | @Override 5 | public void writeProgram(Work work) { 6 | 7 | if (work.isFinished()) { 8 | work.setCurrentState(new RestState()); 9 | work.writeProgram(); 10 | } else { 11 | if (work.getHour() < 21) { 12 | work.setStateName(this.getClass().getSimpleName()); 13 | } else { 14 | work.setCurrentState(new SleepingState()); 15 | work.writeProgram(); 16 | } 17 | } 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/com/job/designpattern/state/ForenoonState.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.state; 2 | 3 | public class ForenoonState extends State { 4 | @Override 5 | public void writeProgram(Work work) { 6 | if(work.getHour()<12){ 7 | work.setStateName(this.getClass().getSimpleName()); 8 | }else { 9 | work.setCurrentState(new NoonState()); 10 | work.writeProgram(); 11 | } 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/main/java/com/job/designpattern/state/NoonState.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.state; 2 | 3 | public class NoonState extends State { 4 | @Override 5 | public void writeProgram(Work work) { 6 | if (work.getHour() < 13) { 7 | work.setStateName(this.getClass().getSimpleName()); 8 | } else { 9 | work.setCurrentState(new AfternoonState()); 10 | work.writeProgram(); 11 | } 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/main/java/com/job/designpattern/state/RestState.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.state; 2 | 3 | public class RestState extends State { 4 | @Override 5 | public void writeProgram(Work work) { 6 | work.setStateName(this.getClass().getSimpleName()); 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /src/main/java/com/job/designpattern/state/SleepingState.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.state; 2 | 3 | public class SleepingState extends State { 4 | @Override 5 | public void writeProgram(Work work) { 6 | if (work.isFinished()) { 7 | work.setCurrentState(new RestState()); 8 | work.writeProgram(); 9 | }else{ 10 | work.setStateName(this.getClass().getSimpleName()); 11 | } 12 | 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/main/java/com/job/designpattern/state/State.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.state; 2 | 3 | public abstract class State { 4 | public abstract void writeProgram(Work work); 5 | } 6 | -------------------------------------------------------------------------------- /src/main/java/com/job/designpattern/state/Work.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.state; 2 | 3 | import lombok.Data; 4 | 5 | @Data 6 | public class Work { 7 | private int hour; 8 | private boolean finished = false; 9 | private State currentState; 10 | 11 | private String stateName; 12 | 13 | public Work() { 14 | currentState = new ForenoonState(); 15 | } 16 | 17 | public void writeProgram() { 18 | currentState.writeProgram(this); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/com/job/designpattern/strategy/CashContext.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.strategy; 2 | 3 | public class CashContext { 4 | private CashSuper cashSuper; 5 | 6 | public CashContext(CashSuper cashSuper) { 7 | this.cashSuper = cashSuper; 8 | } 9 | 10 | public double getResult(double money) { 11 | return cashSuper.acceptCash(money); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/main/java/com/job/designpattern/strategy/CashNormal.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.strategy; 2 | 3 | public class CashNormal extends CashSuper { 4 | 5 | @Override 6 | public double acceptCash(double money) { 7 | return super.acceptCash(money); 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /src/main/java/com/job/designpattern/strategy/CashRebate.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.strategy; 2 | 3 | public class CashRebate extends CashSuper { 4 | 5 | private double moneyRebate; 6 | 7 | public CashRebate(double moneyRebate) { 8 | this.moneyRebate = moneyRebate; 9 | } 10 | 11 | @Override 12 | public double acceptCash(double money) { 13 | return money * moneyRebate; 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/main/java/com/job/designpattern/strategy/CashReturn.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.strategy; 2 | 3 | public class CashReturn extends CashSuper { 4 | 5 | private double moneyCondition; 6 | private double moneyReturn; 7 | 8 | public CashReturn(double moneyCondition, double moneyReturn) { 9 | this.moneyCondition = moneyCondition; 10 | this.moneyReturn = moneyReturn; 11 | } 12 | 13 | @Override 14 | public double acceptCash(double money) { 15 | return money - Math.floor(money / moneyCondition) * moneyReturn; 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/com/job/designpattern/strategy/CashSuper.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.strategy; 2 | 3 | public abstract class CashSuper { 4 | 5 | public double acceptCash(double money) { 6 | return money; 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /src/main/java/com/job/designpattern/templatemethod/TestPaper.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.templatemethod; 2 | 3 | import lombok.Data; 4 | 5 | @Data 6 | public abstract class TestPaper { 7 | private String answer1; 8 | private String answer2; 9 | private String answer3; 10 | 11 | public static final String TEST_QUESTION_ONE = "testQuestionOne:"; 12 | public static final String TEST_QUESTION_TWO = "testQuestionTwo:"; 13 | public static final String TEST_QUESTION_THREE = "testQuestionThree:"; 14 | 15 | public void testQuestionOne() { 16 | this.answer1 = TEST_QUESTION_ONE + answerOne(); 17 | } 18 | 19 | public void testQuestionTwo() { 20 | this.answer2 = TEST_QUESTION_TWO + answerTwo(); 21 | } 22 | 23 | public void testQuestionThree() { 24 | this.answer3 = TEST_QUESTION_THREE + answerThree(); 25 | } 26 | 27 | protected abstract String answerOne(); 28 | 29 | protected abstract String answerTwo(); 30 | 31 | protected abstract String answerThree(); 32 | 33 | } 34 | -------------------------------------------------------------------------------- /src/main/java/com/job/designpattern/templatemethod/TestPaperA.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.templatemethod; 2 | 3 | public class TestPaperA extends TestPaper { 4 | 5 | public static final String ANSWER_ONE = "A"; 6 | public static final String ANSWER_TWO = "B"; 7 | public static final String ANSWER_THREE = "C"; 8 | 9 | protected String answerOne() { 10 | return ANSWER_ONE; 11 | } 12 | 13 | protected String answerTwo() { 14 | return ANSWER_TWO; 15 | } 16 | 17 | protected String answerThree() { 18 | return ANSWER_THREE; 19 | } 20 | 21 | } 22 | -------------------------------------------------------------------------------- /src/main/java/com/job/designpattern/templatemethod/TestPaperB.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.templatemethod; 2 | 3 | public class TestPaperB extends TestPaper { 4 | 5 | public static final String ANSWER_ONE = "B"; 6 | public static final String ANSWER_TWO = "C"; 7 | public static final String ANSWER_THREE = "D"; 8 | 9 | protected String answerOne() { 10 | return ANSWER_ONE; 11 | } 12 | 13 | protected String answerTwo() { 14 | return ANSWER_TWO; 15 | } 16 | 17 | protected String answerThree() { 18 | return ANSWER_THREE; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/com/job/designpattern/visitor/Action.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.visitor; 2 | 3 | public abstract class Action { 4 | 5 | public abstract void getManConclusion(Man man); 6 | 7 | public abstract void getWomanConclusion(Woman woman); 8 | 9 | 10 | } 11 | -------------------------------------------------------------------------------- /src/main/java/com/job/designpattern/visitor/Amativeness.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.visitor; 2 | 3 | public class Amativeness extends Action { 4 | @Override 5 | public void getManConclusion(Man man) { 6 | ConclusionData.getInstance().getList().add(man.getClass().getSimpleName() + this.getClass().getSimpleName()); 7 | } 8 | 9 | @Override 10 | public void getWomanConclusion(Woman woman) { 11 | ConclusionData.getInstance().getList().add(woman.getClass().getSimpleName() + this.getClass().getSimpleName()); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/main/java/com/job/designpattern/visitor/ConclusionData.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.visitor; 2 | 3 | import lombok.Getter; 4 | import lombok.Setter; 5 | 6 | import java.util.ArrayList; 7 | import java.util.List; 8 | 9 | public class ConclusionData { 10 | private static ConclusionData conclusionData = new ConclusionData(); 11 | 12 | @Getter 13 | @Setter 14 | private List list = new ArrayList<>(); 15 | 16 | private ConclusionData() { 17 | } 18 | 19 | public static ConclusionData getInstance() { 20 | return conclusionData; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/main/java/com/job/designpattern/visitor/Failing.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.visitor; 2 | 3 | public class Failing extends Action { 4 | @Override 5 | public void getManConclusion(Man man) { 6 | ConclusionData.getInstance().getList().add(man.getClass().getSimpleName() + this.getClass().getSimpleName()); 7 | } 8 | 9 | @Override 10 | public void getWomanConclusion(Woman woman) { 11 | ConclusionData.getInstance().getList().add(woman.getClass().getSimpleName() + this.getClass().getSimpleName()); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/main/java/com/job/designpattern/visitor/Man.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.visitor; 2 | 3 | public class Man extends Person { 4 | @Override 5 | public void accept(Action action) { 6 | action.getManConclusion(this); 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /src/main/java/com/job/designpattern/visitor/Marriage.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.visitor; 2 | 3 | public class Marriage extends Action { 4 | @Override 5 | public void getManConclusion(Man man) { 6 | ConclusionData.getInstance().getList().add(man.getClass().getSimpleName() + this.getClass().getSimpleName()); 7 | } 8 | 9 | @Override 10 | public void getWomanConclusion(Woman woman) { 11 | ConclusionData.getInstance().getList().add(woman.getClass().getSimpleName() + this.getClass().getSimpleName()); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/main/java/com/job/designpattern/visitor/ObjectStructure.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.visitor; 2 | 3 | import java.util.ArrayList; 4 | import java.util.List; 5 | 6 | public class ObjectStructure { 7 | 8 | private List personList = new ArrayList<>(); 9 | 10 | public void attach(Person person) { 11 | personList.add(person); 12 | } 13 | 14 | public void detach(Person person) { 15 | personList.remove(person); 16 | } 17 | 18 | public void display(Action action) { 19 | personList.forEach(item -> item.accept(action)); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/main/java/com/job/designpattern/visitor/Person.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.visitor; 2 | 3 | public abstract class Person { 4 | 5 | public abstract void accept(Action action); 6 | } 7 | -------------------------------------------------------------------------------- /src/main/java/com/job/designpattern/visitor/Success.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.visitor; 2 | 3 | public class Success extends Action { 4 | @Override 5 | public void getManConclusion(Man man) { 6 | ConclusionData.getInstance().getList().add(man.getClass().getSimpleName() + this.getClass().getSimpleName()); 7 | } 8 | 9 | @Override 10 | public void getWomanConclusion(Woman woman) { 11 | ConclusionData.getInstance().getList().add(woman.getClass().getSimpleName() + this.getClass().getSimpleName()); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/main/java/com/job/designpattern/visitor/Woman.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.visitor; 2 | 3 | public class Woman extends Person { 4 | @Override 5 | public void accept(Action action) { 6 | action.getWomanConclusion(this); 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /src/main/resources/book/大话设计模式(带目录完整版).pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToryZhou/design-pattern/c9bcd6ae5cfb398e86d3af9a6a704e70a604b5cd/src/main/resources/book/大话设计模式(带目录完整版).pdf -------------------------------------------------------------------------------- /src/main/resources/uml/AbstractfactoryUml.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToryZhou/design-pattern/c9bcd6ae5cfb398e86d3af9a6a704e70a604b5cd/src/main/resources/uml/AbstractfactoryUml.png -------------------------------------------------------------------------------- /src/main/resources/uml/AbstractfactoryUml.puml: -------------------------------------------------------------------------------- 1 | @startuml 2 | 3 | title Abstract Factory 4 | 5 | interface IDepartment{ 6 | #insert() 7 | #get(): Department 8 | } 9 | interface IFactory 10 | interface IUser{ 11 | #insert() 12 | #get(): User 13 | } 14 | 15 | class AccessDepartment{ 16 | +insert() 17 | +get(): Department 18 | } 19 | class AccessFactory{ 20 | +createUser(): IUser 21 | +createDepartment(): IDepartment 22 | } 23 | class AccessUser{ 24 | +insert() 25 | +get(): User 26 | } 27 | class SqlServerDepartment{ 28 | +insert() 29 | +get(): Department 30 | } 31 | class SqlServerFactory{ 32 | +createUser(): IUser 33 | +createDepartment(): IDepartment 34 | } 35 | class SqlServerUser{ 36 | +insert() 37 | +get(): User 38 | } 39 | 40 | IDepartment <|.. AccessDepartment 41 | IDepartment <|.. SqlServerDepartment 42 | IFactory <|.. AccessFactory 43 | IFactory <|.. SqlServerFactory 44 | IUser <|.. AccessUser 45 | IUser <|.. SqlServerUser 46 | AccessFactory ..> AccessDepartment 47 | AccessFactory ..> AccessUser 48 | SqlServerFactory ..> SqlServerDepartment 49 | SqlServerFactory ..> SqlServerUser 50 | @enduml -------------------------------------------------------------------------------- /src/main/resources/uml/AdapterUml.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToryZhou/design-pattern/c9bcd6ae5cfb398e86d3af9a6a704e70a604b5cd/src/main/resources/uml/AdapterUml.png -------------------------------------------------------------------------------- /src/main/resources/uml/AdapterUml.puml: -------------------------------------------------------------------------------- 1 | @startuml 2 | 3 | title Adapter 4 | 5 | abstract class Player{ 6 | #name: String 7 | +attack(): Action 8 | +defense(): Action 9 | } 10 | class ForeignCenter{ 11 | #name: String 12 | +attackForeign(): Action 13 | +defenseForeign(): Action 14 | } 15 | class Forwards{ 16 | +attack(): Action 17 | +defense(): Action 18 | } 19 | class Guards{ 20 | +attack(): Action 21 | +defense(): Action 22 | } 23 | class Translator{ 24 | -foreignCenter: ForeignCenter 25 | +attack(): Action 26 | +defense(): Action 27 | } 28 | 29 | Player <|-- Forwards 30 | Player <|-- Guards 31 | Player <|-- Translator 32 | ForeignCenter <- Translator 33 | @enduml -------------------------------------------------------------------------------- /src/main/resources/uml/BridgeUml.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToryZhou/design-pattern/c9bcd6ae5cfb398e86d3af9a6a704e70a604b5cd/src/main/resources/uml/BridgeUml.png -------------------------------------------------------------------------------- /src/main/resources/uml/BridgeUml.puml: -------------------------------------------------------------------------------- 1 | @startuml 2 | 3 | title bridge 4 | 5 | abstract class HandsetBrand{ 6 | -handsetSoft: HandsetSoft 7 | +run() 8 | } 9 | abstract class HandsetSoft{ 10 | +run() 11 | } 12 | 13 | class HandsetBrandM{ 14 | +run() 15 | } 16 | class HandsetBrandN{ 17 | +run() 18 | } 19 | class HandsetAddressList{ 20 | +run() 21 | } 22 | class HandsetGame{ 23 | +run() 24 | } 25 | 26 | HandsetBrand <|-- HandsetBrandM 27 | HandsetBrand <|-- HandsetBrandN 28 | 29 | HandsetSoft <|-- HandsetAddressList 30 | HandsetSoft <|-- HandsetGame 31 | 32 | HandsetBrand o- HandsetSoft 33 | @enduml -------------------------------------------------------------------------------- /src/main/resources/uml/BuilderUml.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToryZhou/design-pattern/c9bcd6ae5cfb398e86d3af9a6a704e70a604b5cd/src/main/resources/uml/BuilderUml.png -------------------------------------------------------------------------------- /src/main/resources/uml/BuilderUml.puml: -------------------------------------------------------------------------------- 1 | @startuml 2 | 3 | title Builder 4 | 5 | abstract class PersonBuilder{ 6 | +buildHead() 7 | +getResult(): Person 8 | } 9 | 10 | class PersonDirector{ 11 | +createPerson() 12 | } 13 | 14 | class PersonFatBuilder{ 15 | +person: Person 16 | +buildHead() 17 | +getResult(): Person 18 | } 19 | 20 | class PersonThinBuilder{ 21 | +person: Person 22 | +buildHead() 23 | +getResult(): Person 24 | } 25 | 26 | class Person{ 27 | -head: String 28 | -body: String 29 | -armLeft: String 30 | -armRight: String 31 | -legLeft: String 32 | -legRight: String 33 | +drawHead() 34 | } 35 | 36 | PersonDirector o-> PersonBuilder 37 | PersonBuilder <|-- PersonFatBuilder 38 | PersonBuilder <|-- PersonThinBuilder 39 | 40 | PersonFatBuilder -> Person 41 | Person <- PersonThinBuilder 42 | 43 | @enduml -------------------------------------------------------------------------------- /src/main/resources/uml/ChainofresponsibilityUml.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToryZhou/design-pattern/c9bcd6ae5cfb398e86d3af9a6a704e70a604b5cd/src/main/resources/uml/ChainofresponsibilityUml.png -------------------------------------------------------------------------------- /src/main/resources/uml/ChainofresponsibilityUml.puml: -------------------------------------------------------------------------------- 1 | @startuml 2 | title Chain of Responsibility 3 | abstract class Manager{ 4 | #name: String 5 | #superior: Manager 6 | +setSuperior() 7 | +requestApplications() 8 | } 9 | class CommonManager{ 10 | +requestApplications() 11 | } 12 | class Majordomo{ 13 | +requestApplications() 14 | } 15 | class GeneralManager{ 16 | +requestApplications() 17 | } 18 | 19 | class Request{ 20 | -requestType: String 21 | -requestContent: String 22 | -number: int 23 | } 24 | 25 | Manager <-o Manager 26 | Manager <|-- CommonManager 27 | Manager <|-- Majordomo 28 | Manager <|-- GeneralManager 29 | 30 | CommonManager ..> Request 31 | Majordomo ..> Request 32 | GeneralManager ..> Request 33 | 34 | @enduml -------------------------------------------------------------------------------- /src/main/resources/uml/CommandUml.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToryZhou/design-pattern/c9bcd6ae5cfb398e86d3af9a6a704e70a604b5cd/src/main/resources/uml/CommandUml.png -------------------------------------------------------------------------------- /src/main/resources/uml/CommandUml.puml: -------------------------------------------------------------------------------- 1 | @startuml 2 | title Command 3 | 4 | class Waiter{ 5 | -orders: List 6 | +inform() 7 | } 8 | abstract class Command{ 9 | #barbecuer: Barbecuer 10 | +executeCommand() 11 | } 12 | class BakeChickenWingCommand{ 13 | +executeCommand() 14 | } 15 | class BakeMuttonCommand{ 16 | +executeCommand() 17 | } 18 | class Barbecuer{ 19 | +bakeMutton() 20 | +bakeChickenWing() 21 | } 22 | 23 | Waiter o-> Command 24 | Command <|-- BakeChickenWingCommand 25 | Command <|-- BakeMuttonCommand 26 | 27 | BakeChickenWingCommand --> Barbecuer 28 | BakeMuttonCommand --> Barbecuer 29 | @enduml -------------------------------------------------------------------------------- /src/main/resources/uml/CompositeUml.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToryZhou/design-pattern/c9bcd6ae5cfb398e86d3af9a6a704e70a604b5cd/src/main/resources/uml/CompositeUml.png -------------------------------------------------------------------------------- /src/main/resources/uml/CompositeUml.puml: -------------------------------------------------------------------------------- 1 | @startuml 2 | 3 | title Composite 4 | 5 | abstract class Company{ 6 | -name: String 7 | +add() 8 | +remove() 9 | +display() 10 | +lineOfDuty() 11 | } 12 | class FinanceCompany{ 13 | +add() 14 | +remove() 15 | +display() 16 | +lineOfDuty() 17 | } 18 | class HRCompany{ 19 | +add() 20 | +remove() 21 | +display() 22 | +lineOfDuty() 23 | } 24 | class ConcreteCompany{ 25 | +add() 26 | +remove() 27 | +display() 28 | +lineOfDuty() 29 | } 30 | 31 | Company <|-- FinanceCompany 32 | Company <|-- HRCompany 33 | Company <|-- ConcreteCompany 34 | 35 | Company <--o ConcreteCompany 36 | @enduml -------------------------------------------------------------------------------- /src/main/resources/uml/DecoratorUml.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToryZhou/design-pattern/c9bcd6ae5cfb398e86d3af9a6a704e70a604b5cd/src/main/resources/uml/DecoratorUml.png -------------------------------------------------------------------------------- /src/main/resources/uml/DecoratorUml.puml: -------------------------------------------------------------------------------- 1 | @startuml 2 | 3 | title Decorator 4 | 5 | class Person{ 6 | -name:String 7 | +putOn() 8 | } 9 | class Finery{ 10 | #person: Person 11 | +putOn() 12 | } 13 | class BigTrouser{ 14 | +putOn() 15 | } 16 | class LeatherShoes{ 17 | +putOn() 18 | } 19 | class Sneakers{ 20 | +putOn() 21 | } 22 | class Suit{ 23 | +putOn() 24 | } 25 | class Tie{ 26 | +putOn() 27 | } 28 | class TShirts{ 29 | +putOn() 30 | } 31 | 32 | 33 | Person <|-- Finery 34 | Finery o--> Person 35 | 36 | Finery <|-- BigTrouser 37 | Finery <|-- LeatherShoes 38 | Finery <|-- Sneakers 39 | Finery <|-- Suit 40 | Finery <|-- Tie 41 | Finery <|-- TShirts 42 | 43 | 44 | @enduml -------------------------------------------------------------------------------- /src/main/resources/uml/FacadeUml.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToryZhou/design-pattern/c9bcd6ae5cfb398e86d3af9a6a704e70a604b5cd/src/main/resources/uml/FacadeUml.png -------------------------------------------------------------------------------- /src/main/resources/uml/FacadeUml.puml: -------------------------------------------------------------------------------- 1 | @startuml 2 | title Facade 3 | class Fund{ 4 | -nationalDept: NationalDept 5 | -realty: Realty 6 | -stock: Stock 7 | +buyFund() 8 | +sellFund() 9 | } 10 | class NationalDept{ 11 | +buy() 12 | +sell() 13 | } 14 | class Realty{ 15 | +buy() 16 | +sell() 17 | } 18 | class Stock{ 19 | +buy() 20 | +sell() 21 | } 22 | 23 | Fund --> NationalDept 24 | Fund --> Realty 25 | Fund --> Stock 26 | 27 | 28 | @enduml -------------------------------------------------------------------------------- /src/main/resources/uml/FactoryMethodUml.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToryZhou/design-pattern/c9bcd6ae5cfb398e86d3af9a6a704e70a604b5cd/src/main/resources/uml/FactoryMethodUml.png -------------------------------------------------------------------------------- /src/main/resources/uml/FactoryMethodUml.puml: -------------------------------------------------------------------------------- 1 | @startuml 2 | title Factory Method 3 | interface IFactory{ 4 | +createLeiFeng(): LeiFeng 5 | } 6 | Class LeiFeng 7 | Class Undergraduate 8 | Class UndergraduateFactory 9 | Class Volunteer 10 | Class VolunteerFactory 11 | 12 | IFactory <|.. UndergraduateFactory 13 | IFactory ..> LeiFeng 14 | IFactory <|.. VolunteerFactory 15 | LeiFeng <|-- Undergraduate 16 | LeiFeng <|-- Volunteer 17 | UndergraduateFactory ..> Undergraduate 18 | VolunteerFactory..> Volunteer 19 | @enduml -------------------------------------------------------------------------------- /src/main/resources/uml/FlyweightUml.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToryZhou/design-pattern/c9bcd6ae5cfb398e86d3af9a6a704e70a604b5cd/src/main/resources/uml/FlyweightUml.png -------------------------------------------------------------------------------- /src/main/resources/uml/FlyweightUml.puml: -------------------------------------------------------------------------------- 1 | @startuml 2 | 3 | title Flywight 4 | 5 | abstract class Website{ 6 | +use() 7 | } 8 | class WebsiteFactory{ 9 | -hashtable: Hashtable 10 | +getWebsiteCategory(): Website 11 | +getWebsiteCount(): int 12 | } 13 | class ConcreteWebsite{ 14 | -name: String 15 | +use() 16 | } 17 | class User{ 18 | -name: String 19 | } 20 | 21 | 22 | Website <|-- ConcreteWebsite 23 | User <. Website 24 | Website <-o WebsiteFactory 25 | @enduml -------------------------------------------------------------------------------- /src/main/resources/uml/InterpreterUml.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToryZhou/design-pattern/c9bcd6ae5cfb398e86d3af9a6a704e70a604b5cd/src/main/resources/uml/InterpreterUml.png -------------------------------------------------------------------------------- /src/main/resources/uml/InterpreterUml.puml: -------------------------------------------------------------------------------- 1 | @startuml 2 | 3 | title Interpreter 4 | 5 | abstract class Expression{ 6 | +interpret() 7 | +execute() 8 | } 9 | class Note{ 10 | +execute() 11 | } 12 | class Scale{ 13 | +execute() 14 | } 15 | class Speed{ 16 | +execute() 17 | } 18 | class PlayContext{ 19 | -text: String 20 | } 21 | 22 | Expression <|-- Note 23 | Expression <|-- Scale 24 | Expression <|-- Speed 25 | Expression .> PlayContext 26 | 27 | @enduml -------------------------------------------------------------------------------- /src/main/resources/uml/IteratorUml.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToryZhou/design-pattern/c9bcd6ae5cfb398e86d3af9a6a704e70a604b5cd/src/main/resources/uml/IteratorUml.png -------------------------------------------------------------------------------- /src/main/resources/uml/IteratorUml.puml: -------------------------------------------------------------------------------- 1 | @startuml 2 | 3 | title Iterator 4 | 5 | abstract class Aggregate{ 6 | +createIterator(): Iterator 7 | } 8 | abstract class Iterator{ 9 | +first(): Object 10 | +next(): Object 11 | +isDone(): boolean 12 | +first(): currentItem 13 | +current(): int 14 | } 15 | class ConcreteAggregate{ 16 | +createIterator(): Iterator 17 | } 18 | class ConcreteIterator{ 19 | -concreteAggregate: ConcreteAggregate 20 | -current: int 21 | +first(): Object 22 | +next(): Object 23 | +isDone(): boolean 24 | +first(): currentItem 25 | +current(): int 26 | } 27 | class ConcreteIteratorDesc{ 28 | -concreteAggregate: ConcreteAggregate 29 | -current: int 30 | +first(): Object 31 | +next(): Object 32 | +isDone(): boolean 33 | +first(): currentItem 34 | +current(): int 35 | } 36 | 37 | Iterator <|-- ConcreteIterator 38 | Iterator <|-- ConcreteIteratorDesc 39 | 40 | Aggregate <|-- ConcreteAggregate 41 | 42 | ConcreteIterator --> ConcreteAggregate 43 | ConcreteAggregate ..> ConcreteIterator 44 | 45 | ConcreteIteratorDesc --> ConcreteAggregate 46 | ConcreteAggregate ..> ConcreteIteratorDesc 47 | 48 | @enduml -------------------------------------------------------------------------------- /src/main/resources/uml/MediatorUml.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToryZhou/design-pattern/c9bcd6ae5cfb398e86d3af9a6a704e70a604b5cd/src/main/resources/uml/MediatorUml.png -------------------------------------------------------------------------------- /src/main/resources/uml/MediatorUml.puml: -------------------------------------------------------------------------------- 1 | @startuml 2 | 3 | title Mediator 4 | 5 | abstract class Country{ 6 | #unitedNations: UnitedNations 7 | +declare() 8 | +getMessage() 9 | } 10 | abstract class UnitedNations{ 11 | +declare() 12 | } 13 | class Iran{ 14 | +declare() 15 | +getMessage() 16 | } 17 | class USA{ 18 | +declare() 19 | +getMessage() 20 | } 21 | class UnitedNationsSecurityCouncil{ 22 | -USA: usa 23 | -iran: Iran 24 | +declare() 25 | } 26 | 27 | Country <|-- Iran 28 | Country <|-- USA 29 | 30 | UnitedNations <|-- UnitedNationsSecurityCouncil 31 | 32 | UnitedNationsSecurityCouncil --> Iran 33 | UnitedNationsSecurityCouncil --> USA 34 | 35 | UnitedNations <- Country 36 | 37 | @enduml -------------------------------------------------------------------------------- /src/main/resources/uml/MementoUml.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToryZhou/design-pattern/c9bcd6ae5cfb398e86d3af9a6a704e70a604b5cd/src/main/resources/uml/MementoUml.png -------------------------------------------------------------------------------- /src/main/resources/uml/MementoUml.puml: -------------------------------------------------------------------------------- 1 | @startuml 2 | 3 | title Memento 4 | 5 | class GameRole{ 6 | -vitality: int 7 | -attack: int 8 | -defense: int 9 | +fight() 10 | +saveState(): RoleStateMemento 11 | +recoveryState() 12 | } 13 | class RoleStateCaretaker{ 14 | -roleStateMemento: RoleStateMemento 15 | } 16 | 17 | class RoleStateMemento{ 18 | -vitality: int 19 | -attack: int 20 | -defense: int 21 | } 22 | 23 | GameRole .> RoleStateMemento 24 | RoleStateMemento <-o RoleStateCaretaker 25 | 26 | @enduml -------------------------------------------------------------------------------- /src/main/resources/uml/ObserverUml.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToryZhou/design-pattern/c9bcd6ae5cfb398e86d3af9a6a704e70a604b5cd/src/main/resources/uml/ObserverUml.png -------------------------------------------------------------------------------- /src/main/resources/uml/ObserverUml.puml: -------------------------------------------------------------------------------- 1 | @startuml 2 | 3 | title Observer 4 | 5 | abstract class Observer{ 6 | #name: String 7 | #subject: Subject 8 | +update() 9 | } 10 | class NBAObserver{ 11 | +status: String 12 | +update() 13 | } 14 | class StockObserver{ 15 | +status: String 16 | +update() 17 | } 18 | 19 | interface Subject{ 20 | +inform(); 21 | } 22 | class Boss{ 23 | -status: String 24 | +inform() 25 | } 26 | 27 | Subject .> Observer 28 | Observer <|-- NBAObserver 29 | Observer <|-- StockObserver 30 | Subject <|.. Boss 31 | 32 | NBAObserver .> Subject 33 | StockObserver .> Subject 34 | 35 | @enduml -------------------------------------------------------------------------------- /src/main/resources/uml/PrototypeUml.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToryZhou/design-pattern/c9bcd6ae5cfb398e86d3af9a6a704e70a604b5cd/src/main/resources/uml/PrototypeUml.png -------------------------------------------------------------------------------- /src/main/resources/uml/PrototypeUml.puml: -------------------------------------------------------------------------------- 1 | @startuml 2 | title Prototype 3 | Interface Cloneable 4 | class Resume{ 5 | -name: String 6 | -sex: String 7 | -age: int 8 | -workExperience: WorkExperience 9 | -prize: Prize 10 | +clone(): Resume 11 | +deepClone(): Resume 12 | } 13 | class Prize{ 14 | -name: String 15 | +clone(): Prize 16 | } 17 | class WorkExperience{ 18 | -timeArea: String 19 | -company: String 20 | +clone(): WorkExperience 21 | } 22 | 23 | Cloneable <|.. Resume 24 | Cloneable <|.. Prize 25 | Cloneable <|.. WorkExperience 26 | Resume *-> Prize 27 | WorkExperience <-* Resume 28 | @enduml -------------------------------------------------------------------------------- /src/main/resources/uml/ProxyUml.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToryZhou/design-pattern/c9bcd6ae5cfb398e86d3af9a6a704e70a604b5cd/src/main/resources/uml/ProxyUml.png -------------------------------------------------------------------------------- /src/main/resources/uml/ProxyUml.puml: -------------------------------------------------------------------------------- 1 | @startuml 2 | title Proxy 3 | Interface GiveGift{ 4 | +giveDolls() 5 | +giveFlowers() 6 | +giveChocolate() 7 | } 8 | class Pursuit{ 9 | +giveDolls() 10 | +giveFlowers() 11 | +giveChocolate() 12 | } 13 | class Proxy{ 14 | -pursuit:Pursuit 15 | +giveDolls() 16 | +giveFlowers() 17 | +giveChocolate() 18 | } 19 | 20 | GiveGift <|.. Proxy 21 | GiveGift <|.. Pursuit 22 | Proxy -> Pursuit 23 | @enduml -------------------------------------------------------------------------------- /src/main/resources/uml/SimplefactoryUml.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToryZhou/design-pattern/c9bcd6ae5cfb398e86d3af9a6a704e70a604b5cd/src/main/resources/uml/SimplefactoryUml.png -------------------------------------------------------------------------------- /src/main/resources/uml/SimplefactoryUml.puml: -------------------------------------------------------------------------------- 1 | 2 | @startuml 3 | title Simple Factory 4 | abstract class Operation{ 5 | -numberA: double 6 | -numberB: double 7 | +calculate(): double 8 | } 9 | class OperationAddition{ 10 | +calculate(): double 11 | } 12 | class OperationSubtraction{ 13 | +calculate(): double 14 | } 15 | class OperationMultiplication{ 16 | +calculate(): double 17 | } 18 | class OperationDivision{ 19 | +calculate(): double 20 | } 21 | class OperationFactory{ 22 | +createOperation(): Operation 23 | } 24 | 25 | Operation <|-- OperationAddition 26 | Operation <|-- OperationSubtraction 27 | Operation <|-- OperationMultiplication 28 | Operation <|-- OperationDivision 29 | OperationFactory --> Operation: create 30 | @enduml -------------------------------------------------------------------------------- /src/main/resources/uml/SingletonUml.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToryZhou/design-pattern/c9bcd6ae5cfb398e86d3af9a6a704e70a604b5cd/src/main/resources/uml/SingletonUml.png -------------------------------------------------------------------------------- /src/main/resources/uml/SingletonUml.puml: -------------------------------------------------------------------------------- 1 | @startuml 2 | 3 | title Singleton 4 | 5 | class Hungry{ 6 | -hungry: Hungry 7 | -name 8 | -Hungry() 9 | +getInstance(): Hungry 10 | } 11 | class Lazy{ 12 | -lazy 13 | -name 14 | -Lazy() 15 | +getInstance(): Lazy 16 | } 17 | 18 | @enduml -------------------------------------------------------------------------------- /src/main/resources/uml/StateUml.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToryZhou/design-pattern/c9bcd6ae5cfb398e86d3af9a6a704e70a604b5cd/src/main/resources/uml/StateUml.png -------------------------------------------------------------------------------- /src/main/resources/uml/StateUml.puml: -------------------------------------------------------------------------------- 1 | @startuml 2 | 3 | title State 4 | 5 | abstract class State{ 6 | +writeProgram() 7 | } 8 | class ForenoonState{ 9 | +writeProgram() 10 | } 11 | class NoonState{ 12 | +writeProgram() 13 | } 14 | class AfternoonState{ 15 | +writeProgram() 16 | } 17 | class EveningState{ 18 | +writeProgram() 19 | } 20 | class SleepingState{ 21 | +writeProgram() 22 | } 23 | class RestState{ 24 | +writeProgram() 25 | } 26 | class Work{ 27 | -currentState: State 28 | +writeProgram() 29 | } 30 | 31 | Work <.. State 32 | Work o--> State 33 | State <|-- ForenoonState 34 | State <|-- NoonState 35 | State <|-- AfternoonState 36 | State <|-- EveningState 37 | State <|-- SleepingState 38 | State <|-- RestState 39 | 40 | @enduml -------------------------------------------------------------------------------- /src/main/resources/uml/StrategyUml.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToryZhou/design-pattern/c9bcd6ae5cfb398e86d3af9a6a704e70a604b5cd/src/main/resources/uml/StrategyUml.png -------------------------------------------------------------------------------- /src/main/resources/uml/StrategyUml.puml: -------------------------------------------------------------------------------- 1 | @startuml 2 | Title Strategy 3 | abstract class CashSuper{ 4 | +acceptCash(): double 5 | } 6 | 7 | class CashNormal{ 8 | +acceptCash(): double 9 | } 10 | class CashRebate{ 11 | -moneyRebate: double 12 | +acceptCash(): double 13 | } 14 | class CashReturn{ 15 | -moneyCondition: double 16 | -moneyReturn: double 17 | +acceptCash(): double 18 | } 19 | 20 | class CashContext{ 21 | -cashSuper: CashSuper 22 | +getResult(): double 23 | } 24 | 25 | CashSuper <|-- CashNormal 26 | CashSuper <|-- CashRebate 27 | CashSuper <|-- CashReturn 28 | 29 | CashContext o--> CashSuper 30 | @enduml -------------------------------------------------------------------------------- /src/main/resources/uml/TemplatemethodUml.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToryZhou/design-pattern/c9bcd6ae5cfb398e86d3af9a6a704e70a604b5cd/src/main/resources/uml/TemplatemethodUml.png -------------------------------------------------------------------------------- /src/main/resources/uml/TemplatemethodUml.puml: -------------------------------------------------------------------------------- 1 | @startuml 2 | 3 | title Template Method 4 | 5 | abstract class TestPaper{ 6 | +testQuestionOne() 7 | +testQuestionTwo() 8 | +testQuestionThree() 9 | #answerOne(): String 10 | #answerTwo(): String 11 | #answerThree(): String 12 | } 13 | class TestPaperA{ 14 | #answerOne(): String 15 | #answerTwo(): String 16 | #answerThree(): String 17 | } 18 | class TestPaperB{ 19 | #answerOne(): String 20 | #answerTwo(): String 21 | #answerThree(): String 22 | } 23 | 24 | TestPaper <|-- TestPaperA 25 | TestPaper <|-- TestPaperB 26 | 27 | @enduml -------------------------------------------------------------------------------- /src/main/resources/uml/VisitorUml.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToryZhou/design-pattern/c9bcd6ae5cfb398e86d3af9a6a704e70a604b5cd/src/main/resources/uml/VisitorUml.png -------------------------------------------------------------------------------- /src/main/resources/uml/VisitorUml.puml: -------------------------------------------------------------------------------- 1 | @startuml 2 | 3 | title Visitor 4 | 5 | abstract class Action{ 6 | +getManConclusion() 7 | +getWomanConclusion() 8 | } 9 | abstract class Person{ 10 | +accept() 11 | } 12 | class Man{ 13 | +accept() 14 | } 15 | class Woman{ 16 | +accept() 17 | } 18 | class Success{ 19 | +getManConclusion() 20 | +getWomanConclusion() 21 | } 22 | class Failing{ 23 | +getManConclusion() 24 | +getWomanConclusion() 25 | } 26 | class Amativeness{ 27 | +getManConclusion() 28 | +getWomanConclusion() 29 | } 30 | class Marriage{ 31 | +getManConclusion() 32 | +getWomanConclusion() 33 | } 34 | class ObjectStructure{ 35 | -personList: List 36 | +attach() 37 | +detach() 38 | +display() 39 | } 40 | 41 | Action <|-- Amativeness 42 | Action <|-- Marriage 43 | Action <|-- Success 44 | Action <|-- Failing 45 | ObjectStructure -> Person 46 | Person <|-- Man 47 | Person <|-- Woman 48 | 49 | @enduml -------------------------------------------------------------------------------- /src/test/java/com/job/designpattern/abstractfactory/AbstractFactoryTest.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.abstractfactory; 2 | 3 | import org.junit.Assert; 4 | import org.junit.Test; 5 | 6 | public class AbstractFactoryTest { 7 | @Test 8 | public void test() { 9 | User bill = new User("1", "Bill"); 10 | Department microsoft = new Department("1", "Microsoft"); 11 | User musk = new User("2", "Musk"); 12 | Department tesla = new Department("2", "Tesla"); 13 | 14 | IFactory sqlServerFactory = new SqlServerFactory(); 15 | IUser sqlServerUser = sqlServerFactory.createUser(); 16 | IDepartment sqlServerDepartment = sqlServerFactory.createDepartment(); 17 | sqlServerUser.insert(bill); 18 | sqlServerDepartment.insert(microsoft); 19 | Assert.assertEquals("Bill", SqlServer.getInstance().getUser("1").getName()); 20 | Assert.assertEquals("Microsoft", SqlServer.getInstance().getDepartment("1").getName()); 21 | 22 | IFactory accessFactory = new AccessFactory(); 23 | IUser accessUser = accessFactory.createUser(); 24 | IDepartment accessDepartment = accessFactory.createDepartment(); 25 | accessUser.insert(musk); 26 | accessDepartment.insert(tesla); 27 | Assert.assertEquals("Musk", Access.getInstance().getUser("2").getName()); 28 | Assert.assertEquals("Tesla", Access.getInstance().getDepartment("2").getName()); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /src/test/java/com/job/designpattern/adapter/AdapterTest.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.adapter; 2 | 3 | import org.junit.Assert; 4 | import org.junit.Test; 5 | 6 | public class AdapterTest { 7 | 8 | @Test 9 | public void test() { 10 | Player james = new Forwards("James"); 11 | Action jamesAttack = james.attack(); 12 | 13 | Player kobe = new Guards("Kobe"); 14 | Action kobeDefense = kobe.defense(); 15 | 16 | Player yaoMing = new Translator("YaoMing"); 17 | Action yaoMingAttack = yaoMing.attack(); 18 | Action yaoMingDefense = yaoMing.defense(); 19 | 20 | Assert.assertEquals("James", jamesAttack.getName()); 21 | Assert.assertEquals(Forwards.class.getName(), jamesAttack.getClazz()); 22 | Assert.assertEquals("attack", jamesAttack.getMethod()); 23 | 24 | Assert.assertEquals("defense",kobeDefense.getMethod()); 25 | 26 | Assert.assertEquals("YaoMing",yaoMingAttack.getName()); 27 | Assert.assertEquals(ForeignCenter.class.getName(),yaoMingAttack.getClazz()); 28 | Assert.assertEquals("attackForeign",yaoMingAttack.getMethod()); 29 | Assert.assertEquals("defenseForeign",yaoMingDefense.getMethod()); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /src/test/java/com/job/designpattern/bridge/BridgeTest.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.bridge; 2 | 3 | import org.junit.Assert; 4 | import org.junit.Test; 5 | 6 | public class BridgeTest { 7 | 8 | @Test 9 | public void test(){ 10 | HandsetBrand handsetBrand; 11 | handsetBrand = new HandsetBrandM(); 12 | handsetBrand.setHandsetSoft(new HandsetGame()); 13 | handsetBrand.run(); 14 | 15 | handsetBrand.setHandsetSoft(new HandsetAddressList()); 16 | handsetBrand.run(); 17 | 18 | handsetBrand = new HandsetBrandN(); 19 | handsetBrand.setHandsetSoft(new HandsetGame()); 20 | handsetBrand.run(); 21 | 22 | handsetBrand.setHandsetSoft(new HandsetAddressList()); 23 | handsetBrand.run(); 24 | 25 | Assert.assertEquals(HandsetGame.class.getSimpleName(),HandsetData.getInstance().getList().get(0)); 26 | Assert.assertEquals(HandsetAddressList.class.getSimpleName(),HandsetData.getInstance().getList().get(1)); 27 | Assert.assertEquals(HandsetGame.class.getSimpleName(),HandsetData.getInstance().getList().get(2)); 28 | Assert.assertEquals(HandsetAddressList.class.getSimpleName(),HandsetData.getInstance().getList().get(3)); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /src/test/java/com/job/designpattern/builder/BuilderTest.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.builder; 2 | 3 | import org.junit.Assert; 4 | import org.junit.Test; 5 | 6 | public class BuilderTest { 7 | 8 | @Test 9 | public void test() { 10 | PersonDirector personDirector = new PersonDirector(); 11 | PersonThinBuilder personThinBuilder = new PersonThinBuilder(); 12 | PersonFatBuilder personFatBuilder = new PersonFatBuilder(); 13 | 14 | personDirector.createPerson(personThinBuilder); 15 | Person personThin = personThinBuilder.getResult(); 16 | 17 | personDirector.createPerson(personFatBuilder); 18 | Person peronFat = personFatBuilder.getResult(); 19 | 20 | Assert.assertEquals(Person.HEAD + PersonThinBuilder.THIN, personThin.getHead()); 21 | Assert.assertEquals(Person.BODY + PersonFatBuilder.FAT, peronFat.getBody()); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/test/java/com/job/designpattern/chainofresponsibility/Chainofresponsibility.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.chainofresponsibility; 2 | 3 | import org.junit.Assert; 4 | import org.junit.Test; 5 | 6 | import java.util.List; 7 | 8 | public class Chainofresponsibility { 9 | 10 | @Test 11 | public void test(){ 12 | 13 | CommonManager musk = new CommonManager("Musk"); 14 | Majordomo zuckerberg = new Majordomo("Zuckerberg"); 15 | GeneralManager bill = new GeneralManager("Bill"); 16 | musk.setSuperior(zuckerberg); 17 | zuckerberg.setSuperior(bill); 18 | 19 | Request requestLeaveOneDay = new Request(); 20 | requestLeaveOneDay.setRequestType(Request.REQUEST_TYPE_LEAVE); 21 | requestLeaveOneDay.setNumber(1); 22 | musk.requestApplications(requestLeaveOneDay); 23 | 24 | Request requestLeaveFourDay = new Request(); 25 | requestLeaveFourDay.setRequestType(Request.REQUEST_TYPE_LEAVE); 26 | requestLeaveFourDay.setNumber(4); 27 | musk.requestApplications(requestLeaveFourDay); 28 | 29 | Request requestRaiseHundred = new Request(); 30 | requestRaiseHundred.setRequestType(Request.REQUEST_TYPE_RAISE); 31 | requestRaiseHundred.setNumber(100); 32 | musk.requestApplications(requestRaiseHundred); 33 | 34 | Request requestRaiseThousand = new Request(); 35 | requestRaiseThousand.setRequestType(Request.REQUEST_TYPE_RAISE); 36 | requestRaiseThousand.setNumber(1000); 37 | musk.requestApplications(requestRaiseThousand); 38 | 39 | List requestList = RequestData.getInstance().getRequestList(); 40 | Assert.assertEquals(4, requestList.size()); 41 | Assert.assertEquals(CommonManager.class.getSimpleName(), requestList.get(0).getHandler()); 42 | Assert.assertEquals(Request.STATUS_YES, requestList.get(0).getStatus()); 43 | 44 | Assert.assertEquals(Majordomo.class.getSimpleName(), requestList.get(1).getHandler()); 45 | Assert.assertEquals(Request.STATUS_YES, requestList.get(1).getStatus()); 46 | 47 | Assert.assertEquals(GeneralManager.class.getSimpleName(), requestList.get(2).getHandler()); 48 | Assert.assertEquals(Request.STATUS_YES, requestList.get(2).getStatus()); 49 | 50 | Assert.assertEquals(GeneralManager.class.getSimpleName(), requestList.get(3).getHandler()); 51 | Assert.assertEquals(Request.STATUS_NO, requestList.get(3).getStatus()); 52 | 53 | 54 | 55 | 56 | 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /src/test/java/com/job/designpattern/command/CommandTest.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.command; 2 | 3 | import org.junit.Assert; 4 | import org.junit.Test; 5 | 6 | public class CommandTest { 7 | 8 | @Test 9 | public void test() { 10 | Barbecuer barbecuer = new Barbecuer(); 11 | BakeMuttonCommand bakeMuttonCommand1 = new BakeMuttonCommand(barbecuer); 12 | BakeMuttonCommand bakeMuttonCommand2 = new BakeMuttonCommand(barbecuer); 13 | BakeChickenWingCommand bakeChickenWingCommand = new BakeChickenWingCommand(barbecuer); 14 | 15 | Waiter waiter = new Waiter(); 16 | waiter.setOrder(bakeMuttonCommand1); 17 | waiter.setOrder(bakeMuttonCommand2); 18 | waiter.setOrder(bakeChickenWingCommand); 19 | waiter.cancelOrder(bakeMuttonCommand2); 20 | 21 | waiter.inform(); 22 | 23 | Assert.assertEquals(1, CommandData.getInstance().getBakeList().size()); 24 | Assert.assertEquals("bakeMutton", CommandData.getInstance().getBakeList().get(0)); 25 | 26 | Assert.assertEquals(4, CommandData.getInstance().getLogList().size()); 27 | Assert.assertEquals("setOrder" + BakeMuttonCommand.class.getSimpleName(), CommandData.getInstance().getLogList().get(0)); 28 | Assert.assertEquals("setOrder" + BakeMuttonCommand.class.getSimpleName(), CommandData.getInstance().getLogList().get(1)); 29 | Assert.assertEquals("No chicken wing", CommandData.getInstance().getLogList().get(2)); 30 | Assert.assertEquals("cancelOrder" + BakeMuttonCommand.class.getSimpleName(), CommandData.getInstance().getLogList().get(3)); 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /src/test/java/com/job/designpattern/composite/CompositeTest.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.composite; 2 | 3 | import org.junit.Assert; 4 | import org.junit.Test; 5 | 6 | public class CompositeTest { 7 | 8 | @Test 9 | public void test() { 10 | ConcreteCompany worldCompany = new ConcreteCompany("World Company"); 11 | worldCompany.add(new HRCompany("World Company HR")); 12 | worldCompany.add(new FinanceCompany("World Company Finance")); 13 | 14 | ConcreteCompany asiaCompany = new ConcreteCompany("Asia Company"); 15 | asiaCompany.add(new HRCompany("Asia Company HR")); 16 | asiaCompany.add(new FinanceCompany("Asia Company Finance")); 17 | worldCompany.add(asiaCompany); 18 | 19 | ConcreteCompany chinaCompany = new ConcreteCompany("China Company"); 20 | chinaCompany.add(new HRCompany("China Company HR")); 21 | chinaCompany.add(new FinanceCompany("China Company Finance")); 22 | asiaCompany.add(chinaCompany); 23 | 24 | 25 | worldCompany.display(1); 26 | worldCompany.lineOfDuty(); 27 | 28 | Assert.assertEquals(3, Database.getInstance().getDuty("World Company HR").getDepth()); 29 | Assert.assertEquals(HRCompany.class.getSimpleName(), Database.getInstance().getDuty("World Company HR").getDutyName()); 30 | 31 | Assert.assertEquals(7, Database.getInstance().getDuty("China Company Finance").getDepth()); 32 | Assert.assertEquals(FinanceCompany.class.getSimpleName(), Database.getInstance().getDuty("China Company Finance").getDutyName()); 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /src/test/java/com/job/designpattern/decorator/DecoratorTest.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.decorator; 2 | 3 | import org.junit.Assert; 4 | import org.junit.Test; 5 | 6 | import java.util.ArrayList; 7 | import java.util.List; 8 | 9 | public class DecoratorTest { 10 | 11 | @Test 12 | public void test() { 13 | Person tong = new Person("Tong"); 14 | TShirts tShirts = new TShirts(); 15 | BigTrouser bigTrouser = new BigTrouser(); 16 | Sneakers sneakers = new Sneakers(); 17 | Suit suit = new Suit(); 18 | Tie tie = new Tie(); 19 | LeatherShoes leatherShoes = new LeatherShoes(); 20 | tShirts.decorate(tong); 21 | bigTrouser.decorate(tShirts); 22 | sneakers.decorate(bigTrouser); 23 | suit.decorate(sneakers); 24 | tie.decorate(suit); 25 | leatherShoes.decorate(tie); 26 | List fineryList = leatherShoes.putOn(new ArrayList<>()); 27 | 28 | Assert.assertEquals(LeatherShoes.class.getSimpleName(),fineryList.get(0)); 29 | Assert.assertEquals(Tie.class.getSimpleName(),fineryList.get(1)); 30 | Assert.assertEquals(Suit.class.getSimpleName(),fineryList.get(2)); 31 | Assert.assertEquals(Sneakers.class.getSimpleName(),fineryList.get(3)); 32 | Assert.assertEquals(BigTrouser.class.getSimpleName(),fineryList.get(4)); 33 | Assert.assertEquals(TShirts.class.getSimpleName(),fineryList.get(5)); 34 | Assert.assertEquals(Person.class.getSimpleName(),fineryList.get(6)); 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /src/test/java/com/job/designpattern/facade/FacadeTest.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.facade; 2 | 3 | import org.junit.Assert; 4 | import org.junit.Test; 5 | 6 | import java.util.ArrayList; 7 | import java.util.List; 8 | 9 | public class FacadeTest { 10 | 11 | @Test 12 | public void test() { 13 | Fund fund = new Fund(); 14 | List assetList = new ArrayList<>(); 15 | fund.buyFund(assetList); 16 | Assert.assertTrue(assetList.contains(NationalDept.class.getSimpleName())); 17 | Assert.assertTrue(assetList.contains(Realty.class.getSimpleName())); 18 | Assert.assertTrue(assetList.contains(Stock.class.getSimpleName())); 19 | fund.sellFund(assetList); 20 | Assert.assertTrue(assetList.isEmpty()); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/test/java/com/job/designpattern/factorymethod/FactoryMethodTest.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.factorymethod; 2 | 3 | import org.junit.Assert; 4 | import org.junit.Test; 5 | 6 | public class FactoryMethodTest { 7 | 8 | @Test 9 | public void test() { 10 | UndergraduateFactory undergraduateFactory = new UndergraduateFactory(); 11 | LeiFeng juniorStudent = undergraduateFactory.createLeiFeng(); 12 | juniorStudent.wash(); 13 | Assert.assertEquals(Undergraduate.class.getSimpleName(), juniorStudent.getWhichOne()); 14 | Assert.assertTrue(juniorStudent.isDoWash()); 15 | 16 | LeiFeng seniorStudent = undergraduateFactory.createLeiFeng(); 17 | seniorStudent.buyRice(); 18 | Assert.assertTrue(seniorStudent.isDoBuyRice()); 19 | Assert.assertFalse(seniorStudent.isDoWash()); 20 | 21 | VolunteerFactory volunteerFactory = new VolunteerFactory(); 22 | LeiFeng volunteer = volunteerFactory.createLeiFeng(); 23 | volunteer.sweep(); 24 | Assert.assertEquals(Volunteer.class.getSimpleName(), volunteer.getWhichOne()); 25 | Assert.assertTrue(volunteer.isDoSweep()); 26 | 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/test/java/com/job/designpattern/flyweight/FlyweightTest.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.flyweight; 2 | 3 | import org.junit.Assert; 4 | import org.junit.Test; 5 | 6 | import java.util.List; 7 | 8 | public class FlyweightTest { 9 | 10 | @Test 11 | public void test() { 12 | WebsiteFactory websiteFactory = new WebsiteFactory(); 13 | 14 | Website productX = websiteFactory.getWebsiteCategory("product"); 15 | productX.use(new User("Bill")); 16 | Website productY = websiteFactory.getWebsiteCategory("product"); 17 | productY.use(new User(("Musk"))); 18 | 19 | Website blogM = websiteFactory.getWebsiteCategory("blog"); 20 | blogM.use(new User("Zuckerberg")); 21 | Website blogN = websiteFactory.getWebsiteCategory("blog"); 22 | blogM.use(new User("Andy")); 23 | 24 | Assert.assertEquals(2, websiteFactory.getWebsiteCount()); 25 | List list = UseData.getInstance().getList(); 26 | Assert.assertEquals(4, list.size()); 27 | Assert.assertEquals("Bill use product", list.get(0)); 28 | Assert.assertEquals("Musk use product", list.get(1)); 29 | Assert.assertEquals("Zuckerberg use blog", list.get(2)); 30 | Assert.assertEquals("Andy use blog", list.get(3)); 31 | 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /src/test/java/com/job/designpattern/interpreter/InterpreterTest.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.interpreter; 2 | 3 | import org.junit.Assert; 4 | import org.junit.Test; 5 | 6 | public class InterpreterTest { 7 | 8 | @Test 9 | public void test() { 10 | PlayContext context = new PlayContext(); 11 | 12 | PlayData playData = PlayData.getInstance(); 13 | playData.setPlay("Shanghai"); 14 | String text = "T 500 O 2 E 0.5 G 0.5 A 3 E 0.5 G 0.5 D 3 E 0.5 G 0.5 A 0.5 O 3 C 1 O 2 A 0.5 G 1 C 0.5 E 0.5 D 3 "; 15 | context.setText(text); 16 | Expression expression = null; 17 | while (context.getText().length() > 0) { 18 | String str = context.getText().substring(0, 1); 19 | switch (str) { 20 | case "O": 21 | expression = new Scale(); 22 | break; 23 | case "T": 24 | expression = new Speed(); 25 | break; 26 | case "C": 27 | case "D": 28 | case "E": 29 | case "F": 30 | case "G": 31 | case "A": 32 | case "B": 33 | expression = new Note(); 34 | break; 35 | } 36 | assert expression != null; 37 | expression.interpret(context); 38 | } 39 | Assert.assertEquals("Shanghai medium mediant 3 5 6 3 5 2 3 5 6 alt 1 mediant 6 5 1 3 2", playData.getPlay()); 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /src/test/java/com/job/designpattern/iterator/IteratorTest.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.iterator; 2 | 3 | import org.junit.Assert; 4 | import org.junit.Test; 5 | 6 | import java.util.ArrayList; 7 | import java.util.Arrays; 8 | import java.util.List; 9 | 10 | public class IteratorTest { 11 | 12 | @Test 13 | public void test() { 14 | ConcreteAggregate concreteAggregate = new ConcreteAggregate(); 15 | concreteAggregate.add("A"); 16 | concreteAggregate.add("B"); 17 | concreteAggregate.add("C"); 18 | 19 | Iterator concreteIterator = new ConcreteIterator(concreteAggregate); 20 | Assert.assertEquals("A", concreteIterator.first()); 21 | Object[] objects = new Object[3]; 22 | while (!concreteIterator.isDone()) { 23 | objects[concreteIterator.current()] = concreteIterator.currentItem(); 24 | concreteIterator.next(); 25 | } 26 | Assert.assertArrayEquals(new Object[]{"A", "B", "C"}, objects); 27 | 28 | Iterator concreteIteratorDesc = new ConcreteIteratorDesc(concreteAggregate); 29 | Assert.assertEquals("C", concreteIteratorDesc.first()); 30 | List list = new ArrayList<>(); 31 | while (!concreteIteratorDesc.isDone()) { 32 | list.add(concreteIteratorDesc.currentItem()); 33 | concreteIteratorDesc.next(); 34 | } 35 | Assert.assertArrayEquals(new Object[]{"C", "B", "A"}, list.toArray()); 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /src/test/java/com/job/designpattern/mediator/MediatorTest.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.mediator; 2 | 3 | import org.junit.Assert; 4 | import org.junit.Test; 5 | 6 | import java.util.List; 7 | 8 | public class MediatorTest { 9 | 10 | @Test 11 | public void test() { 12 | UnitedNationsSecurityCouncil unitedNationsSecurityCouncil = new UnitedNationsSecurityCouncil(); 13 | USA usa = new USA(unitedNationsSecurityCouncil); 14 | Iran iran = new Iran(unitedNationsSecurityCouncil); 15 | unitedNationsSecurityCouncil.setUsa(usa); 16 | unitedNationsSecurityCouncil.setIran(iran); 17 | 18 | String usaDeclare = "Nuclear weapons are not allowed to be developed, or war will be launched."; 19 | usa.declare(usaDeclare); 20 | String iranDeclare = "We do not have nuclear weapons, and we are not afraid of aggression."; 21 | iran.declare(iranDeclare); 22 | 23 | List list = MessageData.getInstance().getList(); 24 | Assert.assertEquals(2, list.size()); 25 | Assert.assertEquals(Iran.class.getSimpleName() + "getMessage" + usaDeclare, list.get(0)); 26 | Assert.assertEquals(USA.class.getSimpleName() + "getMessage" + iranDeclare, list.get(1)); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/test/java/com/job/designpattern/memento/MementoTest.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.memento; 2 | 3 | import org.junit.Assert; 4 | import org.junit.Test; 5 | 6 | public class MementoTest { 7 | 8 | @Test 9 | public void test(){ 10 | GameRole gameRole = new GameRole(); 11 | gameRole.initState(); 12 | Assert.assertEquals(100,gameRole.getVitality()); 13 | Assert.assertEquals(100,gameRole.getAttack()); 14 | Assert.assertEquals(100,gameRole.getDefense()); 15 | 16 | RoleStateCaretaker roleStateCaretaker = new RoleStateCaretaker(); 17 | roleStateCaretaker.setRoleStateMemento(gameRole.saveState()); 18 | 19 | gameRole.fight(); 20 | Assert.assertEquals(0,gameRole.getVitality()); 21 | Assert.assertEquals(0,gameRole.getAttack()); 22 | Assert.assertEquals(0,gameRole.getDefense()); 23 | 24 | gameRole.recoveryState(roleStateCaretaker.getRoleStateMemento()); 25 | Assert.assertEquals(100,gameRole.getVitality()); 26 | Assert.assertEquals(100,gameRole.getAttack()); 27 | Assert.assertEquals(100,gameRole.getDefense()); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /src/test/java/com/job/designpattern/observer/ObserverTest.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.observer; 2 | 3 | import org.junit.Assert; 4 | import org.junit.Test; 5 | 6 | public class ObserverTest { 7 | 8 | @Test 9 | public void test(){ 10 | Boss boss = new Boss(); 11 | StockObserver bill = new StockObserver("Bill", boss); 12 | StockObserver musk = new StockObserver("Musk", boss); 13 | NBAObserver kobe = new NBAObserver("Kobe", boss); 14 | Assert.assertTrue(bill.isWatchingStock()); 15 | 16 | boss.attach(bill); 17 | boss.attach(musk); 18 | boss.attach(kobe); 19 | boss.detach(musk); 20 | boss.setStatus("Coming back"); 21 | boss.inform(); 22 | 23 | Assert.assertFalse(bill.isWatchingStock()); 24 | Assert.assertTrue(musk.isWatchingStock()); 25 | Assert.assertFalse(kobe.isWatchingNBA()); 26 | Assert.assertEquals("Coming back",bill.getStatus()); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/test/java/com/job/designpattern/prototyple/PrototypeTest.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.prototyple; 2 | 3 | import com.job.designpattern.prototype.Prize; 4 | import com.job.designpattern.prototype.Resume; 5 | import org.junit.Assert; 6 | import org.junit.Test; 7 | 8 | public class PrototypeTest { 9 | 10 | @Test 11 | public void test() throws CloneNotSupportedException { 12 | String internetWorker = "Internet Worker"; 13 | String blockChainWorker = "Block Chain Worker"; 14 | 15 | String theNobelPrizeName = "The Nobel Prize"; 16 | String turingAwardName = "Turing Award"; 17 | String academyAwardsName = "Academy Awards"; 18 | String awsAwardName = "AWS Award"; 19 | 20 | Resume resume = new Resume("Tony"); 21 | resume.setPersonalInfo("Male", 25); 22 | resume.setWorkExperience("2018-2020", internetWorker); 23 | resume.setPrize(new Prize(turingAwardName)); 24 | 25 | Resume resumeCloned = resume.clone(); 26 | Resume resumeDeepClone = resume.deepClone(); 27 | Resume resumeClonedNew = resume.clone(); 28 | 29 | resumeCloned.setPersonalInfo("Female",27); 30 | resumeDeepClone.setWorkExperience("2021-2023", blockChainWorker); 31 | 32 | Prize prize = resumeCloned.getPrize(); 33 | prize.setName(theNobelPrizeName); 34 | resumeCloned.setPrize(prize); 35 | 36 | Prize prizeDeep = resumeDeepClone.getPrize(); 37 | prizeDeep.setName(academyAwardsName); 38 | resumeDeepClone.setPrize(prizeDeep); 39 | 40 | resumeClonedNew.setPrize(new Prize(awsAwardName)); 41 | 42 | Assert.assertEquals("Male", resume.getSex()); 43 | Assert.assertEquals("Female", resumeCloned.getSex()); 44 | 45 | Assert.assertEquals(internetWorker, resume.getWorkExperience().getCompany()); 46 | Assert.assertEquals(blockChainWorker, resumeDeepClone.getWorkExperience().getCompany()); 47 | 48 | //原对象受浅拷贝对象引的影响 49 | Assert.assertEquals(theNobelPrizeName, resume.getPrize().getName()); 50 | //浅拷贝对象 51 | Assert.assertEquals(theNobelPrizeName, resumeCloned.getPrize().getName()); 52 | //深拷贝对象不会影响原对象的引用 53 | Assert.assertEquals(academyAwardsName, resumeDeepClone.getPrize().getName()); 54 | //浅拷贝的对象引用是新实例化出来时不会影响原对象 55 | Assert.assertEquals(awsAwardName, resumeClonedNew.getPrize().getName()); 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /src/test/java/com/job/designpattern/proxy/ProxyTest.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.proxy; 2 | 3 | import org.junit.Assert; 4 | import org.junit.Test; 5 | 6 | public class ProxyTest { 7 | 8 | @Test 9 | public void test(){ 10 | SchoolGirl schoolGirl = new SchoolGirl(); 11 | Assert.assertFalse(schoolGirl.isHasDolls()); 12 | Assert.assertFalse(schoolGirl.isHasFlowers()); 13 | Assert.assertFalse(schoolGirl.isHasChocolate()); 14 | Proxy proxy = new Proxy(schoolGirl); 15 | proxy.giveDolls(); 16 | proxy.giveFlowers(); 17 | proxy.giveChocolate(); 18 | Assert.assertTrue(schoolGirl.isHasDolls()); 19 | Assert.assertTrue(schoolGirl.isHasFlowers()); 20 | Assert.assertTrue(schoolGirl.isHasChocolate()); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/test/java/com/job/designpattern/simplefactory/SimpleFactoryTest.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.simplefactory; 2 | 3 | 4 | import org.junit.Assert; 5 | import org.junit.Test; 6 | 7 | public class SimpleFactoryTest { 8 | @Test 9 | public void test() { 10 | testOperation(OperationFactory.ADD, 32.5, 17.5, 50); 11 | testOperation(OperationFactory.SUB, 32.5, 17.5, 15); 12 | testOperation(OperationFactory.MUL, 5, 2.5, 12.5); 13 | testOperation(OperationFactory.DIV, 5, 2.5, 2); 14 | } 15 | 16 | private void testOperation(String type, double numberA, double numberB, double expected) { 17 | Operation operation = OperationFactory.createOperation(type); 18 | operation.setNumberA(numberA); 19 | operation.setNumberB(numberB); 20 | Assert.assertEquals(expected, operation.calculate(), 0); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/test/java/com/job/designpattern/singleton/SingletonTest.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.singleton; 2 | 3 | import org.junit.Assert; 4 | import org.junit.Test; 5 | 6 | public class SingletonTest { 7 | 8 | @Test 9 | public void test() { 10 | Lazy.getInstance().setName("A"); 11 | Assert.assertEquals("A", Lazy.getInstance().getName()); 12 | 13 | Hungry.getInstance().setName("B"); 14 | Assert.assertEquals("B", Hungry.getInstance().getName()); 15 | 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/test/java/com/job/designpattern/state/StateTest.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.state; 2 | 3 | import org.junit.Assert; 4 | import org.junit.Test; 5 | 6 | public class StateTest { 7 | 8 | @Test 9 | public void test() { 10 | Work work = new Work(); 11 | 12 | work.setHour(9); 13 | work.writeProgram(); 14 | Assert.assertEquals(ForenoonState.class.getSimpleName(), work.getStateName()); 15 | 16 | work.setHour(10); 17 | work.writeProgram(); 18 | Assert.assertEquals(ForenoonState.class.getSimpleName(), work.getStateName()); 19 | 20 | work.setHour(12); 21 | work.writeProgram(); 22 | Assert.assertEquals(NoonState.class.getSimpleName(), work.getStateName()); 23 | 24 | work.setHour(13); 25 | work.writeProgram(); 26 | Assert.assertEquals(AfternoonState.class.getSimpleName(), work.getStateName()); 27 | work.setHour(14); 28 | work.writeProgram(); 29 | Assert.assertEquals(AfternoonState.class.getSimpleName(), work.getStateName()); 30 | 31 | work.setHour(17); 32 | work.writeProgram(); 33 | Assert.assertEquals(EveningState.class.getSimpleName(), work.getStateName()); 34 | 35 | work.setHour(19); 36 | work.writeProgram(); 37 | Assert.assertEquals(EveningState.class.getSimpleName(), work.getStateName()); 38 | 39 | work.setHour(22); 40 | work.writeProgram(); 41 | Assert.assertEquals(SleepingState.class.getSimpleName(), work.getStateName()); 42 | 43 | work.setFinished(true); 44 | work.writeProgram(); 45 | Assert.assertEquals(RestState.class.getSimpleName(), work.getStateName()); 46 | } 47 | 48 | } 49 | -------------------------------------------------------------------------------- /src/test/java/com/job/designpattern/strategy/StrategyTest.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.strategy; 2 | 3 | import org.junit.Assert; 4 | import org.junit.Test; 5 | 6 | public class StrategyTest { 7 | 8 | @Test 9 | public void test() { 10 | testNormal(); 11 | testRebate(); 12 | testReturn(); 13 | } 14 | 15 | private void testNormal() { 16 | CashNormal cashNormal = new CashNormal(); 17 | CashContext cashContext = new CashContext(cashNormal); 18 | Assert.assertEquals(100, cashContext.getResult(100), 0); 19 | } 20 | 21 | private void testRebate() { 22 | CashRebate cashRebate = new CashRebate(0.8); 23 | CashContext cashContext = new CashContext(cashRebate); 24 | Assert.assertEquals(80, cashContext.getResult(100), 0); 25 | } 26 | 27 | private void testReturn() { 28 | CashReturn cashReturn = new CashReturn(300, 100); 29 | CashContext cashContext = new CashContext(cashReturn); 30 | Assert.assertEquals(500, cashContext.getResult(700), 0); 31 | Assert.assertEquals(50, cashContext.getResult(50), 0); 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /src/test/java/com/job/designpattern/templatemethod/TemplateMethodTest.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.templatemethod; 2 | 3 | import org.junit.Assert; 4 | import org.junit.Test; 5 | 6 | public class TemplateMethodTest { 7 | 8 | @Test 9 | public void test() { 10 | TestPaperA studentA = new TestPaperA(); 11 | studentA.testQuestionOne(); 12 | studentA.testQuestionTwo(); 13 | studentA.testQuestionThree(); 14 | Assert.assertEquals(TestPaper.TEST_QUESTION_ONE + TestPaperA.ANSWER_ONE, studentA.getAnswer1()); 15 | Assert.assertEquals(TestPaper.TEST_QUESTION_TWO + TestPaperA.ANSWER_TWO, studentA.getAnswer2()); 16 | Assert.assertEquals(TestPaper.TEST_QUESTION_THREE + TestPaperA.ANSWER_THREE, studentA.getAnswer3()); 17 | 18 | TestPaperB studentB = new TestPaperB(); 19 | studentB.testQuestionOne(); 20 | studentB.testQuestionTwo(); 21 | studentB.testQuestionThree(); 22 | Assert.assertEquals(TestPaper.TEST_QUESTION_ONE + TestPaperB.ANSWER_ONE, studentB.getAnswer1()); 23 | Assert.assertEquals(TestPaper.TEST_QUESTION_TWO + TestPaperB.ANSWER_TWO, studentB.getAnswer2()); 24 | Assert.assertEquals(TestPaper.TEST_QUESTION_THREE + TestPaperB.ANSWER_THREE, studentB.getAnswer3()); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/test/java/com/job/designpattern/visitor/VisitorTest.java: -------------------------------------------------------------------------------- 1 | package com.job.designpattern.visitor; 2 | 3 | import org.junit.Assert; 4 | import org.junit.Test; 5 | 6 | import java.util.List; 7 | 8 | public class VisitorTest { 9 | 10 | @Test 11 | public void test() { 12 | ObjectStructure objectStructure = new ObjectStructure(); 13 | objectStructure.attach(new Man()); 14 | objectStructure.attach(new Woman()); 15 | 16 | Success success = new Success(); 17 | objectStructure.display(success); 18 | 19 | Failing failing = new Failing(); 20 | objectStructure.display(failing); 21 | 22 | Amativeness amativeness = new Amativeness(); 23 | objectStructure.display(amativeness); 24 | 25 | Marriage marriage = new Marriage(); 26 | objectStructure.display(marriage); 27 | 28 | List list = ConclusionData.getInstance().getList(); 29 | Assert.assertEquals(8, list.size()); 30 | Assert.assertEquals(Man.class.getSimpleName() + success.getClass().getSimpleName(), list.get(0)); 31 | Assert.assertEquals(Woman.class.getSimpleName() + success.getClass().getSimpleName(), list.get(1)); 32 | Assert.assertEquals(Man.class.getSimpleName() + failing.getClass().getSimpleName(), list.get(2)); 33 | Assert.assertEquals(Woman.class.getSimpleName() + failing.getClass().getSimpleName(), list.get(3)); 34 | Assert.assertEquals(Man.class.getSimpleName() + amativeness.getClass().getSimpleName(), list.get(4)); 35 | Assert.assertEquals(Woman.class.getSimpleName() + amativeness.getClass().getSimpleName(), list.get(5)); 36 | Assert.assertEquals(Man.class.getSimpleName() + marriage.getClass().getSimpleName(), list.get(6)); 37 | Assert.assertEquals(Woman.class.getSimpleName() + marriage.getClass().getSimpleName(), list.get(7)); 38 | } 39 | } 40 | --------------------------------------------------------------------------------