├── .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 | [](https://gitter.im/design-p/Lobby?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
4 | [](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 | 
23 |
24 | 2. [策略模式(Strategy)](https://github.com/ToryZhou/design-pattern/tree/master/src/main/java/com/job/designpattern/strategy),
25 | 它定义了算法家族,分别封装起来,让它们之间可以相互替换,此模式让算法的变化,不会影响到使用算法的客户。
26 | 
27 |
28 | 3. [装饰模式(Decorator)](https://github.com/ToryZhou/design-pattern/tree/master/src/main/java/com/job/designpattern/decorator),
29 | 动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活。
30 | 
31 |
32 | 4. [代理模式(Proxy)](https://github.com/ToryZhou/design-pattern/tree/master/src/main/java/com/job/designpattern/proxy),
33 | 为其他对象提供一种代理以控制对这个对象的访问。
34 | 
35 |
36 | 5. [工厂方法模式(Factory Method)](https://github.com/ToryZhou/design-pattern/tree/master/src/main/java/com/job/designpattern/factorymethod),
37 | 定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到它的子类。
38 | 
39 |
40 | 6. [原型模式(Prototype)](https://github.com/ToryZhou/design-pattern/tree/master/src/main/java/com/job/designpattern/prototype),
41 | 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
42 | 
43 |
44 | 7. [模板方法模式(Template Method)](https://github.com/ToryZhou/design-pattern/tree/master/src/main/java/com/job/designpattern/templatemethod),
45 | 定义一个操作中的算法骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可以重定义该算法的某些特定步骤。
46 | 
47 |
48 | 8. [外观模式(Facade)](https://github.com/ToryZhou/design-pattern/tree/master/src/main/java/com/job/designpattern/facade),
49 | 又叫门面模式,为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
50 | 
51 |
52 | 9. [建造者模式(Builder)](https://github.com/ToryZhou/design-pattern/tree/master/src/main/java/com/job/designpattern/builder),
53 | 又叫生成器模式,将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
54 | 
55 |
56 | 10. [观察者模式(Observer)](https://github.com/ToryZhou/design-pattern/tree/master/src/main/java/com/job/designpattern/observer),
57 | 又叫发布-订阅模式(Publish/Subscribe), 定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。
58 | 
59 |
60 | 11. [抽象工厂模式(Abstract Factory)](https://github.com/ToryZhou/design-pattern/tree/master/src/main/java/com/job/designpattern/abstractfactory),
61 | 提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
62 | 
63 |
64 | 12. [状态模式(State)](https://github.com/ToryZhou/design-pattern/tree/master/src/main/java/com/job/designpattern/state),
65 | 当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。
66 | 
67 |
68 | 13. [适配器模式(Adapter)](https://github.com/ToryZhou/design-pattern/tree/master/src/main/java/com/job/designpattern/adapter),
69 | 将一个类的接口转换为客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以在一起工作。
70 | 
71 |
72 | 14. [备忘录模式(Memento)](https://github.com/ToryZhou/design-pattern/tree/master/src/main/java/com/job/designpattern/memento),
73 | 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样就可将该对象恢复到原先保存的状态。
74 | 
75 |
76 | 15. [组合模式(Composite)](https://github.com/ToryZhou/design-pattern/tree/master/src/main/java/com/job/designpattern/composite),
77 | 将对象组合成树形结构以表示‘部分-整体’的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。
78 | 
79 |
80 | 16. [迭代器模式(Iterator)](https://github.com/ToryZhou/design-pattern/tree/master/src/main/java/com/job/designpattern/iterator),
81 | 提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示。
82 | 
83 |
84 | 17. [单例模式(Singleton)](https://github.com/ToryZhou/design-pattern/tree/master/src/main/java/com/job/designpattern/singleton),
85 | 保证一个类仅有一个实例,并且提供一个访问它的全局访问点。
86 | 
87 |
88 | 18. [桥接模式(Bridge)](https://github.com/ToryZhou/design-pattern/tree/master/src/main/java/com/job/designpattern/bridge),
89 | 将抽象部分与它的实现部分分离,使它们都可以独立地变化。
90 | 
91 |
92 | 19. [命令模式(Command)](https://github.com/ToryZhou/design-pattern/tree/master/src/main/java/com/job/designpattern/command),
93 | 将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。
94 | 
95 |
96 | 20. [职责链模式(Chain of Responsibility)](https://github.com/ToryZhou/design-pattern/tree/master/src/main/java/com/job/designpattern/chainofresponsibility),
97 | 使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,知道有一个对象处理它为止。
98 | 
99 |
100 | 21. [中介者模式(Mediator)](https://github.com/ToryZhou/design-pattern/tree/master/src/main/java/com/job/designpattern/mediator),
101 | 又叫调停者模式,用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显示地相互作用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
102 | 
103 |
104 | 22. [亨元模式(Flyweight)](https://github.com/ToryZhou/design-pattern/tree/master/src/main/java/com/job/designpattern/flyweight),
105 | 运用共享技术有效地支持大量细粒度的对象。
106 | 
107 |
108 | 23. [解释器模式(Interpreter)](https://github.com/ToryZhou/design-pattern/tree/master/src/main/java/com/job/designpattern/interpreter),
109 | 给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。
110 | 
111 |
112 | 24. [访问者模式(Visitor)](https://github.com/ToryZhou/design-pattern/tree/master/src/main/java/com/job/designpattern/visitor),
113 | 表示一个作用于某对象结构中的各元素的操作。可以在不改变各元素的类的前提下定义作用于这些元素的新操作。
114 | 
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