├── src ├── structure │ ├── structure.md │ ├── proxy │ │ ├── staticProxy │ │ │ ├── Subject.java │ │ │ ├── RealSuject.java │ │ │ └── Proxy.java │ │ ├── dynamicProxy │ │ │ ├── Subject.java │ │ │ ├── RealSujectImpl.java │ │ │ └── SubjectInvocationHandler.java │ │ ├── proxy.md │ │ └── ProxyMain.java │ ├── bridge │ │ ├── abs │ │ │ ├── Implementor.java │ │ │ └── Abstraction.java │ │ ├── bridge.md │ │ ├── RefinedAbstraction.java │ │ ├── ConcreteImplementor.java │ │ └── BridgeMain.java │ ├── adapter │ │ ├── adapterAbs │ │ │ ├── IOtherInfo.java │ │ │ └── IUserInfo.java │ │ ├── adapter.md │ │ ├── AdapterMain.java │ │ ├── OtherUserInfo.java │ │ ├── MeUserInfo.java │ │ └── UserAdapter.java │ ├── decorator │ │ ├── decoratorAbs │ │ │ ├── SchoolReport.java │ │ │ └── Decorator.java │ │ ├── decoratorIml │ │ │ ├── FouthGradeSchoolReport.java │ │ │ ├── RankDecortaor.java │ │ │ ├── SuagrFouthGradeSchoolReport.java │ │ │ └── GoodBoyDecortaor.java │ │ ├── decorator.md │ │ └── DecoratorMain.java │ └── flyweight │ │ ├── flyweight.md │ │ ├── ConcreateFlyweight_1.java │ │ ├── flyweightAbs │ │ └── Flyweight.java │ │ ├── FlyweightFactory.java │ │ └── FlyweightMain.java ├── action │ ├── action.md │ ├── observer │ │ ├── observerAbs │ │ │ ├── Observer.java │ │ │ └── Subject.java │ │ ├── observer.md │ │ ├── observerIml │ │ │ ├── DiaoSi.java │ │ │ └── NvShen.java │ │ └── ObserverMain.java │ ├── visitor │ │ ├── visitorAbs │ │ │ ├── Element.java │ │ │ └── IVisitor.java │ │ ├── visitorIml │ │ │ ├── Visitor.java │ │ │ ├── ConcreateElementAdmin.java │ │ │ ├── ConcreateElementUser.java │ │ │ └── ObjectStruture.java │ │ ├── VisitorMain.java │ │ └── visitor.md │ ├── command │ │ ├── CommandMain.java │ │ ├── absCommand │ │ │ ├── Group.java │ │ │ └── Command.java │ │ ├── Invoker.java │ │ ├── command │ │ │ └── AddPageCommand.java │ │ ├── UI.java │ │ ├── Code.java │ │ ├── command.md │ │ └── Product.java │ ├── chainOfResponsibility │ │ ├── BossHandler.java │ │ ├── FinanceHandler.java │ │ ├── ManagerHandler.java │ │ ├── chainOfResponsibility.md │ │ ├── ChainOfReponsibilityMain.java │ │ └── abs │ │ │ └── Handler.java │ └── state │ │ ├── StateMain.java │ │ ├── absState │ │ ├── State.java │ │ └── Context.java │ │ └── allState │ │ ├── Run.java │ │ ├── Open.java │ │ ├── Stop.java │ │ └── Close.java ├── create │ ├── create.md │ ├── absFactory │ │ ├── abstractFactory.md │ │ ├── absHuman │ │ │ ├── AbsBlackHuman.java │ │ │ ├── AbsWhiteHuman.java │ │ │ └── AbsYellowHuman.java │ │ └── Human.java │ ├── factory │ │ ├── factory.md │ │ ├── Human.java │ │ ├── AbsHumanFactory.java │ │ ├── human │ │ │ ├── BlackHuman.java │ │ │ ├── YellowHuman.java │ │ │ └── WhiteHuman.java │ │ ├── factory │ │ │ └── HumanFactory.java │ │ └── FactoryMain.java │ ├── builder │ │ ├── XManBuilder.java │ │ ├── BuilderTest.java │ │ ├── WolverineDirector.java │ │ ├── XMan.java │ │ └── WolverineBuilder.java │ ├── prototype │ │ ├── prototype.md │ │ ├── ShallowCopy.java │ │ ├── DeepCopy.java │ │ ├── prototypeAbs │ │ │ └── BaseMessage.java │ │ └── PrototypeMain.java │ └── singleton │ │ └── Singleton.java └── Main.java ├── 策略模式.png ├── 观察者模式.png ├── XMind截图.png ├── XMindDescribe └── 设计模式.xmind ├── .idea ├── copyright │ └── profiles_settings.xml ├── description.html ├── markdown-navigator │ └── profiles_settings.xml ├── encodings.xml ├── vcs.xml ├── markdown-exported-files.xml ├── modules.xml ├── compiler.xml ├── misc.xml ├── markdown-navigator.xml └── uiDesigner.xml ├── README.md ├── ExamplesOfDesignPatterns.iml └── js ├── AMD.js ├── Object-DAO.js └── MVVM.js /src/structure/structure.md: -------------------------------------------------------------------------------- 1 | #结构型设计模式 2 | 3 | |包名|描述| 4 | |---|---| 5 | |proxy|代理模式| -------------------------------------------------------------------------------- /策略模式.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mirsfang/ExamplesOfDesignPatterns/HEAD/策略模式.png -------------------------------------------------------------------------------- /观察者模式.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mirsfang/ExamplesOfDesignPatterns/HEAD/观察者模式.png -------------------------------------------------------------------------------- /XMind截图.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mirsfang/ExamplesOfDesignPatterns/HEAD/XMind截图.png -------------------------------------------------------------------------------- /XMindDescribe/设计模式.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mirsfang/ExamplesOfDesignPatterns/HEAD/XMindDescribe/设计模式.xmind -------------------------------------------------------------------------------- /.idea/copyright/profiles_settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /.idea/description.html: -------------------------------------------------------------------------------- 1 | Simple Java application that includes a class with main() method -------------------------------------------------------------------------------- /src/action/action.md: -------------------------------------------------------------------------------- 1 | # 行为型设计模式 2 | 3 | | 包名 | 描述 | 4 | | ------- | ----- | 5 | | visitor | 访问者模式 | 6 | |observer|观察者模式| 7 | 8 | 9 | -------------------------------------------------------------------------------- /.idea/markdown-navigator/profiles_settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /src/create/create.md: -------------------------------------------------------------------------------- 1 | # 创建型设计模式 2 | 3 | | 包名 | 描述 | 4 | | ------- | ----- | 5 | | builder | 创建者模式 | 6 | |prototype|原型模式| 7 | |singleton|单例模式| 8 | |factory|工厂模式| -------------------------------------------------------------------------------- /src/create/absFactory/abstractFactory.md: -------------------------------------------------------------------------------- 1 | #抽象工厂 2 | 3 | > 概述:为创建一组相关或相互依赖的对象提供一个借口,而且无需指定他们的具体类 4 | 5 | 抽象工厂主要是用来创建不同的产品族的产品 有N个产品族,在抽象的工厂类里面就有N个创建的方法 6 | 7 | 例子还用工厂模式里的,,只是加了个性别,,, -------------------------------------------------------------------------------- /src/Main.java: -------------------------------------------------------------------------------- 1 | import java.util.HashMap; 2 | 3 | public class Main { 4 | 5 | public static void main(String[] args) { 6 | System.out.println("Hello World!"); 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /.idea/encodings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /src/create/factory/factory.md: -------------------------------------------------------------------------------- 1 | #工厂模式 2 | 3 | > 概述: 定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的初始化延迟至其子类 4 | 5 | 工厂模式在工作中也是随处可见的,Uml图上画的是女娲造人的例子,现在也拿过来用 6 | 7 | 需要的知识点: 8 | * 泛型 9 | * 反射 10 | 11 | 话不多说 搞起 -------------------------------------------------------------------------------- /.idea/markdown-exported-files.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /src/structure/proxy/staticProxy/Subject.java: -------------------------------------------------------------------------------- 1 | package structure.proxy.staticProxy; 2 | 3 | /*** 4 | *作者:MirsFang 5 | *模式:代理模式 6 | *时间:2017/2/28/ 7 | *备注 代理模式接口类 8 | ***/ 9 | public interface Subject { 10 | void request(); 11 | } 12 | -------------------------------------------------------------------------------- /src/structure/proxy/dynamicProxy/Subject.java: -------------------------------------------------------------------------------- 1 | package structure.proxy.dynamicProxy; 2 | 3 | /*** 4 | *作者:MirsFang 5 | *模式:代理模式 6 | *时间:2017/2/28/ 7 | *备注 动态代理接口类 8 | ***/ 9 | public interface Subject { 10 | 11 | 12 | void request(); 13 | 14 | } 15 | 16 | -------------------------------------------------------------------------------- /src/create/factory/Human.java: -------------------------------------------------------------------------------- 1 | package create.factory;/** 2 | * Created by MirsFang on 2017/5/5. 3 | */ 4 | 5 | /*** 6 | *作者:MirsFang 7 | *模式:工厂模式 8 | *时间:2017/05/05/上午10:15 9 | *备注 10 | ***/ 11 | 12 | public interface Human { 13 | void getColor(); 14 | } 15 | -------------------------------------------------------------------------------- /src/structure/bridge/abs/Implementor.java: -------------------------------------------------------------------------------- 1 | package structure.bridge.abs; 2 | 3 | 4 | /*** 5 | *作者:MirsFang 6 | *模式:桥接模式 7 | *时间:2017/03/01/下午12:34 8 | *备注 实现化角色 9 | ***/ 10 | public interface Implementor { 11 | public void doSomethingA(); 12 | public void doSomethingB(); 13 | } 14 | -------------------------------------------------------------------------------- /src/create/absFactory/absHuman/AbsBlackHuman.java: -------------------------------------------------------------------------------- 1 | package create.absFactory.absHuman;/** 2 | * Created by MirsFang on 2017/5/5. 3 | */ 4 | 5 | /*** 6 | *作者:MirsFang 7 | *模式: 8 | *时间:2017/05/05/上午11:19 9 | *备注 10 | ***/ 11 | 12 | public class AbsBlackHuman { 13 | } 14 | -------------------------------------------------------------------------------- /src/create/builder/XManBuilder.java: -------------------------------------------------------------------------------- 1 | package create.builder; 2 | 3 | 4 | /** 5 | * x战警builder 6 | * @author Chayne_Shen 2017/3/9 0009. 7 | * 8 | */ 9 | 10 | public interface XManBuilder { 11 | XManBuilder buildXFactor(); 12 | XManBuilder buildLover(); 13 | XMan buildXman(); 14 | } 15 | -------------------------------------------------------------------------------- /.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /src/action/observer/observerAbs/Observer.java: -------------------------------------------------------------------------------- 1 | package action.observer.observerAbs;/** 2 | * Created by MirsFang on 2017/3/3. 3 | */ 4 | 5 | /*** 6 | *作者:MirsFang 7 | *模式:观察者模式 8 | *时间:2017/03/03/下午1:00 9 | *备注 你。。。 10 | ***/ 11 | 12 | public interface Observer { 13 | public void Update(); 14 | } 15 | -------------------------------------------------------------------------------- /src/structure/proxy/staticProxy/RealSuject.java: -------------------------------------------------------------------------------- 1 | package structure.proxy.staticProxy; 2 | 3 | /*** 4 | *作者:MirsFang 5 | *模式:代理模式 6 | *时间:2017/2/28/ 7 | *备注 代理模式真实类 8 | ***/ 9 | public class RealSuject implements Subject { 10 | @Override 11 | public void request() { 12 | System.out.print("do request"); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/create/absFactory/Human.java: -------------------------------------------------------------------------------- 1 | package create.absFactory;/** 2 | * Created by MirsFang on 2017/5/5. 3 | */ 4 | 5 | /*** 6 | *作者:MirsFang 7 | *模式:抽象工厂 8 | *时间:2017/05/05/上午10:51 9 | *备注 抽象人接口 10 | ***/ 11 | 12 | public interface Human { 13 | 14 | public void getColor(); 15 | 16 | public void getSex(); 17 | 18 | } 19 | -------------------------------------------------------------------------------- /src/structure/bridge/bridge.md: -------------------------------------------------------------------------------- 1 | # 桥接模式 2 | 3 | 桥接模式又称桥梁模式。 4 | 5 | > 将抽象和实现解耦,使得两者可以独立的变化 6 | 7 | 类图在XMind文件中已经有了,可以看出他也是一个比较简单的模式,他有四个角色 8 | 9 | * Abstraction 抽象化角色;定义出该角色的行为,同事保存一个实现化角色的引用,一般为抽象类 10 | * Implementor 实现化角色 ;接口或者抽象类,定义角色必须的行为和属性 11 | * RefinedAbstraction 修正抽象化角色;引用实现化角色对抽象化角色进行修正 12 | * ConcreteImplementor 具体实现化角色 ;它实现接口或抽象类定义的方法和属性 13 | 14 | -------------------------------------------------------------------------------- /src/create/factory/AbsHumanFactory.java: -------------------------------------------------------------------------------- 1 | package create.factory;/** 2 | * Created by MirsFang on 2017/5/5. 3 | */ 4 | 5 | /*** 6 | *作者:MirsFang 7 | *模式:工厂模式 8 | *时间:2017/05/05/上午10:12 9 | *备注 抽象出来的工厂 10 | ***/ 11 | 12 | public abstract class AbsHumanFactory { 13 | public abstract T createHumen(Class tClass); 14 | } 15 | -------------------------------------------------------------------------------- /src/structure/proxy/proxy.md: -------------------------------------------------------------------------------- 1 | #代理模式 2 | 3 | > 为其他的对象提供一种可控制访问的当前对象的中间类 4 | 5 | 6 | ProxyMain 代理模式的运行测试类 7 | 8 | * 静态代理(staticProxy) 9 | 10 | |类名|描述| 11 | |-----|-----| 12 | |RealSubject|委托类| 13 | |Proxy|代理类| 14 | |Subject | 接口| 15 | 16 | *动态代理(dynamicProxy) 17 | 18 | |类名|描述| 19 | |-----|-----| 20 | |RealSubjectIml|委托类| 21 | |SubjectInvocationHandler|利用反射定义代理类的实现| 22 | |Subject| 接口| -------------------------------------------------------------------------------- /src/create/builder/BuilderTest.java: -------------------------------------------------------------------------------- 1 | package create.builder; 2 | 3 | /** 4 | * 测试类,生产一个金刚狼 5 | * @author Chayne_Shen 2017/3/10 0010. 6 | */ 7 | public class BuilderTest { 8 | public static void main(String[] args) { 9 | WolverineDirector director = new WolverineDirector(); 10 | XMan wolverine = director.constructWolverine(new WolverineBuilder()); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/create/factory/human/BlackHuman.java: -------------------------------------------------------------------------------- 1 | package create.factory.human;/** 2 | * Created by MirsFang on 2017/5/5. 3 | */ 4 | 5 | import create.factory.Human; 6 | 7 | /*** 8 | *作者:MirsFang 9 | *模式:工厂模式 10 | *时间:2017/05/05/上午10:25 11 | *备注 黑人 12 | ***/ 13 | 14 | public class BlackHuman implements Human { 15 | @Override 16 | public void getColor() { 17 | System.out.println("黑人"); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/create/factory/human/YellowHuman.java: -------------------------------------------------------------------------------- 1 | package create.factory.human;/** 2 | * Created by MirsFang on 2017/5/5. 3 | */ 4 | 5 | import create.factory.Human; 6 | 7 | /*** 8 | *作者:MirsFang 9 | *模式:工厂模式 10 | *时间:2017/05/05/上午10:22 11 | *备注 黄人 12 | ***/ 13 | 14 | public class YellowHuman implements Human { 15 | @Override 16 | public void getColor() { 17 | System.out.println("黄色人种"); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/create/factory/human/WhiteHuman.java: -------------------------------------------------------------------------------- 1 | package create.factory.human;/** 2 | * Created by MirsFang on 2017/5/5. 3 | */ 4 | 5 | import create.factory.Human; 6 | 7 | /*** 8 | *作者:MirsFang 9 | *模式:工厂模式 10 | *时间:2017/05/05/上午10:22 11 | *备注 白人 12 | ***/ 13 | 14 | public class WhiteHuman implements Human { 15 | @Override 16 | public void getColor() { 17 | System.out.println("白色人种"); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/structure/adapter/adapterAbs/IOtherInfo.java: -------------------------------------------------------------------------------- 1 | package structure.adapter.adapterAbs;/** 2 | * Created by MirsFang on 2017/3/10. 3 | */ 4 | 5 | import java.util.HashMap; 6 | 7 | /*** 8 | *作者:MirsFang 9 | *模式:适配器模式 10 | *时间:2017/03/10/下午12:52 11 | *备注 需要对接的用户接口类 12 | ***/ 13 | 14 | public interface IOtherInfo { 15 | HashMap getUserInfo(); 16 | HashMap getUserJobInfo(); 17 | } 18 | -------------------------------------------------------------------------------- /src/action/visitor/visitorAbs/Element.java: -------------------------------------------------------------------------------- 1 | package action.visitor.visitorAbs;/** 2 | * Created by MirsFang on 2017/3/2. 3 | */ 4 | 5 | /*** 6 | *作者:MirsFang 7 | *模式:访问者模式 8 | *时间:2017/03/02/下午12:28 9 | *备注 具体元素 10 | ***/ 11 | 12 | public abstract class Element { 13 | //定义访问逻辑 14 | public abstract void doVisite(); 15 | //定义谁能访问 16 | public abstract void accept(IVisitor iVisitor); 17 | } 18 | -------------------------------------------------------------------------------- /src/create/builder/WolverineDirector.java: -------------------------------------------------------------------------------- 1 | package create.builder; 2 | 3 | /** 4 | * 控制builder生产金刚狼 5 | * @author Chayne_Shen 2017/3/10 0010. 6 | */ 7 | 8 | public class WolverineDirector { 9 | public XMan constructWolverine(WolverineBuilder wolverineBuilder) { 10 | return wolverineBuilder 11 | .buildXFactor() 12 | .buildLover() 13 | .buildXman(); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/structure/proxy/dynamicProxy/RealSujectImpl.java: -------------------------------------------------------------------------------- 1 | package structure.proxy.dynamicProxy;/** 2 | * Created by MirsFang on 2017/2/28. 3 | */ 4 | 5 | /*** 6 | *作者:MirsFang 7 | *模式:代理模式 8 | *时间:2017/02/28/下午12:39 9 | *备注 动态代理真实类 10 | ***/ 11 | 12 | public class RealSujectImpl implements Subject { 13 | 14 | @Override 15 | public void request() { 16 | System.out.println("do request"); 17 | } 18 | 19 | } 20 | -------------------------------------------------------------------------------- /src/create/absFactory/absHuman/AbsWhiteHuman.java: -------------------------------------------------------------------------------- 1 | package create.absFactory.absHuman;/** 2 | * Created by MirsFang on 2017/5/5. 3 | */ 4 | 5 | import create.absFactory.Human; 6 | 7 | /*** 8 | *作者:MirsFang 9 | *模式:抽象工厂 10 | *时间:2017/05/05/上午11:03 11 | *备注 抽象白色人种 12 | ***/ 13 | 14 | public abstract class AbsWhiteHuman implements Human{ 15 | @Override 16 | public void getColor() { 17 | System.out.println("白色人种"); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/create/absFactory/absHuman/AbsYellowHuman.java: -------------------------------------------------------------------------------- 1 | package create.absFactory.absHuman;/** 2 | * Created by MirsFang on 2017/5/5. 3 | */ 4 | 5 | import create.absFactory.Human; 6 | 7 | /*** 8 | *作者:MirsFang 9 | *模式:抽象工厂模式 10 | *时间:2017/05/05/上午10:54 11 | *备注 抽象黄种人 12 | ***/ 13 | 14 | public abstract class AbsYellowHuman implements Human { 15 | @Override 16 | public void getColor() { 17 | System.out.println("黄种人"); 18 | } 19 | 20 | } 21 | -------------------------------------------------------------------------------- /src/action/observer/observerAbs/Subject.java: -------------------------------------------------------------------------------- 1 | package action.observer.observerAbs;/** 2 | * Created by MirsFang on 2017/3/3. 3 | */ 4 | 5 | /*** 6 | *作者:MirsFang 7 | *模式:观察者模式 8 | *时间:2017/03/03/下午12:59 9 | *备注 抽像女神(被观察者) 10 | ***/ 11 | 12 | public interface Subject { 13 | //添加一个观察者 14 | public void Attach(Observer observer); 15 | //删除一个观察者 16 | public void Detach(Observer observer); 17 | //通知所有的观察者 18 | public void Notify(); 19 | } 20 | -------------------------------------------------------------------------------- /src/structure/adapter/adapterAbs/IUserInfo.java: -------------------------------------------------------------------------------- 1 | package structure.adapter.adapterAbs;/** 2 | * Created by MirsFang on 2017/3/10. 3 | */ 4 | 5 | /*** 6 | *作者:MirsFang 7 | *模式:适配器模式 8 | *时间:2017/03/10/下午12:42 9 | *备注 抽象用户类 10 | ***/ 11 | 12 | public interface IUserInfo { 13 | //看名字就知道是啥。。这里就不写了 14 | String getUserName(); 15 | String getHomeAddress(); 16 | String getMobileNumber(); 17 | String getSex(); 18 | String getJobPosition(); 19 | } 20 | -------------------------------------------------------------------------------- /src/action/command/CommandMain.java: -------------------------------------------------------------------------------- 1 | package action.command;/** 2 | * Created by MirsFang on 2017/3/14. 3 | */ 4 | 5 | import action.command.command.AddPageCommand; 6 | 7 | /*** 8 | *作者:MirsFang 9 | *模式:命令模式 10 | *时间:2017/03/14/下午1:10 11 | *备注 执行类 12 | ***/ 13 | 14 | public class CommandMain { 15 | 16 | public static void main(String[] args) { 17 | Invoker invoker=new Invoker(); 18 | invoker.setCommand(new AddPageCommand()); 19 | invoker.Action(); 20 | } 21 | 22 | } 23 | -------------------------------------------------------------------------------- /src/action/command/absCommand/Group.java: -------------------------------------------------------------------------------- 1 | package action.command.absCommand;/** 2 | * Created by MirsFang on 2017/3/14. 3 | */ 4 | 5 | /*** 6 | *作者:MirsFang 7 | *模式: 命令模式 8 | *时间:2017/03/14/下午12:58 9 | *备注 抽象执行者 10 | ***/ 11 | 12 | public abstract class Group { 13 | //得到命令 14 | public abstract void getCommand(); 15 | //新增一个功能 16 | public abstract void doAdd(); 17 | //减去一个功能 18 | public abstract void doDel(); 19 | //开始实施 20 | public abstract void plan(); 21 | 22 | } 23 | -------------------------------------------------------------------------------- /src/action/visitor/visitorAbs/IVisitor.java: -------------------------------------------------------------------------------- 1 | package action.visitor.visitorAbs;/** 2 | * Created by MirsFang on 2017/3/2. 3 | */ 4 | 5 | import action.visitor.visitorIml.ConcreateElementAdmin; 6 | import action.visitor.visitorIml.ConcreateElementUser; 7 | 8 | /*** 9 | *作者:MirsFang 10 | *模式:访问者模式 11 | *时间:2017/03/02/下午12:26 12 | *备注 抽象访问者 13 | ***/ 14 | 15 | public interface IVisitor { 16 | //可以访问哪些对象 17 | public void visit(ConcreateElementUser user); 18 | public void visit(ConcreateElementAdmin admin); 19 | } 20 | -------------------------------------------------------------------------------- /src/action/chainOfResponsibility/BossHandler.java: -------------------------------------------------------------------------------- 1 | package action.chainOfResponsibility;/** 2 | * Created by MirsFang on 2017/3/6. 3 | */ 4 | 5 | import action.chainOfResponsibility.abs.Handler; 6 | 7 | /*** 8 | *作者:MirsFang 9 | *模式:责任链模式 10 | *时间:2017/03/06/下午12:45 11 | *备注 公司老板,方老板 12 | ***/ 13 | 14 | public class BossHandler extends Handler { 15 | 16 | @Override 17 | public int getLevel() { 18 | return 3; 19 | } 20 | 21 | @Override 22 | public String getnName() { 23 | return "方老板"; 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /src/action/chainOfResponsibility/FinanceHandler.java: -------------------------------------------------------------------------------- 1 | package action.chainOfResponsibility;/** 2 | * Created by MirsFang on 2017/3/6. 3 | */ 4 | 5 | import action.chainOfResponsibility.abs.Handler; 6 | 7 | /*** 8 | *作者:MirsFang 9 | *模式:责任链模式 10 | *时间:2017/03/06/下午12:45 11 | *备注 公司财务,李财务 12 | ***/ 13 | 14 | public class FinanceHandler extends Handler { 15 | 16 | @Override 17 | public int getLevel() { 18 | return 2; 19 | } 20 | 21 | @Override 22 | public String getnName() { 23 | return "李财务"; 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /src/action/chainOfResponsibility/ManagerHandler.java: -------------------------------------------------------------------------------- 1 | package action.chainOfResponsibility;/** 2 | * Created by MirsFang on 2017/3/6. 3 | */ 4 | 5 | import action.chainOfResponsibility.abs.Handler; 6 | 7 | /*** 8 | *作者:MirsFang 9 | *模式:责任链模式 10 | *时间:2017/03/06/下午12:45 11 | *备注 你的上司,牛经理 12 | ***/ 13 | 14 | public class ManagerHandler extends Handler { 15 | 16 | @Override 17 | public int getLevel() { 18 | return 1; 19 | } 20 | 21 | @Override 22 | public String getnName() { 23 | return "牛经理"; 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /src/action/command/absCommand/Command.java: -------------------------------------------------------------------------------- 1 | package action.command.absCommand;/** 2 | * Created by MirsFang on 2017/3/14. 3 | */ 4 | 5 | import action.command.Code; 6 | import action.command.Product; 7 | import action.command.UI; 8 | 9 | /*** 10 | *作者:MirsFang 11 | *模式: 命令模式 12 | *时间:2017/03/14/下午12:57 13 | *备注 处理命令 14 | ***/ 15 | 16 | public abstract class Command { 17 | protected Product product=new Product(); 18 | protected UI ui=new UI(); 19 | protected Code code =new Code(); 20 | //执行 21 | public abstract void execute(); 22 | } 23 | -------------------------------------------------------------------------------- /src/action/observer/observer.md: -------------------------------------------------------------------------------- 1 | # 观察者模式 2 | 3 | 观察者模式俗称 发布——》订阅模式,在平时开发中也被广泛运用,像Android中有名的EventBus,还有源码中的Android控件的事件监听模型,运用广泛,十分强大。 4 | 5 | > 定义对象间的一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于他的对象会得到通知并自动更新。 6 | 7 | 今天我们拿一个跟(wei)踪(sui)女神的案例来搞明白这个模式 8 | 9 | 10 | 11 | | 类名 | 描述 | 12 | | ------------ | -------------- | 13 | | Subject | 被观(wei)察(sui)者 | 14 | | Observer | 观察者(你) | 15 | | NvShen | 女神 (具体的被观察者) | 16 | | DiaoSi | 这。。。。。 | 17 | | ObserverMain | 观察者模式运行类 | 18 | 19 | 20 | 21 | 这边展示的只是一个很简单的观察者模式,如果运用注解、泛型和反射的话,会更加方便。 -------------------------------------------------------------------------------- /src/create/prototype/prototype.md: -------------------------------------------------------------------------------- 1 | # 原型模式(Prototype Pattern) 2 | 3 | > 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象 4 | 5 | 6 | 7 | 非常简单的一个模式 ,简单程度和单例,迭代器模式差不多,核心就是一个实现clone方法,通过这个进行对象的拷贝。他是内存二进制流的拷贝,比new一个对象来说性能好很多,特别是一个循环体内产生大量的对象、产生一个对象需要消耗很多资源的时候(数据,硬件),更能体现出原型模式的优点。 8 | 9 | 需要注意的问题: 10 | 11 | * 浅拷贝 12 | * 深拷贝 13 | * clone和final冲突 14 | 15 | 16 | 17 | 18 | 咱们今天拿群发消息来举例 19 | 20 | 21 | | 类名 | 描述 | 22 | | ------------- | ------- | 23 | | ShallowCopy | 浅拷贝 | 24 | | DeepCopy | 深拷贝 | 25 | | PrototypeMain | 原型模式执行类 | 26 | | BaseMessage | 基础消息类 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /src/structure/adapter/adapter.md: -------------------------------------------------------------------------------- 1 | # 适配器模式 2 | 3 | > 将一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法再一起工作的两个类能够在一起工作 4 | 5 | 适配器模式。,,,感觉不用多讲的样子。。算鸟 还是讲讲吧 6 | 7 | 适配器模式可以让两个没有任何关系的类在一起运行, 只要适配器这个角色能够搞定他们就好。(不要在详细设计阶段考虑他) 8 | 9 | (~ ̄▽ ̄)~ 10 | 11 | 12 | 13 | 场景 : 你们的应用需要对接另一款应用,但是两个应用的用户实体类不一样。 14 | 15 | 16 | 17 | | 类名 | 描述 | 18 | | ------------- | ----------- | 19 | | IUserInfo | 基础用户类 | 20 | | MeUserInfo | 我们自己的用户类 | 21 | | OtherUserInfo | 其他用户类的实现类 | 22 | | UserAdapter | 两种不同用户之间的适配 | 23 | | AdapterMain | 适配器模式执行类 | 24 | 25 | 26 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /src/action/command/Invoker.java: -------------------------------------------------------------------------------- 1 | package action.command;/** 2 | * Created by MirsFang on 2017/3/14. 3 | */ 4 | 5 | import action.command.absCommand.Command; 6 | 7 | /*** 8 | *作者:MirsFang 9 | *模式:命令模式 10 | *时间:2017/03/14/下午1:09 11 | *备注 负责人 12 | ***/ 13 | 14 | public class Invoker { 15 | private Command command; 16 | 17 | public void setCommand(Command command) { 18 | this.command = command; 19 | } 20 | 21 | public void setCommand(String str) { 22 | 23 | } 24 | 25 | public void Action() { 26 | this.command.execute(); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/action/visitor/visitorIml/Visitor.java: -------------------------------------------------------------------------------- 1 | package action.visitor.visitorIml;/** 2 | * Created by MirsFang on 2017/3/2. 3 | */ 4 | 5 | import action.visitor.visitorAbs.IVisitor; 6 | 7 | /*** 8 | *作者:MirsFang 9 | *模式: 访问者模式 10 | *时间:2017/03/02/下午12:33 11 | *备注 具体的访问者 12 | ***/ 13 | 14 | public class Visitor implements IVisitor { 15 | 16 | @Override 17 | public void visit(ConcreateElementUser user) { 18 | user.doVisite(); 19 | } 20 | 21 | @Override 22 | public void visit(ConcreateElementAdmin admin) { 23 | admin.doVisite(); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /src/structure/bridge/RefinedAbstraction.java: -------------------------------------------------------------------------------- 1 | package structure.bridge; 2 | 3 | import structure.bridge.abs.Abstraction; 4 | import structure.bridge.abs.Implementor; 5 | 6 | /*** 7 | *作者:MirsFang 8 | *模式:桥接模式 9 | *时间:2017/04/05/下午12:28 10 | *备注 具体抽象化角色 11 | ***/ 12 | 13 | public class RefinedAbstraction extends Abstraction { 14 | 15 | public RefinedAbstraction(Implementor implementor) { 16 | super(implementor); 17 | } 18 | 19 | @Override 20 | public void doSomethings() { 21 | super.doSomethings(); 22 | getImplementor().doSomethingB(); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/structure/bridge/ConcreteImplementor.java: -------------------------------------------------------------------------------- 1 | package structure.bridge;/** 2 | * Created by MirsFang on 2017/4/5. 3 | */ 4 | 5 | import structure.bridge.abs.Implementor; 6 | 7 | /*** 8 | *作者:MirsFang 9 | *模式:桥接模式 10 | *时间:2017/04/05/下午12:24 11 | *备注 具体实现类 12 | ***/ 13 | 14 | public class ConcreteImplementor implements Implementor { 15 | @Override 16 | public void doSomethingA() { 17 | System.out.println("bridge do something A"); 18 | } 19 | 20 | @Override 21 | public void doSomethingB() { 22 | System.out.println("bridge do something B"); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/structure/proxy/staticProxy/Proxy.java: -------------------------------------------------------------------------------- 1 | package structure.proxy.staticProxy; 2 | 3 | 4 | import structure.decorator.decoratorAbs.Decorator; 5 | 6 | /*** 7 | *作者:MirsFang 8 | *模式:代理模式 9 | *时间:2017/2/28/ 10 | *备注 代理模式代理类,他和装饰器模式的实现有点相近{@link Decorator} 11 | ***/ 12 | public class Proxy implements Subject { 13 | private Subject realSuject; 14 | 15 | public Proxy(Subject realSuject) { 16 | this.realSuject = realSuject; 17 | } 18 | 19 | @Override 20 | public void request() { 21 | if(realSuject!=null){ 22 | realSuject.request(); 23 | } 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /src/structure/adapter/AdapterMain.java: -------------------------------------------------------------------------------- 1 | package structure.adapter;/** 2 | * Created by MirsFang on 2017/3/10. 3 | */ 4 | 5 | import structure.adapter.adapterAbs.IUserInfo; 6 | 7 | /*** 8 | *作者:MirsFang 9 | *模式:适配器模式 10 | *时间:2017/03/10/下午1:04 11 | *备注 适配器模式执行类 12 | ***/ 13 | 14 | public class AdapterMain { 15 | public static void main(String[] args) { 16 | //得到一个其他的用户类型 17 | IUserInfo iUserInfo=new UserAdapter(); 18 | iUserInfo.getHomeAddress(); 19 | //得到一个自己的用户类 20 | IUserInfo iUserInfoMy=new MeUserInfo(); 21 | iUserInfoMy.getHomeAddress(); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/action/visitor/VisitorMain.java: -------------------------------------------------------------------------------- 1 | package action.visitor;/** 2 | * Created by MirsFang on 2017/3/2. 3 | */ 4 | 5 | import action.visitor.visitorAbs.Element; 6 | import action.visitor.visitorIml.ObjectStruture; 7 | import action.visitor.visitorIml.Visitor; 8 | 9 | /*** 10 | *作者:MirsFang 11 | *模式:访问者模式 12 | *时间:2017/03/02/下午12:38 13 | *备注 访问者模式主类 14 | ***/ 15 | 16 | public class VisitorMain { 17 | public static void main(String[] args) { 18 | for (int i = 0; i < 10; i++) { 19 | Element el= ObjectStruture.createElement(); 20 | el.accept(new Visitor()); 21 | } 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/action/state/StateMain.java: -------------------------------------------------------------------------------- 1 | package action.state;/** 2 | * Created by MirsFang on 2017/3/16. 3 | */ 4 | 5 | import action.state.absState.Context; 6 | import action.state.allState.Close; 7 | import action.state.allState.Run; 8 | 9 | /*** 10 | *作者:MirsFang 11 | *模式:状态模式 12 | *时间:2017/03/16/下午12:36 13 | *备注 执行类 14 | ***/ 15 | 16 | public class StateMain { 17 | public static void main(String[] args) { 18 | Context context=new Context(); 19 | context.setNowState(new Run()); 20 | context.open(); 21 | context.close(); 22 | context.run(); 23 | context.stop(); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /src/structure/bridge/abs/Abstraction.java: -------------------------------------------------------------------------------- 1 | package structure.bridge.abs;/** 2 | * Created by MirsFang on 2017/4/5. 3 | */ 4 | 5 | /*** 6 | *作者:MirsFang 7 | *模式:桥接模式 8 | *时间:2017/04/05/下午12:25 9 | *备注 抽象化角色 10 | ***/ 11 | 12 | public abstract class Abstraction{ 13 | private Implementor implementor; 14 | 15 | public Abstraction(Implementor implementor) { 16 | this.implementor = implementor; 17 | } 18 | 19 | public void doSomethings(){ 20 | implementor.doSomethingA(); 21 | } 22 | 23 | public Implementor getImplementor(){ 24 | return implementor; 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/structure/decorator/decoratorAbs/SchoolReport.java: -------------------------------------------------------------------------------- 1 | package structure.decorator.decoratorAbs;/** 2 | * Created by MirsFang on 2017/3/1. 3 | */ 4 | 5 | /*** 6 | *作者:MirsFang 7 | *模式: 装饰器模式 8 | *时间:2017/03/01/下午12:27 9 | *备注 成绩单抽象类 10 | ***/ 11 | 12 | public abstract class SchoolReport { 13 | 14 | /** 15 | * 16 | *作者:Mirsfang 17 | *日期:2017/3/1/下午12:29 18 | *描述:展示自己的成绩 19 | **/ 20 | public abstract void report(); 21 | 22 | /** 23 | * 24 | *作者:Mirsfang 25 | *日期:2017/3/1/下午12:29 26 | *描述:家长签名 27 | **/ 28 | public abstract void sign(String name); 29 | 30 | } 31 | -------------------------------------------------------------------------------- /src/structure/bridge/BridgeMain.java: -------------------------------------------------------------------------------- 1 | package structure.bridge;/** 2 | * Created by MirsFang on 2017/4/5. 3 | */ 4 | 5 | import structure.bridge.abs.Implementor; 6 | 7 | /*** 8 | *作者:MirsFang 9 | *模式:桥接模式 10 | *时间:2017/04/05/下午12:29 11 | *备注 执行类 12 | ***/ 13 | 14 | public class BridgeMain { 15 | 16 | 17 | public static void main(String[] args) { 18 | //实现化角色 19 | Implementor implementor=new ConcreteImplementor(); 20 | //抽象化角色 21 | RefinedAbstraction refinedAbstraction=new RefinedAbstraction(implementor); 22 | //抽象化角色搞事情 23 | refinedAbstraction.doSomethings(); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /src/action/state/absState/State.java: -------------------------------------------------------------------------------- 1 | package action.state.absState;/** 2 | * Created by MirsFang on 2017/3/16. 3 | */ 4 | 5 | /*** 6 | *作者:MirsFang 7 | *模式:状态模式 8 | *时间:2017/03/16/下午12:13 9 | *备注 抽象状态角色 10 | ***/ 11 | 12 | public abstract class State { 13 | protected Context context; 14 | 15 | //设置状态 16 | public void setContext(Context context) { 17 | this.context = context; 18 | } 19 | 20 | //电梯门开启的动作 21 | public abstract void open(); 22 | //电梯门关闭的动作 23 | public abstract void close(); 24 | //电梯运行起来 25 | public abstract void run(); 26 | //电梯停下来 27 | public abstract void stop(); 28 | } 29 | -------------------------------------------------------------------------------- /src/create/builder/XMan.java: -------------------------------------------------------------------------------- 1 | package create.builder; 2 | /** 3 | * x战警通用属性 4 | * @author Chayne_Shen 2017/3/10 0010. 5 | */ 6 | 7 | public class XMan { 8 | private String xFactor; 9 | private String lover; 10 | 11 | public String getxFactor() { 12 | return xFactor; 13 | } 14 | 15 | public XMan setxFactor(String xFactor) { 16 | this.xFactor = xFactor; 17 | return this; 18 | } 19 | 20 | public String getLover() { 21 | return lover; 22 | } 23 | 24 | public XMan setLover(String lover) { 25 | this.lover = lover; 26 | return this; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/structure/decorator/decoratorIml/FouthGradeSchoolReport.java: -------------------------------------------------------------------------------- 1 | package structure.decorator.decoratorIml;/** 2 | * Created by MirsFang on 2017/3/1. 3 | */ 4 | 5 | import structure.decorator.decoratorAbs.SchoolReport; 6 | 7 | /*** 8 | *作者:MirsFang 9 | *模式:装饰器模式 10 | *时间:2017/03/01/下午12:30 11 | *备注 四年级成绩单 12 | ***/ 13 | 14 | public class FouthGradeSchoolReport extends SchoolReport { 15 | 16 | 17 | @Override 18 | public void report() { 19 | System.out.print("数学60,语文:80,英语:90"); 20 | } 21 | 22 | @Override 23 | public void sign(String name) { 24 | System.out.println("家长签名 : "+name); 25 | } 26 | 27 | } 28 | -------------------------------------------------------------------------------- /src/action/command/command/AddPageCommand.java: -------------------------------------------------------------------------------- 1 | package action.command.command;/** 2 | * Created by MirsFang on 2017/3/14. 3 | */ 4 | 5 | import action.command.absCommand.Command; 6 | 7 | /*** 8 | *作者:MirsFang 9 | *模式:命令模式 10 | *时间:2017/03/14/下午1:06 11 | *备注 新增一个页面 12 | ***/ 13 | 14 | public class AddPageCommand extends Command { 15 | @Override 16 | public void execute() { 17 | product.getCommand(); 18 | ui.getCommand(); 19 | code.getCommand(); 20 | 21 | product.doAdd(); 22 | product.plan(); 23 | ui.doAdd(); 24 | ui.plan(); 25 | code.doAdd(); 26 | code.plan(); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/structure/flyweight/flyweight.md: -------------------------------------------------------------------------------- 1 | # 享元模式(Flyweight Pattern) 2 | 3 | 享元模式是池技术的实现方式。 4 | 5 | > 使共享对象可有效地支持大量细粒度的对象 6 | 7 | 说白了就是通过共享对象去支持大量的不同对象 8 | 9 | 我们都知道new一个对象是需要成本的,CPU成本和内存成本,当你需要new出大量的对象的时候(尤其是在服务端,比如说商品抢购,瞬间订单量指数增加),特别容易造成内存溢出导致宕机。 10 | 11 | 这里需要用两个概念 12 | 13 | * 内部状态 14 | * 对象可共享出来的信息,存储在对象内部不会随环境改变而改变 15 | * 外部状态 16 | * 外部状态是对象得以依赖的一个标记,是随环境改变而改变,不可共享的状态 17 | 18 | 19 | 20 | | 类名 | 描述 | 21 | | -------------------- | ------- | 22 | | Flyweight | 抽象享元对象 | 23 | | ConcreateFlyweight_1 | 具体享元对象 | 24 | | FlyweightFactory | 享元工厂 | 25 | | FlyweightMain | 享元模式执行类 | 26 | 27 | 一个外部状态,对应一个对象,其他的实例都是基于这个对象。 28 | 29 | -------------------------------------------------------------------------------- /src/action/visitor/visitorIml/ConcreateElementAdmin.java: -------------------------------------------------------------------------------- 1 | package action.visitor.visitorIml;/** 2 | * Created by MirsFang on 2017/3/2. 3 | */ 4 | 5 | import action.visitor.visitorAbs.Element; 6 | import action.visitor.visitorAbs.IVisitor; 7 | 8 | /*** 9 | *作者:MirsFang 10 | *模式: 访问者模式 11 | *时间:2017/03/02/下午12:31 12 | *备注 具体元素--管理员 13 | ***/ 14 | 15 | public class ConcreateElementAdmin extends Element { 16 | @Override 17 | public void doVisite() { 18 | System.out.println("我是管理员 活动了20分种,系统操作:删除了好多文件 ***********"); 19 | } 20 | 21 | @Override 22 | public void accept(IVisitor iVisitor) { 23 | iVisitor.visit(this); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /src/structure/flyweight/ConcreateFlyweight_1.java: -------------------------------------------------------------------------------- 1 | package structure.flyweight;/** 2 | * Created by MirsFang on 2017/3/9. 3 | */ 4 | 5 | import structure.flyweight.flyweightAbs.Flyweight; 6 | 7 | import java.util.Random; 8 | 9 | /*** 10 | *作者:MirsFang 11 | *模式:享元模式 12 | *时间:2017/03/09/下午12:35 13 | *备注 具体享元对象 14 | ***/ 15 | 16 | public class ConcreateFlyweight_1 extends Flyweight{ 17 | 18 | //接受外部状态 19 | public ConcreateFlyweight_1(String extrinsic) { 20 | super(extrinsic); 21 | } 22 | 23 | //根据外部状态进行逻辑处理 24 | @Override 25 | public void operate() { 26 | System.out.println(Extrinsic+"订单,订单编号"+new Random().nextInt(99999)); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/action/chainOfResponsibility/chainOfResponsibility.md: -------------------------------------------------------------------------------- 1 | # 责任链模式 2 | 3 | 相信大家对责任链模式都很熟悉,多多少收都知道点,这次我们拿公司的财务报销来描述责任链模式, 4 | 5 | > 使多个对象都有机会处理请求,从而避免了请求的发送者和接受者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止。 6 | 7 | 8 | 9 | | 类名 | 描述 | 10 | | ------------------------ | ----------- | 11 | | Handler | 抽象处理者 | 12 | | ManagerHandler | 具体处理者(你的上司) | 13 | | FinanceHandler | 具体处理者(公司) | 14 | | BossHandler | 具体处理者(公司老板) | 15 | | ChainOfReponsibilityMain | 执行类(主方法—>你) | 16 | 17 | 假设 上司的能审批的金额level为 1,财务的level 为2,boss的level为3 18 | 19 | 20 | 21 | 责任链模式是一个运用递归思想来解决问题的模式,看代码就是像链表一样,优点是将请求和处理分开,请求者不必知道处理者是谁,处理者也可以不用知道请求的全貌,缺点也就比较明显:一是性能问题(遍历),二是调试不方便 -------------------------------------------------------------------------------- /src/structure/decorator/decoratorAbs/Decorator.java: -------------------------------------------------------------------------------- 1 | package structure.decorator.decoratorAbs;/** 2 | * Created by MirsFang on 2017/3/1. 3 | */ 4 | 5 | 6 | /*** 7 | *作者:MirsFang 8 | *模式:装饰器模式 9 | *时间:2017/03/01/下午12:48 10 | *备注 抽象装饰器 这种方式看起来和静态代理模式很像 {@link structure.proxy.staticProxy.Proxy } 11 | ***/ 12 | 13 | public abstract class Decorator extends SchoolReport { 14 | private SchoolReport schoolReport; 15 | 16 | public Decorator(SchoolReport schoolReport) { 17 | this.schoolReport = schoolReport; 18 | } 19 | 20 | public void report(){ 21 | schoolReport.report(); 22 | } 23 | 24 | @Override 25 | public void sign(String name) { 26 | schoolReport.sign(name); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/action/command/UI.java: -------------------------------------------------------------------------------- 1 | package action.command;/** 2 | * Created by MirsFang on 2017/3/14. 3 | */ 4 | 5 | import action.command.absCommand.Group; 6 | 7 | /*** 8 | *作者:MirsFang 9 | *模式:命令模式 10 | *时间:2017/03/14/下午1:01 11 | *备注 UI 12 | ***/ 13 | 14 | public class UI extends Group { 15 | 16 | 17 | @Override 18 | public void getCommand() { 19 | System.out.println("UI收到命令"); 20 | } 21 | 22 | @Override 23 | public void doAdd() { 24 | System.out.println("UI新增了一个页面"); 25 | } 26 | 27 | @Override 28 | public void doDel() { 29 | System.out.println("UI去掉了一个页面"); 30 | } 31 | 32 | @Override 33 | public void plan() { 34 | System.out.println("UI变更完毕"); 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /src/action/command/Code.java: -------------------------------------------------------------------------------- 1 | package action.command;/** 2 | * Created by MirsFang on 2017/3/14. 3 | */ 4 | 5 | import action.command.absCommand.Group; 6 | 7 | /*** 8 | *作者:MirsFang 9 | *模式:命令模式 10 | *时间:2017/03/14/下午1:01 11 | *备注 你自己 12 | ***/ 13 | 14 | public class Code extends Group { 15 | 16 | 17 | @Override 18 | public void getCommand() { 19 | System.out.println("开发收到命令"); 20 | } 21 | 22 | @Override 23 | public void doAdd() { 24 | System.out.println("开发新写了一个页面"); 25 | } 26 | 27 | @Override 28 | public void doDel() { 29 | System.out.println("开发注释了一个页面"); 30 | } 31 | 32 | @Override 33 | public void plan() { 34 | System.out.println("开发变更完毕"); 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /src/action/command/command.md: -------------------------------------------------------------------------------- 1 | # 命令模式(Command Pattern) 2 | 3 | > 将请求 封装成一个对象,从而让你使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提命令的撤销和恢复功能 4 | 5 | 话不多说 直接撸码 6 | 7 | 举个栗子 8 | 9 | 在平时开发中 基本上都是老板一个命令,然后下面的人都要XXXX(此处省略32个字) 10 | 11 | 12 | 13 | 比如你们有以下几个(产品,UI,开发)小组,老板每次都直接找需求,找UI,或者找开发,直接改东西(自行想象老板让开发的搞完之后产品不知道,UI也不知道,让UI改完之后开发不知道吧啦啦啦啦小魔仙。。等等) 14 | 15 | 16 | 17 | 于是乎,,, 18 | 19 | 20 | 21 | 上代码 22 | 23 | 24 | 25 | | 类名 | 描述 | 26 | | -------------- | ------ | 27 | | Command | 处理命令 | 28 | | Group | 抽象执行者 | 29 | | AddPageCommand | 新增一个页面 | 30 | | Invoker | 负责人 | 31 | | Code | 你自己 | 32 | | Product | 产品经理 | 33 | | UI | UI | 34 | 35 | 36 | 37 | 38 | 39 | 优缺点请参考XMind文件里的总结 40 | 41 | -------------------------------------------------------------------------------- /src/action/command/Product.java: -------------------------------------------------------------------------------- 1 | package action.command;/** 2 | * Created by MirsFang on 2017/3/14. 3 | */ 4 | 5 | import action.command.absCommand.Group; 6 | 7 | /*** 8 | *作者:MirsFang 9 | *模式:命令模式 10 | *时间:2017/03/14/下午1:01 11 | *备注 产品经理 12 | ***/ 13 | 14 | public class Product extends Group { 15 | 16 | 17 | @Override 18 | public void getCommand() { 19 | System.out.println("产品经理收到命令"); 20 | } 21 | 22 | @Override 23 | public void doAdd() { 24 | System.out.println("产品经理新增了一个需求"); 25 | } 26 | 27 | @Override 28 | public void doDel() { 29 | System.out.println("产品经理砍掉了一个需求"); 30 | } 31 | 32 | @Override 33 | public void plan() { 34 | System.out.println("产品变更完毕"); 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /src/action/visitor/visitorIml/ConcreateElementUser.java: -------------------------------------------------------------------------------- 1 | package action.visitor.visitorIml;/** 2 | * Created by MirsFang on 2017/3/2. 3 | */ 4 | 5 | import action.visitor.visitorAbs.Element; 6 | import action.visitor.visitorAbs.IVisitor; 7 | 8 | import java.util.Random; 9 | 10 | /*** 11 | *作者:MirsFang 12 | *模式:访问者模式 13 | *时间:2017/03/02/下午12:30 14 | *备注 具体元素--用户 15 | ***/ 16 | 17 | public class ConcreateElementUser extends Element { 18 | 19 | @Override 20 | public void doVisite() { 21 | Random random=new Random(); 22 | System.out.println("我是用户,在线时长 "+random.nextInt(100)+" 分钟 ***********"); 23 | } 24 | 25 | @Override 26 | public void accept(IVisitor iVisitor) { 27 | iVisitor.visit(this); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /src/structure/decorator/decoratorIml/RankDecortaor.java: -------------------------------------------------------------------------------- 1 | package structure.decorator.decoratorIml;/** 2 | * Created by MirsFang on 2017/3/1. 3 | */ 4 | 5 | import structure.decorator.decoratorAbs.Decorator; 6 | import structure.decorator.decoratorAbs.SchoolReport; 7 | 8 | /*** 9 | *作者:MirsFang 10 | *模式:装饰器模式 11 | *时间:2017/03/01/下午12:53 12 | *备注 装饰学校排名 13 | ***/ 14 | 15 | public class RankDecortaor extends Decorator { 16 | 17 | public RankDecortaor(SchoolReport schoolReport) { 18 | super(schoolReport); 19 | } 20 | 21 | private void rankDecortaor(){ 22 | System.out.println("在学校排名也很靠前"); 23 | } 24 | 25 | @Override 26 | public void report() { 27 | rankDecortaor(); 28 | super.report(); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /src/create/prototype/ShallowCopy.java: -------------------------------------------------------------------------------- 1 | package create.prototype;/** 2 | * Created by MirsFang on 2017/3/8. 3 | */ 4 | 5 | import com.sun.xml.internal.rngom.parse.host.Base; 6 | import create.prototype.prototypeAbs.BaseMessage; 7 | 8 | /*** 9 | *作者:MirsFang 10 | *模式: 原型模式 11 | *时间:2017/03/08/下午12:21 12 | *备注 浅拷贝的对象 13 | ***/ 14 | 15 | public class ShallowCopy extends BaseMessage implements Cloneable { 16 | 17 | @Override 18 | protected Object clone() throws CloneNotSupportedException { 19 | ShallowCopy shallowCopy=null; 20 | try { 21 | shallowCopy= (ShallowCopy) super.clone(); 22 | }catch (Exception e){ 23 | e.printStackTrace(); 24 | } 25 | return shallowCopy; 26 | } 27 | 28 | 29 | } 30 | -------------------------------------------------------------------------------- /src/structure/decorator/decoratorIml/SuagrFouthGradeSchoolReport.java: -------------------------------------------------------------------------------- 1 | package structure.decorator.decoratorIml;/** 2 | * Created by MirsFang on 2017/3/1. 3 | */ 4 | 5 | import structure.decorator.decoratorIml.FouthGradeSchoolReport; 6 | 7 | /*** 8 | *作者:MirsFang 9 | *模式:装饰器模式 10 | *时间:2017/03/01/下午12:38 11 | *备注 12 | ***/ 13 | 14 | public class SuagrFouthGradeSchoolReport extends FouthGradeSchoolReport { 15 | 16 | /** 17 | * 18 | *作者:Mirsfang 19 | *日期:2017/3/1/下午12:39 20 | *描述:先把最高成绩说出去 21 | **/ 22 | private void reportHighSorce(){ 23 | System.out.print("我英语得了90分,语文得了80分"); 24 | } 25 | 26 | @Override 27 | public void report() { 28 | reportHighSorce(); 29 | super.report(); 30 | } 31 | } 32 | 33 | -------------------------------------------------------------------------------- /src/action/visitor/visitor.md: -------------------------------------------------------------------------------- 1 | #访问者模式 2 | 3 | > 封装一些作用于某些数据结构中的各元素的操作,它可以在不改变数据结构的前提下定义作用于这些元素的新操作 4 | 5 | 6 | 这边我们拿经常遇见的获取用户信息的例子 7 | 8 | VisitorMain是用户,他现在想要知道这里面所有用户活动的信息,在当前系统里面有两种用户 9 | * 普通用户 ConcreateElementUser 活动信息只有在线时长 10 | * 管理员用户 ConcreateElementAdmin 活动信息包括在线时长与系统操作 11 | 12 | 如何统一列出他们的信息 13 | 14 | 15 | 16 | | 类名 | 描述 | 17 | | --------------------- | ------------------------ | 18 | | Element | 具体的元素 | 19 | | IVisitor | 抽象访问者 | 20 | | ConcreateElementAdmin | 具体元素--管理员 | 21 | | ConcreateElementUser | 具体元素--用户 | 22 | | ObjectStruture | 结构对象,获取一个Element,现实中的数据源 | 23 | | Visitor | 具体的访问者 | 24 | 25 | -------------------------------------------------------------------------------- /src/action/visitor/visitorIml/ObjectStruture.java: -------------------------------------------------------------------------------- 1 | package action.visitor.visitorIml;/** 2 | * Created by MirsFang on 2017/3/2. 3 | */ 4 | 5 | import action.visitor.visitorAbs.Element; 6 | 7 | import java.util.Random; 8 | 9 | /*** 10 | *作者:MirsFang 11 | *模式:访问者模式 12 | *时间:2017/03/02/下午12:36 13 | *备注 结构对象,获取一个Element,现实中的数据源 14 | ***/ 15 | 16 | public class ObjectStruture { 17 | /** 18 | * 19 | *作者:Mirsfang 20 | *日期:2017/3/2/下午12:37 21 | *描述:返回一个具体的Element 22 | **/ 23 | public static Element createElement(){ 24 | Random random=new Random(); 25 | if(random.nextInt(100)>50){ 26 | return new ConcreateElementUser(); 27 | }else { 28 | return new ConcreateElementAdmin(); 29 | } 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /src/structure/decorator/decoratorIml/GoodBoyDecortaor.java: -------------------------------------------------------------------------------- 1 | package structure.decorator.decoratorIml;/** 2 | * Created by MirsFang on 2017/3/1. 3 | */ 4 | 5 | import structure.decorator.decoratorAbs.Decorator; 6 | import structure.decorator.decoratorAbs.SchoolReport; 7 | 8 | /*** 9 | *作者:MirsFang 10 | *模式:装饰器模式 11 | *时间:2017/03/01/下午12:53 12 | *备注 装饰在学校的表现 13 | ***/ 14 | 15 | 16 | public class GoodBoyDecortaor extends Decorator { 17 | public GoodBoyDecortaor(SchoolReport schoolReport) { 18 | super(schoolReport); 19 | } 20 | 21 | private void goodBoyDecorator(){ 22 | System.out.println("我在学校表现很好,没毛病"); 23 | } 24 | 25 | @Override 26 | public void report() { 27 | goodBoyDecorator(); 28 | super.report(); 29 | 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /src/create/prototype/DeepCopy.java: -------------------------------------------------------------------------------- 1 | package create.prototype;/** 2 | * Created by MirsFang on 2017/3/8. 3 | */ 4 | 5 | import create.prototype.prototypeAbs.BaseMessage; 6 | 7 | import java.util.ArrayList; 8 | 9 | /*** 10 | *作者:MirsFang 11 | *模式:原型模式 12 | *时间:2017/03/08/下午12:21 13 | *备注 原型模式深拷贝 14 | ***/ 15 | 16 | public class DeepCopy extends BaseMessage implements Cloneable { 17 | 18 | @Override 19 | protected Object clone() throws CloneNotSupportedException { 20 | DeepCopy deepCopy=null; 21 | try { 22 | deepCopy= (DeepCopy) super.clone(); 23 | this.setImgList((ArrayList) this.getImgList().clone()); 24 | }catch (Exception e){ 25 | e.printStackTrace(); 26 | } 27 | return deepCopy; 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /src/structure/flyweight/flyweightAbs/Flyweight.java: -------------------------------------------------------------------------------- 1 | package structure.flyweight.flyweightAbs;/** 2 | * Created by MirsFang on 2017/3/9. 3 | */ 4 | 5 | /*** 6 | *作者:MirsFang 7 | *模式:享元模式 8 | *时间:2017/03/09/下午12:32 9 | *备注 抽象享元对象 10 | ***/ 11 | 12 | public abstract class Flyweight { 13 | //内部状态 14 | private String intrinsic; 15 | //外部状态 16 | protected final String Extrinsic; 17 | //要求享元角色必须接受外部状态 18 | public Flyweight(String extrinsic) { 19 | Extrinsic = extrinsic; 20 | } 21 | //定义业务操作 22 | public abstract void operate(); 23 | //内部状态的get和set 24 | public String getIntrinsic() { 25 | return intrinsic; 26 | } 27 | 28 | public void setIntrinsic(String intrinsic) { 29 | this.intrinsic = intrinsic; 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /.idea/compiler.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /src/action/observer/observerIml/DiaoSi.java: -------------------------------------------------------------------------------- 1 | package action.observer.observerIml;/** 2 | * Created by MirsFang on 2017/3/3. 3 | */ 4 | 5 | import action.observer.observerAbs.Observer; 6 | 7 | /*** 8 | *作者:MirsFang 9 | *模式:观察者模式 10 | *时间:2017/03/03/下午1:02 11 | *备注 屌丝 12 | ***/ 13 | 14 | public class DiaoSi implements Observer{ 15 | //你的名字 16 | private String name; 17 | 18 | public String getName() { 19 | return name; 20 | } 21 | 22 | public void setName(String name) { 23 | this.name = name; 24 | } 25 | 26 | public DiaoSi(String name) { 27 | this.name = name; 28 | } 29 | 30 | public DiaoSi() { 31 | } 32 | 33 | @Override 34 | public void Update() { 35 | System.out.println(name+"已经知道女神出门,准备跟(wei)踪(sui)"); 36 | } 37 | 38 | 39 | } 40 | -------------------------------------------------------------------------------- /src/action/state/allState/Run.java: -------------------------------------------------------------------------------- 1 | package action.state.allState;/** 2 | * Created by MirsFang on 2017/3/16. 3 | */ 4 | 5 | import action.state.absState.Context; 6 | import action.state.absState.State; 7 | 8 | /*** 9 | *作者:MirsFang 10 | *模式:状态模式 11 | *时间:2017/03/16/下午12:23 12 | *备注 运行状态 // 13 | ***/ 14 | 15 | public class Run extends State { 16 | 17 | 18 | //运行状态不糊开门 19 | @Override 20 | public void open() { 21 | //状态修改 22 | } 23 | 24 | //运行状态门就是观者的 25 | @Override 26 | public void close() { 27 | 28 | } 29 | 30 | @Override 31 | public void run() { 32 | System.out.println("电梯正在运行"); 33 | } 34 | 35 | //停止运行 36 | @Override 37 | public void stop() { 38 | context.setNowState(Context.stop); 39 | context.getNowState().stop(); 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /src/create/builder/WolverineBuilder.java: -------------------------------------------------------------------------------- 1 | package create.builder; 2 | 3 | /** 4 | * 金刚狼的builder 5 | * @author Chayne_Shen 2017/3/10 0010. 6 | */ 7 | 8 | public class WolverineBuilder implements XManBuilder { 9 | XMan mXMan; 10 | WolverineBuilder() { 11 | mXMan = new XMan(); 12 | } 13 | 14 | public WolverineBuilder buildXFactor() { 15 | mXMan.setxFactor("claw"); 16 | System.out.println(mXMan.getxFactor()); 17 | return this; 18 | } 19 | 20 | public WolverineBuilder buildLover() { 21 | mXMan.setLover("Jane"); 22 | System.out.println(mXMan.getLover()); 23 | return this; 24 | } 25 | 26 | public XMan buildXman() { 27 | System.out.println("Wolverine is successfully built"); 28 | 29 | return mXMan; 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /src/action/state/allState/Open.java: -------------------------------------------------------------------------------- 1 | package action.state.allState;/** 2 | * Created by MirsFang on 2017/3/16. 3 | */ 4 | 5 | import action.state.absState.Context; 6 | import action.state.absState.State; 7 | 8 | /*** 9 | *作者:MirsFang 10 | *模式:状态模式 11 | *时间:2017/03/16/下午12:23 12 | *备注 打开状态 13 | ***/ 14 | 15 | public class Open extends State { 16 | 17 | 18 | @Override 19 | public void open() { 20 | System.out.println("电梯门开启"); 21 | } 22 | 23 | @Override 24 | public void close() { 25 | //状态修改 26 | context.setNowState(Context.close); 27 | //委托执行 28 | context.getNowState().close(); 29 | } 30 | 31 | //开着门不能跑 32 | @Override 33 | public void run() { 34 | 35 | } 36 | 37 | //开着门就是停止的 38 | @Override 39 | public void stop() { 40 | 41 | 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /src/action/state/allState/Stop.java: -------------------------------------------------------------------------------- 1 | package action.state.allState;/** 2 | * Created by MirsFang on 2017/3/16. 3 | */ 4 | 5 | import action.state.absState.Context; 6 | import action.state.absState.State; 7 | 8 | /*** 9 | *作者:MirsFang 10 | *模式:状态模式 11 | *时间:2017/03/16/下午12:23 12 | *备注 停止状态 13 | ***/ 14 | 15 | public class Stop extends State { 16 | 17 | //停下来要开电梯门 18 | @Override 19 | public void open() { 20 | context.setNowState(Context.open); 21 | context.getNowState().open(); 22 | } 23 | 24 | 25 | @Override 26 | public void close() { 27 | 28 | } 29 | 30 | @Override 31 | public void run() { 32 | context.setNowState(Context.run); 33 | context.getNowState().run(); 34 | } 35 | 36 | @Override 37 | public void stop() { 38 | System.out.println("电梯停止了"); 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /src/structure/decorator/decorator.md: -------------------------------------------------------------------------------- 1 | 2 | #装饰器模式 3 | 4 | >动态的给一个对象添加一些额外的职责,就增加功能来说,装饰器比生成子类更加灵活 5 | 6 | * 尽量使用对象组合,而不是通过继承来扩展和复用功能 7 | 8 | 感觉直接搞得话太过于抽象,看到《设计模式之禅》上面的例子,感觉不错,借鉴一下 9 | 10 | 11 | decoratorAbs 这个文件里面都是抽象类等 12 | decoratorIml 这是文件里面都是实现类 13 | 14 | 15 | | 类名 | 描述 | 16 | | --------------------------- | --------- | 17 | | SchoolReport | 抽象成绩单类 | 18 | | FouthGradeSchoolReport | 四年级的成绩单 | 19 | | SuagrFouthGradeSchoolReport | 继承装饰类 | 20 | | DecoratorMain | main函数所在类 | 21 | | Decorator | 装饰类 | 22 | | GoodBoyDecortaor | 装饰在学校的表现 | 23 | | RankDecortaor | 装饰在学校的排名 | 24 | 25 | 26 | 27 | SchoolReport 和 FouthGradeSchoolReport 是通用的 28 | 29 | 30 | 31 | SuagrFouthGradeSchoolReport 这是继承实现的装饰 32 | 33 | 34 | 35 | Decorator是抽象的装饰器 GoodBoyDecortaor和RankDecortaor是他的实现 -------------------------------------------------------------------------------- /src/create/factory/factory/HumanFactory.java: -------------------------------------------------------------------------------- 1 | package create.factory.factory;/** 2 | * Created by MirsFang on 2017/5/5. 3 | */ 4 | 5 | import create.factory.AbsHumanFactory; 6 | import create.factory.Human; 7 | 8 | /*** 9 | *作者:MirsFang 10 | *模式:工厂模式 11 | *时间:2017/05/05/上午10:17 12 | *备注 具体工厂 13 | ***/ 14 | 15 | public class HumanFactory extends AbsHumanFactory { 16 | @Override 17 | public T createHumen(Class tClass) { 18 | Human humen=null; 19 | try { 20 | humen= (T) Class.forName(tClass.getName()).newInstance(); 21 | } catch (InstantiationException e) { 22 | e.printStackTrace(); 23 | } catch (IllegalAccessException e) { 24 | e.printStackTrace(); 25 | } catch (ClassNotFoundException e) { 26 | e.printStackTrace(); 27 | } 28 | return (T)humen; 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /src/structure/adapter/OtherUserInfo.java: -------------------------------------------------------------------------------- 1 | package structure.adapter;/** 2 | * Created by MirsFang on 2017/3/10. 3 | */ 4 | 5 | import structure.adapter.adapterAbs.IOtherInfo; 6 | 7 | import java.util.HashMap; 8 | 9 | /*** 10 | *作者:MirsFang 11 | *模式:适配器模式 12 | *时间:2017/03/10/下午12:57 13 | *备注 其他用户类的实现类 14 | ***/ 15 | 16 | public class OtherUserInfo implements IOtherInfo { 17 | @Override 18 | public HashMap getUserInfo() { 19 | HashMap hashMap=new HashMap<>(); 20 | hashMap.put("username","员工名称"); 21 | hashMap.put("address","员工住址"); 22 | hashMap.put("number","员工号码"); 23 | hashMap.put("sex","员工性别"); 24 | return hashMap; 25 | } 26 | 27 | @Override 28 | public HashMap getUserJobInfo() { 29 | HashMap hashMap=new HashMap<>(); 30 | hashMap.put("jobaddress","员工公司地址"); 31 | return hashMap; 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # ExamplesOfDesignPatterns 2 | ## 序言 3 | 4 | 各种设计模式的Uml图、分析与代码实现,主要在dev分支。 所有模式的Uml图都在[XMindDescribe](https://github.com/mirsfang/ExamplesOfDesignPatterns/tree/master/XMindDescribe)目录下的xmind文件里 5 | 6 | ## 项目结构 7 | 8 | 9 | 10 | | 名字 | 描述 | 11 | | :------------ | --------- | 12 | | action | 行为型设计模式 | 13 | | create | 创建型设计模式 | 14 | | structure | 结构型设计模式 | 15 | | XMindDescribe | XMind描述文件 | 16 | 17 | 18 | 19 | 20 | 21 | 目前完成 22 | 23 | 24 | 25 | * 代理模式 26 | * 装饰器模式 27 | * ​访问者模式 28 | * 观察者模式 29 | * 责任链模式 30 | * 原型模式 31 | * 享元模式 32 | * 建造者模式 33 | * 适配器模式 34 | * 单例模式 35 | * 命令模式 36 | * 状态模式 37 | * 桥接模式 38 | * 工厂模式 39 | 40 | 41 | 42 | 43 | 44 | ## XMind文件截图 45 | 46 | ![Markdown](http://ouax5m69u.bkt.clouddn.com/XMind截图.png) 47 | 48 | ## 一些模式的截图 49 | ![Markdown](http://ouax5m69u.bkt.clouddn.com/观察者模式.png) 50 | ![Markdown]( 51 | http://ouax5m69u.bkt.clouddn.com/策略模式.png 52 | ) 53 | 54 | 55 | 56 | 交流群:695853826 57 | -------------------------------------------------------------------------------- /src/structure/flyweight/FlyweightFactory.java: -------------------------------------------------------------------------------- 1 | package structure.flyweight;/** 2 | * Created by MirsFang on 2017/3/9. 3 | */ 4 | 5 | import structure.flyweight.flyweightAbs.Flyweight; 6 | 7 | import java.util.HashMap; 8 | 9 | /*** 10 | *作者:MirsFang 11 | *模式:享元模式 12 | *时间:2017/03/09/下午12:38 13 | *备注 享元工厂 14 | ***/ 15 | 16 | public class FlyweightFactory { 17 | //定义一个池容器 18 | private static HashMap pool=new HashMap<>(); 19 | 20 | public static Flyweight getFlyweight(String Extrinsic){ 21 | //需要返回的对象 22 | Flyweight flyweight=null; 23 | if(pool.containsKey(Extrinsic)){ 24 | flyweight=pool.get(Extrinsic); 25 | }else { 26 | flyweight=new ConcreateFlyweight_1(Extrinsic); 27 | pool.put(Extrinsic,flyweight); 28 | } 29 | return flyweight; 30 | } 31 | 32 | 33 | //获取池的大小 34 | public static int getPoolSize(){ 35 | return pool.size(); 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /ExamplesOfDesignPatterns.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /src/action/chainOfResponsibility/ChainOfReponsibilityMain.java: -------------------------------------------------------------------------------- 1 | package action.chainOfResponsibility;/** 2 | * Created by MirsFang on 2017/3/6. 3 | */ 4 | 5 | import action.chainOfResponsibility.abs.Handler; 6 | 7 | /*** 8 | *作者:MirsFang 9 | *模式:责任链模式 10 | *时间:2017/03/06/下午12:47 11 | *备注 准备开始走流程 12 | ***/ 13 | 14 | public class ChainOfReponsibilityMain { 15 | 16 | public static void main(String[] args) { 17 | //我要报销的钱数; 18 | int money=5; 19 | //初始化各个处理者 20 | Handler manager = new ManagerHandler(); 21 | Handler finance = new FinanceHandler(); 22 | Handler boss = new BossHandler(); 23 | //设置链中的顺序 24 | manager.setNextHandler(finance); 25 | finance.setNextHandler(boss); 26 | //开始请求 27 | System.out.println("我要报销"+money+"元"); 28 | if (manager.handlerRequst(money)) { 29 | System.out.println("报销成功"); 30 | } else { 31 | System.out.println("报销失败"); 32 | } 33 | } 34 | 35 | } 36 | -------------------------------------------------------------------------------- /src/create/factory/FactoryMain.java: -------------------------------------------------------------------------------- 1 | package create.factory;/** 2 | * Created by MirsFang on 2017/5/5. 3 | */ 4 | 5 | import create.factory.factory.HumanFactory; 6 | import create.factory.human.BlackHuman; 7 | import create.factory.human.WhiteHuman; 8 | import create.factory.human.YellowHuman; 9 | 10 | /*** 11 | *作者:MirsFang 12 | *模式:工厂模式 13 | *时间:2017/05/05/上午10:28 14 | *备注 执行类 15 | ***/ 16 | 17 | public class FactoryMain { 18 | public static void main(String[] args) { 19 | 20 | //初始化一个工厂 21 | AbsHumanFactory humanFactory = new HumanFactory(); 22 | 23 | //建造一个黄种人 24 | Human yellowHuman = humanFactory.createHumen(YellowHuman.class); 25 | yellowHuman.getColor(); 26 | 27 | //建造一个黑人 28 | Human blackHuman = humanFactory.createHumen(BlackHuman.class); 29 | blackHuman.getColor(); 30 | 31 | //建造一个白人 32 | Human whiteHuman = humanFactory.createHumen(WhiteHuman.class); 33 | whiteHuman.getColor(); 34 | 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /src/structure/adapter/MeUserInfo.java: -------------------------------------------------------------------------------- 1 | package structure.adapter;/** 2 | * Created by MirsFang on 2017/3/10. 3 | */ 4 | 5 | import structure.adapter.adapterAbs.IUserInfo; 6 | 7 | /*** 8 | *作者:MirsFang 9 | *模式:适配器模式 10 | *时间:2017/03/10/下午12:48 11 | *备注 我们自己的用户类 12 | ***/ 13 | 14 | public class MeUserInfo implements IUserInfo { 15 | 16 | @Override 17 | public String getUserName() { 18 | System.out.print("员工姓名"); 19 | return null; 20 | } 21 | 22 | @Override 23 | public String getHomeAddress() { 24 | System.out.print("员工住址"); 25 | return null; 26 | } 27 | 28 | @Override 29 | public String getMobileNumber() { 30 | System.out.print("员工号码"); 31 | return null; 32 | } 33 | 34 | @Override 35 | public String getSex() { 36 | System.out.print("员工性别"); 37 | return null; 38 | } 39 | 40 | @Override 41 | public String getJobPosition() { 42 | System.out.print("员工公司地址"); 43 | return null; 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /src/action/observer/ObserverMain.java: -------------------------------------------------------------------------------- 1 | package action.observer;/** 2 | * Created by MirsFang on 2017/3/3. 3 | */ 4 | 5 | import action.observer.observerAbs.Observer; 6 | import action.observer.observerAbs.Subject; 7 | import action.observer.observerIml.DiaoSi; 8 | import action.observer.observerIml.NvShen; 9 | 10 | import java.util.ArrayList; 11 | 12 | /*** 13 | *作者:MirsFang 14 | *模式:观察者模式 15 | *时间:2017/03/03/下午1:10 16 | *备注 观察者模式运行类 17 | ***/ 18 | 19 | public class ObserverMain { 20 | 21 | public static void main(String[] args) { 22 | //实例化一个女神。(现实中也能这么New就好了 for(;;) new Nvshen(); 哈哈) 23 | NvShen nvShen=new NvShen(); 24 | //添加尾随大军 25 | getObservers(nvShen); 26 | //女神要出去逛街了!!! 27 | nvShen.goShopping(); 28 | 29 | } 30 | 31 | 32 | //添加10个观察者(真变态) 33 | public static void getObservers(Subject nvShen){ 34 | for (int i = 0; i < 10 ; i++) { 35 | DiaoSi diaosi=new DiaoSi("屌丝"+i); 36 | nvShen.Attach(diaosi); 37 | } 38 | } 39 | 40 | 41 | } 42 | -------------------------------------------------------------------------------- /src/create/singleton/Singleton.java: -------------------------------------------------------------------------------- 1 | package create.singleton; 2 | 3 | /** 4 | * @author PhxNirvana 2017/3/14 0014. 5 | * 双重锁的单例 6 | */ 7 | 8 | public class Singleton { 9 | //防止外部创建实例 10 | private Singleton() { 11 | //To save singleton from reflection 12 | if(mInstance != null) { 13 | throw new InstantiationError("Already there"); 14 | } 15 | } 16 | //唯一实例 17 | private static volatile Singleton mInstance; 18 | 19 | public static Singleton getInstance() { 20 | //第一个锁,如果没有实例 21 | if (mInstance == null) { 22 | synchronized (Singleton.class) { 23 | //第二个锁,如果没有任何线程创建Singleton实例 24 | if (mInstance == null) { 25 | mInstance = new Singleton(); 26 | } 27 | } 28 | } 29 | return mInstance; 30 | } 31 | 32 | //To save singleton from Deserialization 33 | protected Object readResolve() { 34 | return mInstance; 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /src/action/state/allState/Close.java: -------------------------------------------------------------------------------- 1 | package action.state.allState;/** 2 | * Created by MirsFang on 2017/3/16. 3 | */ 4 | 5 | import action.state.absState.Context; 6 | import action.state.absState.State; 7 | 8 | /*** 9 | *作者:MirsFang 10 | *模式:状态模式 11 | *时间:2017/03/16/下午12:23 12 | *备注 关闭状态 13 | ***/ 14 | 15 | public class Close extends State { 16 | 17 | 18 | @Override 19 | public void open() { 20 | //状态修改 21 | context.setNowState(Context.open); 22 | //委托执行 23 | context.getNowState().open(); 24 | } 25 | 26 | @Override 27 | public void close() { 28 | System.out.print("电梯门关闭"); 29 | } 30 | 31 | //运行 32 | @Override 33 | public void run() { 34 | //状态修改 35 | context.setNowState(Context.run); 36 | //委托执行 37 | context.getNowState().run(); 38 | } 39 | 40 | //停止 41 | @Override 42 | public void stop() { 43 | //状态修改 44 | context.setNowState(Context.stop); 45 | //委托执行 46 | context.getNowState().stop(); 47 | 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /src/structure/adapter/UserAdapter.java: -------------------------------------------------------------------------------- 1 | package structure.adapter;/** 2 | * Created by MirsFang on 2017/3/10. 3 | */ 4 | 5 | import structure.adapter.adapterAbs.IUserInfo; 6 | 7 | /*** 8 | *作者:MirsFang 9 | *模式:适配器模式 10 | *时间:2017/03/10/下午1:01 11 | *备注 两种不同用户之间的适配 12 | ***/ 13 | 14 | public class UserAdapter extends OtherUserInfo implements IUserInfo{ 15 | @Override 16 | public String getUserName() { 17 | System.out.println(getUserInfo().get("username")); 18 | return null; 19 | } 20 | 21 | @Override 22 | public String getHomeAddress() { 23 | System.out.println(getUserInfo().get("address")); 24 | return null; 25 | } 26 | 27 | @Override 28 | public String getMobileNumber() { 29 | System.out.println(getUserInfo().get("number")); 30 | return null; 31 | } 32 | 33 | @Override 34 | public String getSex() { 35 | System.out.println(getUserInfo().get("sex")); 36 | return null; 37 | } 38 | 39 | @Override 40 | public String getJobPosition() { 41 | System.out.println(getUserJobInfo().get("jobaddress")); 42 | return null; 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /src/action/state/absState/Context.java: -------------------------------------------------------------------------------- 1 | package action.state.absState;/** 2 | * Created by MirsFang on 2017/3/16. 3 | */ 4 | 5 | import action.state.allState.Close; 6 | import action.state.allState.Open; 7 | import action.state.allState.Run; 8 | import action.state.allState.Stop; 9 | 10 | /*** 11 | *作者:MirsFang 12 | *模式:状态模式 13 | *时间:2017/03/16/下午12:14 14 | *备注 上下文环境 15 | ***/ 16 | 17 | public class Context { 18 | 19 | //定义出所有的电梯状态 用在setState(); 20 | public static final Open open=new Open(); 21 | public static final Close close=new Close(); 22 | public static final Run run=new Run(); 23 | public static final Stop stop=new Stop(); 24 | 25 | //当前的状态 26 | private State nowState; 27 | 28 | public void setNowState(State nowState) { 29 | this.nowState = nowState; 30 | this.nowState.setContext(this); 31 | } 32 | 33 | public State getNowState() { 34 | return nowState; 35 | } 36 | 37 | public void open(){ 38 | nowState.open(); 39 | } 40 | 41 | public void close(){ 42 | nowState.close(); 43 | } 44 | 45 | public void run(){ 46 | nowState.run(); 47 | } 48 | 49 | public void stop(){ 50 | nowState.stop(); 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /src/structure/flyweight/FlyweightMain.java: -------------------------------------------------------------------------------- 1 | package structure.flyweight;/** 2 | * Created by MirsFang on 2017/3/9. 3 | */ 4 | 5 | import structure.flyweight.flyweightAbs.Flyweight; 6 | 7 | /*** 8 | *作者:MirsFang 9 | *模式:享元模式 10 | *时间:2017/03/09/下午12:44 11 | *备注 享元模式执行类 12 | ***/ 13 | 14 | public class FlyweightMain { 15 | 16 | 17 | public static void main(String[] args) { 18 | Flyweight fly1; 19 | Flyweight fly2; 20 | Flyweight fly3; 21 | Flyweight fly4; 22 | Flyweight fly5; 23 | Flyweight fly6; 24 | 25 | //根据类型创建订单对象 26 | fly1 = FlyweightFactory.getFlyweight("图书"); 27 | fly2 = FlyweightFactory.getFlyweight("图书"); 28 | fly3 = FlyweightFactory.getFlyweight("图书"); 29 | fly4 = FlyweightFactory.getFlyweight("图书"); 30 | fly5 = FlyweightFactory.getFlyweight("你懂得"); 31 | fly6 = FlyweightFactory.getFlyweight("女神娃娃"); 32 | 33 | //调用 34 | fly1.operate(); 35 | fly2.operate(); 36 | fly3.operate(); 37 | fly4.operate(); 38 | fly5.operate(); 39 | fly6.operate(); 40 | 41 | //查看池中对象的数量 42 | System.out.print("pool 中对象的大小 = "+FlyweightFactory.getPoolSize()); 43 | 44 | } 45 | 46 | 47 | } 48 | -------------------------------------------------------------------------------- /src/structure/proxy/ProxyMain.java: -------------------------------------------------------------------------------- 1 | package structure.proxy; 2 | 3 | import structure.proxy.dynamicProxy.RealSujectImpl; 4 | import structure.proxy.dynamicProxy.Subject; 5 | import structure.proxy.dynamicProxy.SubjectInvocationHandler; 6 | import structure.proxy.staticProxy.Proxy; 7 | import structure.proxy.staticProxy.RealSuject; 8 | 9 | /*** 10 | *作者:MirsFang 11 | *模式:代理模式 12 | *时间:2017/2/28/ 13 | *备注 代理模式运行类 14 | ***/ 15 | public class ProxyMain { 16 | 17 | public static void main(String[] args) { 18 | 19 | // staticProxy(); 20 | 21 | dynamicProxy(); 22 | } 23 | 24 | 25 | /* 26 | * 静态代理 27 | * */ 28 | private static void staticProxy() { 29 | 30 | RealSuject realSuject = new RealSuject(); 31 | 32 | Proxy proxy = new Proxy(realSuject); 33 | proxy.request(); 34 | 35 | } 36 | 37 | 38 | /** 39 | * 40 | *作者:Mirsfang 41 | *日期:2017/2/28/下午12:54 42 | *描述:动态代理 43 | **/ 44 | private static void dynamicProxy(){ 45 | RealSujectImpl realSubject=new RealSujectImpl(); 46 | SubjectInvocationHandler handler=new SubjectInvocationHandler(realSubject); 47 | Subject subject= (Subject) handler.getProxy(); 48 | subject.request(); 49 | } 50 | 51 | 52 | } -------------------------------------------------------------------------------- /src/structure/proxy/dynamicProxy/SubjectInvocationHandler.java: -------------------------------------------------------------------------------- 1 | package structure.proxy.dynamicProxy;/** 2 | * Created by MirsFang on 2017/2/28. 3 | */ 4 | 5 | import com.sun.org.apache.regexp.internal.RE; 6 | 7 | import java.lang.reflect.InvocationHandler; 8 | import java.lang.reflect.Method; 9 | import java.lang.reflect.Proxy; 10 | 11 | /*** 12 | *作者:MirsFang 13 | *模式:代理模式 14 | *时间:2017/02/28/下午12:41 15 | *备注 利用java.lang.reflect.Proxy类和java.lang.reflect.InvocationHandler接口定义代理类的实现 16 | ***/ 17 | 18 | public class SubjectInvocationHandler implements InvocationHandler { 19 | 20 | private Object target; 21 | 22 | public SubjectInvocationHandler(Object target) { 23 | this.target = target; 24 | } 25 | 26 | @Override 27 | public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { 28 | System.out.println("----before----"); 29 | //调用方法 30 | Object result = method.invoke(target, args); 31 | System.out.println("----end----"); 32 | return result; 33 | } 34 | 35 | public Object getProxy() { 36 | //获取当前线程的classloder 37 | ClassLoader loader = Thread.currentThread().getContextClassLoader(); 38 | //获取所有的interface 39 | Class[] interfaces = target.getClass().getInterfaces(); 40 | return Proxy.newProxyInstance(loader, interfaces, this); 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /src/action/observer/observerIml/NvShen.java: -------------------------------------------------------------------------------- 1 | package action.observer.observerIml;/** 2 | * Created by MirsFang on 2017/3/3. 3 | */ 4 | 5 | 6 | import action.observer.observerAbs.Observer; 7 | import action.observer.observerAbs.Subject; 8 | 9 | import java.util.ArrayList; 10 | import java.util.List; 11 | 12 | /*** 13 | *作者:MirsFang 14 | *模式:观察者模式 15 | *时间:2017/03/03/下午1:02 16 | *备注 女神 17 | ***/ 18 | 19 | public class NvShen implements Subject{ 20 | private List observersList; 21 | 22 | //女神要去逛街了 23 | public void goShopping(){ 24 | System.out.println("女神准备要去逛街了!!"); 25 | //调用通知方法 26 | Notify(); 27 | } 28 | 29 | @Override 30 | public void Attach(Observer observer) { 31 | if(observersList==null){ 32 | observersList=new ArrayList<>(); 33 | }else { 34 | observersList.add(observer); 35 | } 36 | } 37 | 38 | @Override 39 | public void Detach(Observer observer) { 40 | String name=((DiaoSi)observer).getName(); 41 | if(observersList==null||observersList.size()==0){ 42 | return; 43 | } 44 | if( observersList.remove(observer)){ 45 | System.out.print(name+"已经被踢出队伍"); 46 | } 47 | } 48 | 49 | @Override 50 | public void Notify() { 51 | for (Observer observer: 52 | observersList) { 53 | //通知所有的跟随人员 54 | observer.Update(); 55 | } 56 | System.out.print("尾随大军已经出动!!!"); 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /src/action/chainOfResponsibility/abs/Handler.java: -------------------------------------------------------------------------------- 1 | package action.chainOfResponsibility.abs;/** 2 | * Created by MirsFang on 2017/3/6. 3 | */ 4 | 5 | /*** 6 | *作者:MirsFang 7 | *模式:责任链模式 8 | *时间:2017/03/06/下午12:33 9 | *备注 抽象的执行者 10 | * 11 | ***/ 12 | 13 | public abstract class Handler { 14 | //下一个执行者 15 | private Handler nextHandler; 16 | 17 | 18 | //当前执行者对请求做处理 19 | public final boolean handlerRequst(int handLeve){ 20 | boolean bReq=false; 21 | //判断自己是否可以审核 22 | if(getLevel()>=handLeve){ 23 | System.out.println(getnName()+" :可以审批"); 24 | return true; 25 | }else { 26 | if(this.nextHandler!=null){ 27 | System.out.println(getnName()+"向"+nextHandler.getnName()+"递交请求"); 28 | //向上一级请求 29 | bReq=nextHandler.handlerRequst(handLeve); 30 | //根据上级的答复做出回应 31 | if(bReq){ 32 | System.out.println(getnName()+" :"+nextHandler.getnName()+"说可以审批"); 33 | }else { 34 | System.out.println(getnName()+" :"+nextHandler.getnName()+"说不可以审批"); 35 | } 36 | }else { 37 | //到这边已经没有下一个处理者了 38 | System.out.println(getnName()+" :金额太大了"); 39 | } 40 | } 41 | return bReq; 42 | } 43 | 44 | 45 | public void setNextHandler(Handler nextHandler) { 46 | this.nextHandler = nextHandler; 47 | } 48 | //可以审批的金额 49 | public abstract int getLevel(); 50 | public abstract String getnName(); 51 | 52 | } 53 | -------------------------------------------------------------------------------- /src/create/prototype/prototypeAbs/BaseMessage.java: -------------------------------------------------------------------------------- 1 | package create.prototype.prototypeAbs;/** 2 | * Created by MirsFang on 2017/3/8. 3 | */ 4 | 5 | 6 | import java.util.ArrayList; 7 | 8 | /*** 9 | *作者:MirsFang 10 | *模式: 11 | *时间:2017/03/08/下午12:32 12 | *备注 13 | ***/ 14 | 15 | public abstract class BaseMessage { 16 | //发件人 17 | private String send; 18 | //收件人 19 | private String receiver; 20 | //消息 21 | private String message; 22 | 23 | private ArrayList imgList=new ArrayList<>(); 24 | 25 | public ArrayList getImgList() { 26 | return imgList; 27 | } 28 | 29 | public void setImgList(ArrayList imgList) { 30 | this.imgList = imgList; 31 | } 32 | 33 | public String getSend() { 34 | return send; 35 | } 36 | 37 | public void setSend(String send) { 38 | this.send = send; 39 | } 40 | 41 | public String getReceiver() { 42 | return receiver; 43 | } 44 | 45 | public void setReceiver(String receiver) { 46 | this.receiver = receiver; 47 | } 48 | 49 | public String getMessage() { 50 | return message; 51 | } 52 | 53 | public void setMessage(String message) { 54 | this.message = message; 55 | } 56 | 57 | public void addImage(String image){ 58 | getImgList().add(image); 59 | } 60 | 61 | /** 62 | *发送消息 63 | *作者:Mirsfang 64 | *日期:2017/3/8/下午12:33 65 | *描述: 66 | **/ 67 | public void sendMessage(){ 68 | System.out.println(getReceiver()+getMessage()+" 充气娃娃图片数量"+getImgList().size()+" 发件人"+getSend()); 69 | } 70 | } 71 | -------------------------------------------------------------------------------- /src/structure/decorator/DecoratorMain.java: -------------------------------------------------------------------------------- 1 | package structure.decorator;/** 2 | * Created by MirsFang on 2017/3/1. 3 | */ 4 | 5 | import structure.decorator.decoratorAbs.SchoolReport; 6 | import structure.decorator.decoratorIml.FouthGradeSchoolReport; 7 | import structure.decorator.decoratorIml.GoodBoyDecortaor; 8 | import structure.decorator.decoratorIml.RankDecortaor; 9 | import structure.decorator.decoratorIml.SuagrFouthGradeSchoolReport; 10 | 11 | /*** 12 | *作者:MirsFang 13 | *模式:装饰器模式 14 | *时间:2017/03/01/下午12:34 15 | *备注 装饰器模式运行类 16 | ***/ 17 | 18 | public class DecoratorMain { 19 | 20 | public static void main(String[] args) { 21 | absDecorator(); 22 | } 23 | 24 | /** 25 | * 26 | *作者:Mirsfang 27 | *日期:2017/3/1/下午12:35 28 | *描述:一般情况下 29 | **/ 30 | private static void normol(){ 31 | //把成绩单领回家 32 | SchoolReport schoolReport=new FouthGradeSchoolReport(); 33 | //家长看成绩单 34 | schoolReport.report(); 35 | //、、、、挨打 36 | } 37 | 38 | /** 39 | * 40 | *作者:Mirsfang 41 | *日期:2017/3/1/下午12:37 42 | *描述:如果用继承装饰 43 | **/ 44 | private static void extendsDecorator(){ 45 | SchoolReport schoolReport=new SuagrFouthGradeSchoolReport(); 46 | //家长看成绩单 47 | schoolReport.report(); 48 | //听你叨叨了几句,感觉考的还行 49 | schoolReport.sign("马云"); 50 | 51 | /** 52 | * 继承方式的弊端,如果以后要有五年级 六年级 七年级的成绩单, 53 | * 那么需要你分别对这几个年级的成绩单进行装饰, 54 | * 如果需要装饰的条件一旦很多,比如说平时表现啊什么的,就得一一去装饰,带来类的爆炸性增长, 55 | **/ 56 | } 57 | 58 | 59 | /** 60 | * 61 | *作者:Mirsfang 62 | *日期:2017/3/1/下午12:45 63 | *描述: 64 | * 利用抽象装饰 65 | **/ 66 | private static void absDecorator(){ 67 | //*** 注意这边的调用方式 *** 68 | 69 | //原装成绩单 70 | SchoolReport schoolReport=new FouthGradeSchoolReport(); 71 | //装饰表现 72 | schoolReport=new GoodBoyDecortaor(schoolReport); 73 | //装饰排名 74 | schoolReport=new RankDecortaor(schoolReport); 75 | //开始汇报 76 | schoolReport.report(); 77 | //哟西 不错 签名 78 | schoolReport.sign("马云"); 79 | } 80 | 81 | 82 | 83 | } 84 | -------------------------------------------------------------------------------- /src/create/prototype/PrototypeMain.java: -------------------------------------------------------------------------------- 1 | package create.prototype;/** 2 | * Created by MirsFang on 2017/3/8. 3 | */ 4 | 5 | import java.util.ArrayList; 6 | 7 | /*** 8 | *作者:MirsFang 9 | *模式:原型模式 10 | *时间:2017/03/08/下午12:21 11 | *备注 原型模式执行类 12 | ***/ 13 | 14 | public class PrototypeMain { 15 | 16 | public static void main(String[] args) { 17 | // shallowCopy(); 18 | deepCopy(); 19 | } 20 | 21 | /** 22 | * 浅拷贝 23 | *作者:Mirsfang 24 | *日期:2017/3/8/下午12:27 25 | *描述: 执行完可以看到 ShallowCopy 里面的arrayList一直是一个,没有变动过,所有在添加图片的时候,会再原有的基础上添加 26 | **/ 27 | private static void shallowCopy(){ 28 | ShallowCopy shallow=new ShallowCopy(); 29 | shallow.setMessage("先生,您好。您的充气娃娃已经收货"); 30 | shallow.setSend("MirsFang"); 31 | 32 | for (int i = 0; i < 3; i++) { 33 | shallow.addImage("图片"+i); 34 | } 35 | 36 | for (int i = 0; i < 10 ; i++) { 37 | try { 38 | ShallowCopy sendMsg= (ShallowCopy) shallow.clone(); 39 | sendMsg.setReceiver("顾客"+i); 40 | //添加顾客的充气娃娃照片 41 | sendMsg.addImage(sendMsg.getReceiver()+i); 42 | sendMsg.sendMessage(); 43 | } catch (CloneNotSupportedException e) { 44 | e.printStackTrace(); 45 | } 46 | } 47 | } 48 | 49 | /** 50 | * 深拷贝 51 | *作者:Mirsfang 52 | *日期:2017/3/8/下午12:48 53 | *描述:执行完可以看到 充气娃娃图片的数量一直是4,说明里面的arrayList clone的时候里面只有原来的三个,并没有之前增加的 54 | **/ 55 | private static void deepCopy(){ 56 | DeepCopy deepCopy=new DeepCopy(); 57 | deepCopy.setMessage("先生,您好。您的充气娃娃已经收货"); 58 | deepCopy.setSend("MirsFang"); 59 | 60 | for (int i = 0; i < 3; i++) { 61 | deepCopy.addImage("图片"+i); 62 | } 63 | 64 | for (int i = 0; i < 10 ; i++) { 65 | try { 66 | DeepCopy sendMsg= (DeepCopy) deepCopy.clone(); 67 | sendMsg.setReceiver("顾客"+i); 68 | //添加顾客的充气娃娃照片 69 | sendMsg.addImage(sendMsg.getReceiver()+i); 70 | sendMsg.sendMessage(); 71 | } catch (CloneNotSupportedException e) { 72 | e.printStackTrace(); 73 | } 74 | } 75 | } 76 | } 77 | -------------------------------------------------------------------------------- /js/AMD.js: -------------------------------------------------------------------------------- 1 | /* 2 | * 创建闭包环境 3 | * 向闭包中传入模块管理对象F(~屏蔽压缩文件时,前面漏写;报错) 4 | */ 5 | ~(function(F){ 6 | //模块缓存器 存储已创建模块 7 | var moduleCache={} 8 | }) 9 | ((function(){ 10 | //创建模块管理器对象F,并保存在全局作用域中 11 | return window.F={}; 12 | })()); 13 | /* 14 | * 创建或调用模块方法 15 | * @param url 参数为模块url 16 | * @param deps 参数为依赖模块 17 | * @param callback 参数为模块主函数 18 | */ 19 | F.module=function(url,modDeps,modCallback){ 20 | //将参数转化为数组 21 | var args=[].slice.call(arguments), 22 | //获取模块构造函数(参数数组中最后一个参数成员) 23 | callback=args.pop(), 24 | //获取依赖模块(紧邻回调函数参数,且数据类型为数组) 25 | deps=(args.length&&args[args.length-1] instanceof Array)?args.pop():[], 26 | url=args.length?args.pop():null, 27 | params=[], 28 | depsCount=0, 29 | i=0, 30 | len; 31 | if(len==deps.length){ 32 | while(i 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 47 | 48 | 49 | 50 | -------------------------------------------------------------------------------- /.idea/markdown-navigator.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 33 | 34 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | -------------------------------------------------------------------------------- /js/Object-DAO.js: -------------------------------------------------------------------------------- 1 | /* 2 | * 本地存储类 3 | * 参数preId 本地数据存储库前缀 4 | * 参数timeSign 时间戳与存储数据之间的拼接符 5 | * 6 | */ 7 | var BaseLocalStorege=function(preId,timeSign){ 8 | //定义本地存储数据库前缀 9 | this.preId=preId; 10 | //定义时间戳与存储数据之间的拼接符 11 | this.timeSign=timeSign||'|-|'; 12 | } 13 | //本地存储类 原型方法 14 | BaseLocalStorege.prototype={ 15 | //操作状态 16 | status:{ 17 | Success:0,//成功 18 | FaiLure:1,//失败 19 | OverFlow:2,//溢出 20 | TimeOut:3//过期 21 | }, 22 | //保存本地存储连接 23 | storage:localStorage||window.localStorage, 24 | //保存本地存储数据库数据真实字段 25 | getKey:function(key){ 26 | return this.preId+key; 27 | }, 28 | //添加(修改)数据 29 | /* 30 | * 参数key:数据字段标识 31 | * 参数value:数据值 32 | * 参数callback:回调函数 33 | * 参数time:添加时间 34 | */ 35 | set:function(key,value,callback,time){ 36 | 37 | //默认操作状态时成功 38 | var status=this.status.Success, 39 | //获取真实字段 40 | key=this.getKey(key); 41 | try{ 42 | time=new Date(time).getTime()||time.getTime(); 43 | }catch(e){ 44 | //TODO handle the exception 45 | //为传入时间参数或者时间参数有误获取默认时间:一个月 46 | time=new Date().getTime()+1000*60*60*24*31; 47 | } 48 | try{ 49 | //向数据库中添加数据 50 | this.storage.setItem(key,time,+this.timeSign+value); 51 | }catch(e){ 52 | //溢出失败,返回溢出状态 53 | //TODO handle the exceptionOverFlow 54 | status=this.status.OverFlow; 55 | } 56 | //有回调函数则执行回调函数并传入参数操作状态,真实数据字段标识以及存储数据值 57 | callback&&callback.call(this,status,key,value); 58 | }, 59 | /* 60 | * 添加(修改)数据 61 | * 参数key :数据字段标识 62 | * 参数callback:回调函数 63 | */ 64 | get:function(key,callback){ 65 | //默认操作状态时成功 66 | var status=this.status.Success, 67 | //获取 68 | key=this.getKey(key), 69 | //默认值为空 70 | value=null, 71 | //时间戳与存储数据之间的拼接符长度 72 | timeSignLen=this.timeSign.length, 73 | //缓存当前对象 74 | that=this, 75 | //时间戳与存储数据之间的拼接符起始位置 76 | index, 77 | //时间戳 78 | time, 79 | //最终获取的数据 80 | result; 81 | try{ 82 | //获取字段对应的数据字符串 83 | value=that.storage.getItem(key); 84 | }catch(e){ 85 | //TODO handle the exception 86 | //获取失败,则返回失败状态,数据结果为null 87 | result={ 88 | status:that.status.FaiLure, 89 | value:null 90 | }; 91 | callback&&callback.call(this,result.status,result.value); 92 | return result; 93 | } 94 | //如果成功获取数据字符串 95 | if (value) { 96 | //获取时间戳与存储数据之间的拼接符起始位置 97 | index=value.indexOf(that.timeSign); 98 | //获取时间戳 99 | time=+value.slice(0,index); 100 | //如果时间过期 101 | if (new Date(time).getTime()>new Date().getTime()||time==0) { 102 | //获取数据结果(拼接符后面的字符串) 103 | value =value.slice(index+timeSignLen); 104 | }else{ 105 | //过期则结果为null 106 | value =null; 107 | //设置状态过期为过期状态 108 | status=that.status.TimeOut; 109 | //删除该字段 110 | that.remove(key); 111 | } 112 | }else{ 113 | //未获取数据字符串状态为失败状态 114 | status=that.status.FaiLure; 115 | } 116 | //设置结果 117 | result={ 118 | status:status, 119 | value:value 120 | }; 121 | //执行回调函数 122 | callback&&callback.call(this,result.status,result.value) 123 | }, 124 | /* 125 | * 删除数据 126 | * 参数key:数据字段标识 127 | * 参数 callback:回调函数 128 | */ 129 | remove:function(key,callback){ 130 | //设置默认初始状态为失败 131 | var status=this.status.FaiLure, 132 | key=this.getKey(key), 133 | //设置默认数据结果为空 134 | value=null; 135 | try{ 136 | //获取字段对应的数据 137 | value=this.storage.getItems(key); 138 | }catch(e){ 139 | //TODO handle the exception 140 | //如果数据存在 141 | if (value) { 142 | try{ 143 | //删除数据 144 | this.storage.removeItem(key); 145 | //设置操作成功 146 | status=this.status.Success; 147 | }catch(e){ 148 | //TODO handle the exception 149 | } 150 | } 151 | //执行回调 注意传入回调函数中的数据值:如果操作状态成功则返回真实的数据结果,否则返回空 152 | callback&&callback.call(this,status,status>0?null:value.slice(value.indexOf(this.timeSign)+this.timeSign.length)) 153 | return callback; 154 | } 155 | } 156 | } 157 | 158 | var LS=new BaseLocalStorege('LS_'); 159 | //在数据库中创建a变量 然后删除两次 查看结果 160 | LS.set('a','xiaoming',function(){console.log(arguments);});//[0,"LS_a","xiaoming"] 161 | LS.get('a',function(){console.log('get'+arguments)});//[0,"xiaoming"] 162 | LS.remove('a',function(){console.log('removeOne'+arguments)});//[0,"xiaoming"] 163 | LS.remove('a',function(){console.log('removeTwo'+arguments)});//[1,null] 164 | LS.get('a',function(){console.log('getTwo'+arguments)});//[1,null] 165 | -------------------------------------------------------------------------------- /js/MVVM.js: -------------------------------------------------------------------------------- 1 | /* 2 | * MVVM模式下自定义滚动条和进度条组件 3 | * ~屏蔽压缩报错 4 | * author:紫苏 5 | */ 6 | ~(function() { 7 | //在闭包中获取全局变量 8 | var window = this || (0, eval)('this'); 9 | //获取页面字体大小,作为页面UI尺寸参照物 10 | var FONTSIZE = function() { 11 | //获取页面body元素字体大小并转化成整数 12 | return parseInt(document.body.currentStyle ? document.body.currentStyle['fontSize'] : getComputedStyle(document.body, false)['fontSize']); 13 | }(); 14 | //视图模型对象 15 | var VM = function() { 16 | //组件创建策略对象 17 | var Method = { 18 | /* 19 | * 进度条组件 创建方法 20 | * dom 进度条容器 21 | * data 进度条数据模型 22 | */ 23 | progressbar: function(dom, data) { 24 | var progress = document.createElement('div'), 25 | //数据模型数据,结构:{position:50} 26 | param = data.data; 27 | //设置进度完成容器尺寸 28 | progress.style.width = (param.position || 100) + '%'; 29 | 30 | //为进度条组件添加UI样式 31 | dom.className += 'ui-progressbar'; 32 | //进度条完成容器元素插入进度条容器中 33 | dom.appendChild(progress); 34 | }, 35 | /* 36 | * 滑动条组件创建方法 37 | * dom 滑动条容器 38 | * data 滑动条数据模型 39 | */ 40 | slider: function(dom, data) { 41 | //滑动条拨片 42 | var bar = document.createElement('span'), 43 | //滑动条进度容器 44 | progress = document.createElement('div'), 45 | //滑动条容量提示信息 46 | totleText = null, 47 | //滑动条拨片提示信息 48 | progressText = null, 49 | //数据模型数据,结构 {position:60,totle:200} 50 | param = data.data, 51 | //容器元素宽度 52 | width = dom.clientWidth, 53 | //容器元素横坐标值 54 | left = dom.offsetLeft, 55 | //拨片位置(以模型数据中position数据计算) 56 | realWidth = (param.position || 100) * width / 100; 57 | //清空滑动条容器 为创建滑动条做准备 58 | dom.innerHTML = ''; 59 | //如果模型数据中提供容器总量信息(param.data),则创建滚动条提示文案 60 | if (param.totle) { 61 | //容器总量提示文案 62 | text = document.createElement('b'); 63 | //拨片位置提示信息 64 | progressText = document.createElement('em'); 65 | //设置容器总量提示文案 66 | text.innerHTML = param.totle; 67 | //将容器总量提示文案元素添加到滑动条组件中 68 | dom.appendChild(text); 69 | //将拨片位置提示信息元素添加到滑动组件中 70 | dom.appendChild(progressText); 71 | } 72 | //设置滑动条 73 | setStyle(realWidth); 74 | //为滑动条组件添加UI样式 75 | dom.className += 'ui-slider'; 76 | //将进度容器添加到滑动条组件中 77 | dom.appendChild(progress); 78 | dom.appendChild(bar); 79 | //设置滑动条 80 | function setStyle(w) { 81 | //设置进度容器宽度 82 | progress.style.width = w + 'px'; 83 | //设置拨片横坐标 84 | bar.style.left = w - FONTSIZE / 2 + 'px'; 85 | //如果拨片有提示信息 86 | if (progressText) { 87 | //设置拨片提示文案横坐标 88 | progressText.style.left = w - FONTSIZE / 2 * 2.4 + 'px'; 89 | //设置拨片刻度提示文案内容 90 | progressText.innerHTML = parseFloat(w / width * 100).toFixed(2) + '%'; 91 | }; 92 | } 93 | 94 | /* 95 | * 创建组件逻辑 96 | * 按下拨片 97 | */ 98 | bar.onmousedown = function() { 99 | document.onmousemove = function(event) { 100 | //获取事件源 101 | var e = event || window.event; 102 | var w = e.clientX - left; 103 | setStyle(w < width ? (w > 0 ? w : 0) : width); 104 | } 105 | //阻止页面滑动选项事件 106 | document.onselectstart = function() { 107 | return false; 108 | } 109 | //停止滑动交互 110 | document.onmouseup = function() { 111 | document.onmousemove = null; 112 | document.onselectstart = null; 113 | } 114 | } 115 | } 116 | } 117 | 118 | /** 119 | * 获取视图层组件渲染数据的映射信息 (PS:很高端 完全不懂要映射什么数据) 120 | * dom 组件元素 121 | */ 122 | function getBindData(dom) { 123 | //获取组件自定义属性data-bind值 124 | var data = dom.getAttribute('data-bind'); 125 | //将自定义属性data-bind转化为Obj才可以使用 126 | return !!data && (new Function("return ({" + data + "})"))(); 127 | } 128 | /* 129 | * 组件实例化方法 130 | * 131 | */ 132 | return function() { 133 | //获取页面中所有元素 134 | var doms = document.body.getElementsByTagName('*'), 135 | //元素自定义数据句柄 136 | ctx = null; 137 | //ui处理是会向页面中插入数据,此时doms.length 会改变 ,此时动态获取dom.length 138 | for (var i = 0; i < doms.length; i++) { 139 | //获取元素自定义数据 140 | ctx = getBindData(doms[i]); 141 | //如果元素是UI组件,则根据自定义属性中组件类型,渲染该组件 142 | ctx.type && Method[ctx.type] && Method[ctx.type](doms[i], ctx); 143 | } 144 | } 145 | }(); 146 | //将视图模型对象绑定在window上,供外部使用 147 | window.VM = VM; 148 | })(); 149 | var demo1 = { 150 | position: 60, 151 | totle: 200 152 | }, 153 | demo2 = { 154 | position: 20 155 | }, 156 | demo3 = { 157 | position: 50 158 | }; 159 | window.onload = function() { 160 | VM(); 161 | }; 162 | 163 | -------------------------------------------------------------------------------- /.idea/uiDesigner.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | --------------------------------------------------------------------------------