├── .gitignore ├── README.md ├── pom.xml └── src └── cn └── ucaner └── pattern ├── Main.java ├── action ├── action.md ├── chainOfResponsibility │ ├── BossHandler.java │ ├── ChainOfReponsibilityMain.java │ ├── FinanceHandler.java │ ├── ManagerHandler.java │ ├── abs │ │ └── Handler.java │ └── chainOfResponsibility.md ├── command │ ├── Code.java │ ├── CommandMain.java │ ├── Invoker.java │ ├── Product.java │ ├── Projecter.java │ ├── UI.java │ ├── absCommand │ │ ├── Command.java │ │ └── Group.java │ ├── command.md │ └── command │ │ └── AddPageCommand.java ├── observer │ ├── ObserverMain.java │ ├── display │ │ ├── CurrentConditionsDisplay.java │ │ ├── DisplayElement.java │ │ ├── DisplayTest.java │ │ ├── ForecastDisplay.java │ │ └── StatisticsDisplay.java │ ├── observer.md │ ├── observerAbs │ │ ├── Observer.java │ │ ├── ObserverInf.java │ │ └── Subject.java │ ├── observerIml │ │ ├── DiaoSi.java │ │ ├── GaoFuShuai.java │ │ └── NvShen.java │ ├── subimpl │ │ └── WeatherData.java │ └── subject │ │ └── Subject.java ├── state │ ├── StateMain.java │ ├── absState │ │ ├── Context.java │ │ └── State.java │ └── allState │ │ ├── Close.java │ │ ├── Open.java │ │ ├── Run.java │ │ └── Stop.java └── visitor │ ├── VisitorMain.java │ ├── visitor.md │ ├── visitorAbs │ ├── Element.java │ └── IVisitor.java │ └── visitorIml │ ├── ConcreateElementAdmin.java │ ├── ConcreateElementRoot.java │ ├── ConcreateElementUser.java │ ├── ObjectStruture.java │ └── Visitor.java ├── create ├── builder │ ├── BuilderTest.java │ ├── WolverineBuilder.java │ ├── WolverineDirector.java │ ├── XMan.java │ └── XManBuilder.java ├── create.md ├── factory │ ├── AbsHumanFactory.java │ ├── FactoryMain.java │ ├── Human.java │ ├── factory.md │ ├── factory │ │ └── HumanFactory.java │ └── human │ │ ├── BlackHuman.java │ │ ├── WhiteHuman.java │ │ └── YellowHuman.java ├── prototype │ ├── DeepCopy.java │ ├── PrototypeMain.java │ ├── ShallowCopy.java │ ├── prototype.md │ └── prototypeAbs │ │ └── BaseMessage.java └── singleton │ └── Singleton.java └── structure ├── adapter ├── AdapterMain.java ├── MeUserInfo.java ├── OtherUserInfo.java ├── UserAdapter.java ├── adapter.md ├── adapterAbs │ ├── IOtherInfo.java │ └── IUserInfo.java └── charge │ ├── ChargeTest.java │ ├── ChinaCharge.java │ ├── HongKongCharge.java │ ├── Three2TwoAdapter.java │ ├── Three3TwoAdapter.java │ └── inf │ ├── ThreeInterface.java │ └── TwoInterface.java ├── bridge ├── BridgeMain.java ├── ConcreteImplementor.java ├── RefinedAbstraction.java ├── abs │ ├── Abstraction.java │ └── Implementor.java ├── bridge.md └── db │ ├── Bridge.java │ ├── BridgeTest.java │ ├── MyBridge.java │ ├── Mysql.java │ ├── Oracle.java │ ├── OracleBridge.java │ └── inf │ └── Driver.java ├── decorator ├── DecoratorMain.java ├── decorator.md ├── decoratorAbs │ ├── Decorator.java │ └── SchoolReport.java └── decoratorIml │ ├── FouthGradeSchoolReport.java │ ├── GoodBoyDecortaor.java │ ├── RankDecortaor.java │ └── SuagrFouthGradeSchoolReport.java ├── flyweight ├── Circle.java ├── ConcreateFlyweight.java ├── DrawFactory.java ├── DrawMain.java ├── FlyweightFactory.java ├── FlyweightMain.java ├── flyweight.md └── flyweightAbs │ ├── Flyweight.java │ └── Shape.java ├── proxy ├── ProxyMain.java ├── dynamicProxy │ ├── RealSujectImpl.java │ ├── Subject.java │ └── SubjectInvocationHandler.java ├── proxy.md └── staticProxy │ ├── Proxy.java │ ├── RealSuject.java │ └── Subject.java └── structure.md /.gitignore: -------------------------------------------------------------------------------- 1 | # Java patterns add by Jason # 2 | /target/ 3 | /.settings/ 4 | /.classpath 5 | /.project 6 | /.idea/ 7 | ### Optz ingnore file ### -------------------------------------------------------------------------------- /pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 4.0.0 6 | 7 | 15 | 16 | 17 | 18 | 19 | Java-Patterns 20 | This is a Java-Patterns Learing Porject Designed by Jason. 21 | 22 | cn.ucaner 23 | patterns 24 | jar 25 | 1.0-SNAPSHOT 26 | 27 | 28 | 29 | 30 | 31 | 32 | org.apache.maven.plugins 33 | maven-compiler-plugin 34 | 35 | 8 36 | 8 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 |       The Apache Software License, Version 2.0 46 |       http://www.apache.org/licenses/LICENSE-2.0.txt 47 |       repo 48 | 49 | 50 | 51 | 52 | 53 | 54 | Jasonandy 55 | jasonandy@hotmail.com 56 | https://github.com/Jasonandy 57 | 58 | 59 | 60 | -------------------------------------------------------------------------------- /src/cn/ucaner/pattern/Main.java: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * 4 | *

Copyright 1994 JasonInternational

5 | *

All rights reserved.

6 | *

Created on 19941115

7 | *

Created by Jason https://github.com/Jasonandy/patterns

8 | * 9 | * 10 | */ 11 | package cn.ucaner.pattern; 12 | 13 | /** 14 | * @Package:cn.ucaner.pattern 15 | * @ClassName:Main 16 | * @Description:

example - https://github.com/Jasonandy/patterns

17 | * @Author: - Jason 18 | * @CreatTime:2018年10月18日 上午10:02:50 19 | * @Modify By: 20 | * @ModifyTime: 2018年10月18日 21 | * @Modify marker: 22 | * @version V1.0 23 | */ 24 | public class Main { 25 | 26 | public static void main(String[] args) { 27 | System.out.println("********************************************* https://github.com/Jasonandy/patterns *****************************************"); 28 | System.out.println("********************************************* GitHub 开源项目,欢迎Fork关注学习! ***********************************************"); 29 | System.out.println("******************************************************************************************************************************"); 30 | System.out.println(" ___ ___ ___ ___ ___ ___ \n" + 31 | " / /\\ / /\\ ___ ___ / /\\ / /\\ /__/\\ / /\\ \n" + 32 | " / /::\\ / /::\\ / /\\ / /\\ / /:/_ / /::\\ \\ \\:\\ / /:/_ \n" + 33 | " / /:/\\:\\ / /:/\\:\\ / /:/ / /:/ / /:/ /\\ / /:/\\:\\ \\ \\:\\ / /:/ /\\ \n" + 34 | " / /:/-/:/ / /:/-/::\\ / /:/ / /:/ / /:/ /:/_ / /:/-/:/ _____\\__\\:\\ / /:/ /::\\ \n" + 35 | " /__/:/ /:/ /__/:/ /:/\\:\\ / /::\\ / /::\\ /__/:/ /:/ /\\ /__/:/ /:/___ /__/::::::::\\ /__/:/ /:/\\:\\\n" + 36 | " \\ \\:\\/:/ \\ \\:\\/:/__\\/ /__/:/\\:\\ /__/:/\\:\\ \\ \\:\\/:/ /:/ \\ \\:\\/:::::/ \\ \\:\\--\\--\\/ \\ \\:\\/:/-/:/\n" + 37 | " \\ \\::/ \\ \\::/ \\__\\/ \\:\\ \\__\\/ \\:\\ \\ \\::/ /:/ \\ \\::/--- \\ \\:\\ --- \\ \\::/ /:/ \n" + 38 | " \\ \\:\\ \\ \\:\\ \\ \\:\\ \\ \\:\\ \\ \\:\\/:/ \\ \\:\\ \\ \\:\\ \\__\\/ /:/ \n" + 39 | " \\ \\:\\ \\ \\:\\ \\__\\/ \\__\\/ \\ \\::/ \\ \\:\\ \\ \\:\\ /__/:/ \n" + 40 | " \\__\\/ \\__\\/ \\__\\/ \\__\\/ \\__\\/ \\__\\/ "); 41 | System.out.println("------------------------------------------------------------------------------------------------------------------------------"); 42 | System.out.println("-------------------------------------------------- jasonandy@hotmail.com -----------------------------------------------------"); 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /src/cn/ucaner/pattern/action/action.md: -------------------------------------------------------------------------------- 1 | # 行为型设计模式 2 | 3 | | 包名 | 描述 | 4 | | ------- | ----- | 5 | | visitor | 访问者模式 | 6 | |observer|观察者模式| 7 | 8 | 9 | -------------------------------------------------------------------------------- /src/cn/ucaner/pattern/action/chainOfResponsibility/BossHandler.java: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * 4 | *

Copyright 1994 JsonInternational

5 | *

All rights reserved.

6 | *

Created on 19941115

7 | *

Created by Jason

8 | * 9 | * 10 | */ 11 | package cn.ucaner.pattern.action.chainOfResponsibility; 12 | 13 | import cn.ucaner.pattern.action.chainOfResponsibility.abs.Handler; 14 | 15 | /** 16 | * @Package:cn.ucaner.pattern.action.chainOfResponsibility 17 | * @ClassName:BossHandler 18 | * @Description:

责任链模式

19 | * @Author: - 20 | * @CreatTime:2017年10月26日 下午1:40:14 21 | * @Modify By: 22 | * @ModifyTime: 23 | * @Modify marker: 24 | * @version V1.0 25 | */ 26 | public class BossHandler extends Handler { 27 | 28 | private int moneny; 29 | 30 | @Override 31 | public int getLevel() { 32 | return this.moneny; 33 | } 34 | 35 | @Override 36 | public String getnName() { 37 | return "BOSS"; 38 | } 39 | 40 | public int getMoneny() { 41 | return moneny; 42 | } 43 | 44 | public void setMoneny(int moneny) { 45 | this.moneny = moneny; 46 | } 47 | 48 | /** 49 | * BossHandler. 50 | * @param moneny 51 | */ 52 | public BossHandler(int moneny) { 53 | super(); 54 | this.moneny = moneny; 55 | } 56 | 57 | } 58 | -------------------------------------------------------------------------------- /src/cn/ucaner/pattern/action/chainOfResponsibility/ChainOfReponsibilityMain.java: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * 4 | *

Copyright 1994 JsonInternational

5 | *

All rights reserved.

6 | *

Created on 19941115

7 | *

Created by Jason

8 | * 9 | * 10 | */ 11 | package cn.ucaner.pattern.action.chainOfResponsibility; 12 | 13 | import cn.ucaner.pattern.action.chainOfResponsibility.abs.Handler; 14 | 15 | /** 16 | * @Package:cn.ucaner.pattern.action.chainOfResponsibility 17 | * @ClassName:ChainOfReponsibilityMain 18 | * @Description:

责任链模式

19 | * @Author: - 20 | * @CreatTime:2017年10月26日 下午1:40:32 21 | * @Modify By: 22 | * @ModifyTime: 23 | * @Modify marker: 24 | * @version V1.0 25 | */ 26 | public class ChainOfReponsibilityMain { 27 | 28 | public static void main(String[] args) { 29 | /** 30 | * 我要报销的钱数 31 | */ 32 | int money=10000; 33 | 34 | /** 35 | * 初始化各个处理者 36 | */ 37 | Handler manager = new ManagerHandler(200); 38 | Handler finance = new FinanceHandler(500); 39 | Handler boss = new BossHandler(1000); 40 | 41 | //manager -> finace -> boss 42 | 43 | /** 44 | * 设置链中的顺序 45 | */ 46 | manager.setNextHandler(finance); 47 | 48 | finance.setNextHandler(boss); 49 | 50 | //do 51 | System.out.println("I want 报销 "+money+" yuan."); 52 | if (manager.handlerRequst(money)) { 53 | System.out.println("报销Success!"); 54 | } else { 55 | System.out.println("报销Fail!"); 56 | } 57 | } 58 | 59 | } 60 | //Outputs 61 | //I want 报销 5 yuan. 62 | //Manager向Financer递交请求 63 | //Financer向BOSS递交请求 64 | //BOSS :可以审批 65 | //Financer :BOSS说可以审批 66 | //Manager :Financer说可以审批 67 | //报销Success! -------------------------------------------------------------------------------- /src/cn/ucaner/pattern/action/chainOfResponsibility/FinanceHandler.java: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * 4 | *

Copyright 1994 JsonInternational

5 | *

All rights reserved.

6 | *

Created on 19941115

7 | *

Created by Jason

8 | * 9 | * 10 | */ 11 | package cn.ucaner.pattern.action.chainOfResponsibility; 12 | 13 | import cn.ucaner.pattern.action.chainOfResponsibility.abs.Handler; 14 | 15 | /** 16 | * @Package:cn.ucaner.pattern.action.chainOfResponsibility 17 | * @ClassName:FinanceHandler 18 | * @Description:

*模式:责任链模式 19 | * 备注 公司财务,李财务*

20 | * @Author: - 21 | * @CreatTime:2017年10月26日 下午1:41:00 22 | * @Modify By: 23 | * @ModifyTime: 24 | * @Modify marker: 25 | * @version V1.0 26 | */ 27 | public class FinanceHandler extends Handler { 28 | 29 | private int moneny; 30 | 31 | @Override 32 | public int getLevel() { 33 | return this.moneny; 34 | } 35 | 36 | @Override 37 | public String getnName() { 38 | return "Financer"; 39 | } 40 | 41 | public int getMoneny() { 42 | return moneny; 43 | } 44 | public void setMoneny(int moneny) { 45 | this.moneny = moneny; 46 | } 47 | 48 | public FinanceHandler(int moneny) { 49 | super(); 50 | this.moneny = moneny; 51 | } 52 | 53 | 54 | 55 | } 56 | -------------------------------------------------------------------------------- /src/cn/ucaner/pattern/action/chainOfResponsibility/ManagerHandler.java: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * 4 | *

Copyright 1994 JsonInternational

5 | *

All rights reserved.

6 | *

Created on 19941115

7 | *

Created by Jason

8 | * 9 | * 10 | */ 11 | package cn.ucaner.pattern.action.chainOfResponsibility; 12 | 13 | import cn.ucaner.pattern.action.chainOfResponsibility.abs.Handler; 14 | 15 | /** 16 | * @Package:cn.ucaner.pattern.action.chainOfResponsibility 17 | * @ClassName:ManagerHandler 18 | * @Description:

责任链模式 19 | * 备注 你的上司,牛经理

20 | * @Author: - 21 | * @CreatTime:2017年10月26日 下午1:41:26 22 | * @Modify By: 23 | * @ModifyTime: 24 | * @Modify marker: 25 | * @version V1.0 26 | */ 27 | public class ManagerHandler extends Handler { 28 | 29 | private int moneny; 30 | 31 | @Override 32 | public int getLevel() { 33 | return this.moneny; 34 | } 35 | 36 | @Override 37 | public String getnName() { 38 | return "Manager"; 39 | } 40 | 41 | public ManagerHandler(int moneny) { 42 | super(); 43 | this.moneny = moneny; 44 | } 45 | 46 | public int getMoneny() { 47 | return moneny; 48 | } 49 | 50 | public void setMoneny(int moneny) { 51 | this.moneny = moneny; 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /src/cn/ucaner/pattern/action/chainOfResponsibility/abs/Handler.java: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * 4 | *

Copyright 1994 JsonInternational

5 | *

All rights reserved.

6 | *

Created on 19941115

7 | *

Created by Jason

8 | * 9 | * 10 | */ 11 | package cn.ucaner.pattern.action.chainOfResponsibility.abs; 12 | 13 | /** 14 | * @Package:cn.ucaner.pattern.action.chainOfResponsibility.abs 15 | * @ClassName:Handler 16 | * @Description:

责任链模式

17 | * @Author: - 18 | * @CreatTime:2017年10月26日 下午1:39:52 19 | * @Modify By: 20 | * @ModifyTime: 21 | * @Modify marker: 22 | * @version V1.0 23 | */ 24 | public abstract class Handler { 25 | 26 | /** 27 | * 下一个执行者 28 | */ 29 | private Handler nextHandler; 30 | 31 | /** 32 | * @Description: 当前执行者对请求做处理 需要处理的Biz对象 33 | * @param handLeve 34 | * @return boolean 35 | * @Autor: Jason - jasonandy@hotmail.com 36 | */ 37 | public final boolean handlerRequst(int handLeve){ 38 | 39 | boolean bReq=false; 40 | /** 41 | * 判断自己是否可以审核 - 可以审核的话 直接审核完毕 42 | */ 43 | if(getLevel()>=handLeve){ 44 | System.out.println(getnName()+" :可以审批"); 45 | return true; 46 | }else { 47 | if(this.nextHandler!=null){ 48 | /** 49 | * 超过阈值 向上一级提交申请 50 | */ 51 | //System.out.println(String.format("金额%s超过%s的审核级别 向上一级%s提交申请 ",handLeve,getnName(), nextHandler.getnName())); 52 | System.out.println(getnName()+"向"+nextHandler.getnName()+"递交请求"); 53 | /** 54 | * 向上一级请求 55 | */ 56 | bReq=nextHandler.handlerRequst(handLeve); 57 | /** 58 | * 根据上级的答复做出回应 59 | */ 60 | if(bReq){ 61 | System.out.println(getnName()+" :"+nextHandler.getnName()+"说可以审批"); 62 | }else { 63 | System.out.println(getnName()+" :"+nextHandler.getnName()+"说不可以审批"); 64 | } 65 | }else { 66 | /** 67 | * 到这边已经没有下一个处理者了 68 | */ 69 | System.out.println(getnName()+" :金额太大了"); 70 | } 71 | } 72 | return bReq; 73 | } 74 | 75 | public void setNextHandler(Handler nextHandler) { 76 | this.nextHandler = nextHandler; 77 | } 78 | 79 | /** 80 | * @Description: 可以审批的金额 81 | * @return int 82 | * @Autor: Jason - jasonandy@hotmail.com 83 | */ 84 | public abstract int getLevel(); 85 | 86 | 87 | 88 | /** 89 | * @Description: 处理者名字 90 | * @return String 91 | * @Autor: Jason - jasonandy@hotmail.com 92 | */ 93 | public abstract String getnName(); 94 | 95 | } 96 | -------------------------------------------------------------------------------- /src/cn/ucaner/pattern/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/cn/ucaner/pattern/action/command/Code.java: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * 4 | *

Copyright 1994 JsonInternational

5 | *

All rights reserved.

6 | *

Created on 19941115

7 | *

Created by Jason

8 | * 9 | * 10 | */ 11 | package cn.ucaner.pattern.action.command; 12 | 13 | import cn.ucaner.pattern.action.command.absCommand.Group; 14 | 15 | /** 16 | * @Package:cn.ucaner.pattern.action.command 17 | * @ClassName:Code 18 | * @Description:

命令模式 - coder 码农

19 | * @Author: - 20 | * @CreatTime:2017年10月26日 下午5:35:37 21 | * @Modify By: 22 | * @ModifyTime: 23 | * @Modify marker: 24 | * @version V1.0 25 | */ 26 | public class Code extends Group { 27 | 28 | 29 | @Override 30 | public void getCommand() { 31 | System.out.println("开发收到命令"); 32 | } 33 | 34 | @Override 35 | public void doAdd() { 36 | System.out.println("开发新写了一个页面"); 37 | } 38 | 39 | @Override 40 | public void doDel() { 41 | System.out.println("开发注释了一个页面"); 42 | } 43 | 44 | @Override 45 | public void plan() { 46 | System.out.println("开发变更完毕"); 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /src/cn/ucaner/pattern/action/command/CommandMain.java: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * 4 | *

Copyright 1994 JsonInternational

5 | *

All rights reserved.

6 | *

Created on 19941115

7 | *

Created by Jason

8 | * 9 | * 10 | */ 11 | package cn.ucaner.pattern.action.command; 12 | 13 | import cn.ucaner.pattern.action.command.command.AddPageCommand; 14 | 15 | /** 16 | * @Package:cn.ucaner.pattern.action.command 17 | * @ClassName:CommandMain 18 | * @Description:

命令模式 -- 执行类

19 | * @Author: - 20 | * @CreatTime:2017年10月26日 下午5:34:55 21 | * @Modify By: 22 | * @ModifyTime: 23 | * @Modify marker: 24 | * @version V1.0 25 | */ 26 | public class CommandMain { 27 | 28 | /** 29 | * @Description: Just for test 30 | * @Autor: Jason- jasonandy@hotmail.com 31 | */ 32 | public static void main(String[] args) { 33 | Invoker invoker=new Invoker(); 34 | invoker.setCommand(new AddPageCommand()); 35 | invoker.Call(); 36 | } 37 | 38 | } 39 | -------------------------------------------------------------------------------- /src/cn/ucaner/pattern/action/command/Invoker.java: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * 4 | *

Copyright 1994 JsonInternational

5 | *

All rights reserved.

6 | *

Created on 19941115

7 | *

Created by Jason

8 | * 9 | * 10 | */ 11 | package cn.ucaner.pattern.action.command; 12 | 13 | import cn.ucaner.pattern.action.command.absCommand.Command; 14 | 15 | /** 16 | * @Package:cn.ucaner.pattern.action.command 17 | * @ClassName:Invoker 18 | * @Description:

命令模式 ---负责人

19 | * @Author: - 20 | * @CreatTime:2017年10月26日 下午5:34:36 21 | * @Modify By: 22 | * @ModifyTime: 23 | * @Modify marker: 24 | * @version V1.0 25 | */ 26 | public class Invoker { 27 | 28 | private Command command; 29 | 30 | public void setCommand(Command command) { 31 | this.command = command; 32 | } 33 | 34 | public void Call() { 35 | this.command.execute(); 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /src/cn/ucaner/pattern/action/command/Product.java: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * 4 | *

Copyright 1994 JsonInternational

5 | *

All rights reserved.

6 | *

Created on 19941115

7 | *

Created by Jason

8 | * 9 | * 10 | */ 11 | package cn.ucaner.pattern.action.command; 12 | 13 | import cn.ucaner.pattern.action.command.absCommand.Group; 14 | 15 | /** 16 | * @Package:cn.ucaner.pattern.action.command 17 | * @ClassName:Product 18 | * @Description:

命令模式 --- 产品经理

19 | * @Author: - 20 | * @CreatTime:2017年10月26日 下午5:34:14 21 | * @Modify By: 22 | * @ModifyTime: 23 | * @Modify marker: 24 | * @version V1.0 25 | */ 26 | public class Product extends Group { 27 | 28 | 29 | @Override 30 | public void getCommand() { 31 | System.out.println("产品经理收到命令"); 32 | } 33 | 34 | @Override 35 | public void doAdd() { 36 | System.out.println("产品经理新增了一个需求"); 37 | } 38 | 39 | @Override 40 | public void doDel() { 41 | System.out.println("产品经理砍掉了一个需求"); 42 | } 43 | 44 | @Override 45 | public void plan() { 46 | System.out.println("产品变更完毕"); 47 | } 48 | 49 | public void acceptance() { 50 | System.out.println("产品经理验收"); 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /src/cn/ucaner/pattern/action/command/Projecter.java: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * 4 | *

Copyright 1994 JsonInternational

5 | *

All rights reserved.

6 | *

Created on 19941115

7 | *

Created by Jason

8 | * 9 | * 10 | */ 11 | package cn.ucaner.pattern.action.command; 12 | 13 | import cn.ucaner.pattern.action.command.absCommand.Group; 14 | 15 | /** 16 | * @Package:cn.ucaner.pattern.action.command 17 | * @ClassName:Projecter 18 | * @Description:

项目经理

19 | * @Author: - Jason 20 | * @CreatTime:2018年6月20日 上午8:38:44 21 | * @Modify By: 22 | * @ModifyTime: 2018年6月20日 23 | * @Modify marker: 24 | * @version V1.0 25 | */ 26 | public class Projecter extends Group{ 27 | 28 | @Override 29 | public void getCommand() { 30 | System.out.println("项目经理讨论项目方案"); 31 | } 32 | 33 | @Override 34 | public void doAdd() { 35 | System.out.println("批准项目"); 36 | } 37 | 38 | @Override 39 | public void doDel() { 40 | System.out.println("重审项目"); 41 | } 42 | 43 | @Override 44 | public void plan() { 45 | System.out.println("实施项目落地"); 46 | } 47 | 48 | public void acceptance() { 49 | System.out.println("项目验收"); 50 | } 51 | 52 | } 53 | -------------------------------------------------------------------------------- /src/cn/ucaner/pattern/action/command/UI.java: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * 4 | *

Copyright 1994 JsonInternational

5 | *

All rights reserved.

6 | *

Created on 19941115

7 | *

Created by Jason

8 | * 9 | * 10 | */ 11 | package cn.ucaner.pattern.action.command; 12 | 13 | import cn.ucaner.pattern.action.command.absCommand.Group; 14 | 15 | /** 16 | * @Package:cn.ucaner.pattern.action.command 17 | * @ClassName:UI 18 | * @Description:

命令模式 --- UI妹子

19 | * @Author: - 20 | * @CreatTime:2017年10月26日 下午5:33:50 21 | * @Modify By: 22 | * @ModifyTime: 23 | * @Modify marker: 24 | * @version V1.0 25 | */ 26 | public class UI extends Group { 27 | 28 | 29 | @Override 30 | public void getCommand() { 31 | System.out.println("UI收到命令"); 32 | } 33 | 34 | @Override 35 | public void doAdd() { 36 | System.out.println("UI新增了一个页面"); 37 | } 38 | 39 | @Override 40 | public void doDel() { 41 | System.out.println("UI去掉了一个页面"); 42 | } 43 | 44 | @Override 45 | public void plan() { 46 | System.out.println("UI变更完毕"); 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /src/cn/ucaner/pattern/action/command/absCommand/Command.java: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * 4 | *

Copyright 1994 JsonInternational

5 | *

All rights reserved.

6 | *

Created on 19941115

7 | *

Created by Jason

8 | * 9 | * 10 | */ 11 | package cn.ucaner.pattern.action.command.absCommand; 12 | 13 | import cn.ucaner.pattern.action.command.Code; 14 | import cn.ucaner.pattern.action.command.Product; 15 | import cn.ucaner.pattern.action.command.Projecter; 16 | import cn.ucaner.pattern.action.command.UI; 17 | 18 | /** 19 | * @Package:cn.ucaner.pattern.action.command.absCommand 20 | * @ClassName:Command 21 | * @Description:

命令模式 --- 处理命令

22 | * @Author: - 23 | * @CreatTime:2017年10月26日 下午5:36:46 24 | * @Modify By: 25 | * @ModifyTime: 26 | * @Modify marker: 27 | * @version V1.0 28 | */ 29 | public abstract class Command { 30 | 31 | /** 32 | * 项目经理 33 | */ 34 | protected Projecter pm = new Projecter(); 35 | 36 | /** 37 | * 产品经理 38 | */ 39 | protected Product product = new Product(); 40 | 41 | /** 42 | * UI 43 | */ 44 | protected UI ui = new UI(); 45 | 46 | /** 47 | * 码农实现 48 | */ 49 | protected Code code =new Code(); 50 | 51 | 52 | /* private List gps; 53 | 54 | public List getGps() { 55 | return gps; 56 | } 57 | 58 | public void setGps(List gps) { 59 | this.gps = gps; 60 | }*/ 61 | 62 | 63 | /** 64 | * @Description: execute 65 | * @Autor: Jason - jasonandy@hotmail.com 66 | */ 67 | public abstract void execute(); 68 | } 69 | -------------------------------------------------------------------------------- /src/cn/ucaner/pattern/action/command/absCommand/Group.java: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * 4 | *

Copyright 1994 JsonInternational

5 | *

All rights reserved.

6 | *

Created on 19941115

7 | *

Created by Jason

8 | * 9 | * 10 | */ 11 | package cn.ucaner.pattern.action.command.absCommand; 12 | 13 | /** 14 | * @Package:cn.ucaner.pattern.action.command.absCommand 15 | * @ClassName:Group 16 | * @Description:

命令模式 --- 抽象执行者

17 | * @Author: - 18 | * @CreatTime:2017年10月26日 下午5:36:27 19 | * @Modify By: 20 | * @ModifyTime: 21 | * @Modify marker: 22 | * @version V1.0 23 | */ 24 | public abstract class Group { 25 | 26 | /** 27 | * @Description: 得到命令 28 | * @Autor: Jason - jasonandy@hotmail.com 29 | */ 30 | public abstract void getCommand(); 31 | 32 | /** 33 | * @Description: 新增一个功能 34 | * @Autor: Jason - jasonandy@hotmail.com 35 | */ 36 | public abstract void doAdd(); 37 | 38 | /** 39 | * @Description: 减去一个功能 40 | * @Autor: Jason - jasonandy@hotmail.com 41 | */ 42 | public abstract void doDel(); 43 | 44 | /** 45 | * @Description: 开始实施 46 | * @Autor: Jason - jasonandy@hotmail.com 47 | */ 48 | public abstract void plan(); 49 | 50 | } 51 | -------------------------------------------------------------------------------- /src/cn/ucaner/pattern/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/cn/ucaner/pattern/action/command/command/AddPageCommand.java: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * 4 | *

Copyright 1994 JsonInternational

5 | *

All rights reserved.

6 | *

Created on 19941115

7 | *

Created by Jason

8 | * 9 | * 10 | */ 11 | package cn.ucaner.pattern.action.command.command; 12 | 13 | import cn.ucaner.pattern.action.command.absCommand.Command; 14 | 15 | /** 16 | * @Package:cn.ucaner.pattern.action.command.command 17 | * @ClassName:AddPageCommand 18 | * @Description:

命令模式 -- 新增一个页面

19 | * @Author: - 20 | * @CreatTime:2017年10月26日 下午5:36:00 21 | * @Modify By: 22 | * @ModifyTime: 23 | * @Modify marker: 24 | * @version V1.0 25 | */ 26 | public class AddPageCommand extends Command { 27 | 28 | @Override 29 | public void execute() { 30 | //项目经理 31 | super.pm.getCommand(); 32 | product.getCommand();//产品经理 33 | ui.getCommand();//ui 34 | code.getCommand();//码农 35 | pm.doAdd(); 36 | product.doAdd();//添加 37 | pm.plan(); 38 | product.plan();//执行 39 | ui.doAdd();//添加 40 | ui.plan();//执行 41 | code.doAdd();//添加 42 | code.plan();//执行 43 | product.acceptance(); 44 | pm.acceptance(); 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /src/cn/ucaner/pattern/action/observer/ObserverMain.java: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * 4 | *

Copyright 1994 JsonInternational

5 | *

All rights reserved.

6 | *

Created on 19941115

7 | *

Created by Jason

8 | * 9 | * 10 | */ 11 | package cn.ucaner.pattern.action.observer; 12 | 13 | import cn.ucaner.pattern.action.observer.observerAbs.Subject; 14 | import cn.ucaner.pattern.action.observer.observerIml.DiaoSi; 15 | import cn.ucaner.pattern.action.observer.observerIml.GaoFuShuai; 16 | import cn.ucaner.pattern.action.observer.observerIml.NvShen; 17 | 18 | /** 19 | * @Package:cn.ucaner.pattern.action.observer 20 | * @ClassName:ObserverMain 21 | * @Description:

观察者模式 - 观察者模式运行类

22 | * @Author: - 23 | * @CreatTime:2017年10月26日 下午5:26:58 24 | * @Modify By: 25 | * @ModifyTime: 26 | * @Modify marker: 27 | * @version V1.0 28 | */ 29 | public class ObserverMain { 30 | 31 | /** 32 | * @Description: Test 33 | * @Autor: Jason - Jasonandy@hotmail.com 34 | */ 35 | public static void main(String[] args) { 36 | 37 | NvShen nvShen=new NvShen(); 38 | 39 | /** 40 | * 添加观察者 41 | */ 42 | getObservers(nvShen); 43 | 44 | 45 | //女神要出去逛街了!!! 46 | nvShen.goShopping(); 47 | 48 | } 49 | 50 | /** 51 | * 添加观察者 52 | */ 53 | public static void getObservers(Subject nvShen){ 54 | for (int i = 0; i < 10 ; i++) { 55 | String remark = String.format("有车 : %s ,有房: %s ,有学历: %s", "BBQ","BeiJing","常春藤"); 56 | GaoFuShuai gaoFuShuai = new GaoFuShuai("GFS"+i, (long)(i^(i+88)),remark ); 57 | DiaoSi diaosi=new DiaoSi("DiaoSi"+i); 58 | nvShen.Attach(diaosi); 59 | if (i%2!=0) { 60 | nvShen.Attach(gaoFuShuai);//添加高富帅 61 | nvShen.Detach(diaosi); 62 | /*if (i%3==0) { 63 | nvShen.Detach(gaoFuShuai);//剔除高富帅 64 | }*/ 65 | } 66 | 67 | } 68 | } 69 | 70 | } 71 | //Outputs 72 | //Sorry , 条件不满足 - DiaoSi1已经被踢出队伍. 73 | //Sorry , 条件不满足 - DiaoSi3已经被踢出队伍. 74 | //Sorry , 条件不满足 - DiaoSi5已经被踢出队伍. 75 | //Sorry , 条件不满足 - DiaoSi7已经被踢出队伍. 76 | //Sorry , 条件不满足 - DiaoSi9已经被踢出队伍. 77 | //女神准备要去逛街了!!! 78 | //Hello , I'm GaoFuShuai .My Name is GFS1 79 | //Little sister ,小姐姐约吗? My Wechat is 88 80 | //DiaoSi2已经知道女神出门,准备跟(wei)踪(sui) 81 | //DiaoSi2在下想约你可以吗? 82 | //Hello , I'm GaoFuShuai .My Name is GFS3 83 | //Little sister ,小姐姐约吗? My Wechat is 88 84 | //DiaoSi4已经知道女神出门,准备跟(wei)踪(sui) 85 | //DiaoSi4在下想约你可以吗? 86 | //Hello , I'm GaoFuShuai .My Name is GFS5 87 | //Little sister ,小姐姐约吗? My Wechat is 88 88 | //DiaoSi6已经知道女神出门,准备跟(wei)踪(sui) 89 | //DiaoSi6在下想约你可以吗? 90 | //Hello , I'm GaoFuShuai .My Name is GFS7 91 | //Little sister ,小姐姐约吗? My Wechat is 88 92 | //DiaoSi8已经知道女神出门,准备跟(wei)踪(sui) 93 | //DiaoSi8在下想约你可以吗? 94 | //Hello , I'm GaoFuShuai .My Name is GFS9 95 | //Little sister ,小姐姐约吗? My Wechat is 104 96 | //追求者已全部出动! -------------------------------------------------------------------------------- /src/cn/ucaner/pattern/action/observer/display/CurrentConditionsDisplay.java: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * 4 | *

Copyright JasonInternational

5 | *

All rights reserved.

6 | *

Created on 2018年10月13日 下午3:21:16

7 | *

Created by Jason

8 | * 9 | * 10 | */ 11 | package cn.ucaner.pattern.action.observer.display; 12 | 13 | import cn.ucaner.pattern.action.observer.observerAbs.ObserverInf; 14 | import cn.ucaner.pattern.action.observer.subject.Subject; 15 | 16 | /** 17 | * @Package:cn.ucaner.pattern.action.observer.display 18 | * @ClassName:CurrentConditionsDisplay 19 | * @Description:

CurrentConditionsDisplay 布告板

20 | * @Author: - Jason 21 | * @CreatTime:2018年10月13日 下午3:21:16 22 | * @Modify By: 23 | * @ModifyTime: 2018年10月13日 24 | * @Modify marker: 25 | * @version V1.0 26 | */ 27 | public class CurrentConditionsDisplay implements ObserverInf, DisplayElement{ 28 | 29 | private float temperature; //温度 30 | 31 | private float humidity; //湿度 32 | 33 | private Subject weatherData; //主题 34 | 35 | // 当前布告板 构造之时 订阅 了 主题 36 | /** 37 | * CurrentConditionsDisplay. 构造的时候订阅被观察的对象 38 | * @param weatherData 39 | */ 40 | public CurrentConditionsDisplay(Subject weatherData){ 41 | this.weatherData = weatherData; 42 | this.weatherData.registerObserver(this); 43 | } 44 | 45 | @Override 46 | public void display() { 47 | System.out.println("NO.1:当前布告板: 温度"+ temperature +"度,湿度"+humidity+"%"); 48 | } 49 | 50 | @Override 51 | public void update(float temperature, float humidity, float pressure) { 52 | this.temperature = temperature; 53 | this.humidity = humidity; 54 | display(); 55 | } 56 | 57 | @Override 58 | public void sysnc() { 59 | System.out.println("CURRENTCONDITIONSDISPLAY-开始数据同步"); 60 | } 61 | 62 | } 63 | -------------------------------------------------------------------------------- /src/cn/ucaner/pattern/action/observer/display/DisplayElement.java: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * 4 | *

Copyright JasonInternational

5 | *

All rights reserved.

6 | *

Created on 2018年10月13日 下午3:07:39

7 | *

Created by Jason

8 | * 9 | * 10 | */ 11 | package cn.ucaner.pattern.action.observer.display; 12 | 13 | /** 14 | * @Package:cn.ucaner.pattern.action.observer.observerAbs 15 | * @ClassName:DisplayElement 16 | * @Description:

用以强行要求写显示方法

17 | * @Author: - Jason 18 | * @CreatTime:2018年10月13日 下午3:07:39 19 | * @Modify By: 20 | * @ModifyTime: 2018年10月13日 21 | * @Modify marker: 22 | * @version V1.0 23 | */ 24 | public interface DisplayElement { 25 | 26 | /** 27 | * @Description: 外观显示方法 - 展示 被观察者 的具体的信息的方法. 28 | * @Autor: Jason 29 | */ 30 | public void display(); 31 | 32 | /** 33 | * @Description:开始同步数据. 34 | * @Autor: Jason 35 | */ 36 | public void sysnc(); 37 | } 38 | -------------------------------------------------------------------------------- /src/cn/ucaner/pattern/action/observer/display/DisplayTest.java: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * 4 | *

Copyright JasonInternational

5 | *

All rights reserved.

6 | *

Created on 2018年10月13日 下午3:28:54

7 | *

Created by Jason

8 | * 9 | * 10 | */ 11 | package cn.ucaner.pattern.action.observer.display; 12 | 13 | import cn.ucaner.pattern.action.observer.subimpl.WeatherData; 14 | 15 | /** 16 | * @Package:cn.ucaner.pattern.action.observer.display 17 | * @ClassName:DisplayTest 18 | * @Description:

DisplayTest

19 | * @Author: - Jason 20 | * @CreatTime:2018年10月13日 下午3:28:54 21 | * @Modify By: 22 | * @ModifyTime: 2018年10月13日 23 | * @Modify marker: 24 | * @version V1.0 25 | */ 26 | public class DisplayTest { 27 | 28 | public static void main(String[] args) { 29 | 30 | /** 31 | * step1. 被观察的对象 - 天气对象. 32 | */ 33 | WeatherData weatherData = new WeatherData(); 34 | 35 | // 2. 新建显示1-当前状态,显示2-气象统计,显示3-天气预报 36 | 37 | /** 38 | * CurrentConditionsDisplay 观察者 - 相当于一个订阅者 No.1 39 | */ 40 | CurrentConditionsDisplay currentDisplay = new CurrentConditionsDisplay(weatherData); 41 | currentDisplay.sysnc(); 42 | 43 | /** 44 | * StatisticsDisplay 观察者 - 相当于一个订阅者 No.2 45 | */ 46 | StatisticsDisplay statisticsDisplay = new StatisticsDisplay(weatherData); 47 | statisticsDisplay.sysnc(); 48 | 49 | /** 50 | * ForecastDisplay 观察者 - 相当于一个订阅者 No.3 51 | */ 52 | ForecastDisplay forecastDisplay = new ForecastDisplay(weatherData); 53 | forecastDisplay.sysnc(); 54 | 55 | /** 56 | * 被订阅的对象 数据发生了改变 57 | * 通知到订阅了 该对象的人 58 | * 消息推送过去. 59 | */ 60 | System.out.println("----------------------"); 61 | weatherData.setMeasurements(20, 65, 30.4f); 62 | System.out.println("**********************"); 63 | weatherData.setMeasurements(30, 70, 29.7f); 64 | System.out.println("---------------------"); 65 | weatherData.setMeasurements(25, 90, 29.6f); 66 | System.out.println("**********************"); 67 | weatherData.setMeasurements(32, 85, 26.5f); 68 | System.out.println("---------------------"); 69 | weatherData.setMeasurements(32, 85, 26.5f); 70 | System.out.println("**********************"); 71 | } 72 | 73 | } 74 | -------------------------------------------------------------------------------- /src/cn/ucaner/pattern/action/observer/display/ForecastDisplay.java: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * 4 | *

Copyright JasonInternational

5 | *

All rights reserved.

6 | *

Created on 2018年10月13日 下午3:26:45

7 | *

Created by Jason

8 | * 9 | * 10 | */ 11 | package cn.ucaner.pattern.action.observer.display; 12 | 13 | import cn.ucaner.pattern.action.observer.observerAbs.ObserverInf; 14 | import cn.ucaner.pattern.action.observer.subject.Subject; 15 | 16 | /** 17 | * @Package:cn.ucaner.pattern.action.observer.display 18 | * @ClassName:ForecastDisplay 19 | * @Description:

ForecastDisplay

20 | * @Author: - Jason 21 | * @CreatTime:2018年10月13日 下午3:26:45 22 | * @Modify By: 23 | * @ModifyTime: 2018年10月13日 24 | * @Modify marker: 25 | * @version V1.0 26 | */ 27 | public class ForecastDisplay implements ObserverInf, DisplayElement{ 28 | 29 | private float currentPressure = 28.82f; // 当前气压 30 | private float lastPressure; // 上一次的气压 31 | private Subject weatherData; // 主题 32 | 33 | public ForecastDisplay(Subject weatherData) { 34 | this.weatherData = weatherData; 35 | this.weatherData.registerObserver(this); 36 | } 37 | 38 | @Override 39 | public void display() { 40 | if (currentPressure > lastPressure) { 41 | System.out.println("NO.3: 天气预报:温度正在持续上升!"); 42 | } else { 43 | System.out.println("NO.3: 天气预报:注意气温下降了,可能有雨!"); 44 | } 45 | } 46 | 47 | @Override 48 | public void update(float temperature, float humidity, float pressure) { 49 | lastPressure = currentPressure; 50 | currentPressure = pressure; 51 | display(); 52 | } 53 | 54 | @Override 55 | public void sysnc() { 56 | System.out.println("FORECASTDISPLAY - 开始数据同步."); 57 | } 58 | 59 | } 60 | -------------------------------------------------------------------------------- /src/cn/ucaner/pattern/action/observer/display/StatisticsDisplay.java: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * 4 | *

Copyright JasonInternational

5 | *

All rights reserved.

6 | *

Created on 2018年10月13日 下午3:24:35

7 | *

Created by Jason

8 | * 9 | * 10 | */ 11 | package cn.ucaner.pattern.action.observer.display; 12 | 13 | import cn.ucaner.pattern.action.observer.observerAbs.ObserverInf; 14 | import cn.ucaner.pattern.action.observer.subject.Subject; 15 | 16 | /** 17 | * @Package:cn.ucaner.pattern.action.observer.display 18 | * @ClassName:StatisticsDisplay 19 | * @Description:

显示2

20 | * @Author: - Jason 21 | * @CreatTime:2018年10月13日 下午3:24:35 22 | * @Modify By: 23 | * @ModifyTime: 2018年10月13日 24 | * @Modify marker: 25 | * @version V1.0 26 | */ 27 | public class StatisticsDisplay implements ObserverInf, DisplayElement{ 28 | 29 | private float maxTemp = 0.0f; // 最高温度 30 | private float minTemp = 0.0f; // 最低温度 31 | private float tempSum = 0.0f; // 温度更新和 32 | private int numReadings; // 温度更新次数 33 | 34 | Subject weatherData; // 主题 35 | 36 | /** 37 | * StatisticsDisplay. - 注册订阅者 38 | * @param weatherData 39 | */ 40 | public StatisticsDisplay(Subject weatherData) { 41 | this.weatherData = weatherData; 42 | this.weatherData.registerObserver(this); 43 | } 44 | 45 | @Override 46 | public void display() { 47 | System.out.println("NO.2:平均温度:" + (tempSum / numReadings) + ",最大温度:"+ maxTemp + ",最小温度:" + minTemp); 48 | } 49 | 50 | 51 | @Override 52 | public void update(float temperature, float humidity, float pressure) { 53 | // 统计温度和次数 用以算出平均温度 54 | float temp = temperature; 55 | tempSum += temp; 56 | numReadings++; 57 | 58 | // 设置最高温度 59 | if (temp > maxTemp) { 60 | maxTemp = temp; 61 | } 62 | // 设置最低温度 63 | if (temp < minTemp) { 64 | minTemp = temp; 65 | } 66 | 67 | display(); //更新完毕展示数据 68 | } 69 | 70 | @Override 71 | public void sysnc() { 72 | System.out.println("STATISTICSDISPLAY-开始数据同步."); 73 | } 74 | } 75 | -------------------------------------------------------------------------------- /src/cn/ucaner/pattern/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 | | GaoFuShuai | 高富帅 | 18 | | ObserverMain | 观察者模式运行类 | 19 | 20 | 21 | 22 | 这边展示的只是一个很简单的观察者模式,如果运用注解、泛型和反射的话,会更加方便。 23 | 24 | * 可以结合Spring的监听器模式学习. -------------------------------------------------------------------------------- /src/cn/ucaner/pattern/action/observer/observerAbs/Observer.java: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * 4 | *

Copyright 1994 JsonInternational

5 | *

All rights reserved.

6 | *

Created on 19941115

7 | *

Created by Jason

8 | * 9 | * 10 | */ 11 | package cn.ucaner.pattern.action.observer.observerAbs; 12 | 13 | /** 14 | * @Package:cn.ucaner.pattern.action.observer.observerAbs 15 | * @ClassName:Observer 16 | * @Description:

观察者模式 -- you 17 | * 18 | * 观察者Observer 19 | * 20 | * For Study Listener 21 | *

22 | * @Author: - 23 | * @CreatTime:2017年10月26日 下午5:29:32 24 | * @Modify By: 25 | * @ModifyTime: 26 | * @Modify marker: 27 | * @version V1.0 28 | */ 29 | public interface Observer { 30 | 31 | /** 32 | * @Description: Update 33 | * @Autor: Jason - jasonandy@hotmail.com 34 | */ 35 | public void Update(); 36 | 37 | 38 | /** 39 | * @Description: Say 40 | * @Autor: Jason - jasonandy@hotmail.com 41 | */ 42 | public void Say(); 43 | 44 | } 45 | -------------------------------------------------------------------------------- /src/cn/ucaner/pattern/action/observer/observerAbs/ObserverInf.java: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * 4 | *

Copyright JasonInternational

5 | *

All rights reserved.

6 | *

Created on 2018年10月13日 下午3:01:22

7 | *

Created by Jason

8 | * 9 | * 10 | */ 11 | package cn.ucaner.pattern.action.observer.observerAbs; 12 | 13 | /** 14 | * @Package:cn.ucaner.pattern.action.observer.observerAbs 15 | * @ClassName:ObserverInf 16 | * @Description:

ObserverInf 观察者接口

17 | * @Author: - Jason 18 | * @CreatTime:2018年10月13日 下午3:01:22 19 | * @Modify By: 20 | * @ModifyTime: 2018年10月13日 21 | * @Modify marker: 22 | * @version V1.0 23 | */ 24 | public interface ObserverInf { 25 | 26 | /** 27 | * @Description: 更新数据 - 数据发生改变的时候通知到其他地方. 28 | * @param temp 温度 29 | * @param humidity 湿度 30 | * @param pressure 气压 31 | * @Autor: Jason 32 | */ 33 | public void update(float temperature, float humidity, float pressure); 34 | 35 | } 36 | -------------------------------------------------------------------------------- /src/cn/ucaner/pattern/action/observer/observerAbs/Subject.java: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * 4 | *

Copyright 1994 JsonInternational

5 | *

All rights reserved.

6 | *

Created on 19941115

7 | *

Created by Jason

8 | * 9 | * 10 | */ 11 | package cn.ucaner.pattern.action.observer.observerAbs; 12 | 13 | /** 14 | * @Package:cn.ucaner.pattern.action.observer.observerAbs 15 | * @ClassName:Subject 16 | * @Description:

观察者模式 -- 抽像女神(被观察者) 17 | * 18 | * 被观察的对象 19 | * 20 | *

21 | * @Author: - 22 | * @CreatTime:2017年10月26日 下午5:30:06 23 | * @Modify By: 24 | * @ModifyTime: 25 | * @Modify marker: 26 | * @version V1.0 27 | */ 28 | public interface Subject { 29 | 30 | /** 31 | * @Description: 添加一个观察者 32 | * @param observer observer 33 | * @Autor: Jason - jasonandy@hotmail.com 34 | */ 35 | public void Attach(Observer observer); 36 | 37 | /** 38 | * @Description: 删除一个观察者 39 | * @param observer observer 40 | * @Autor: Jason - jasonandy@hotmail.com 41 | */ 42 | public void Detach(Observer observer); 43 | 44 | /** 45 | * @Description: 通知所有的观察者 46 | * @Autor: Jason - jasonandy@hotmail.com 47 | */ 48 | public void Notify(); 49 | 50 | } 51 | -------------------------------------------------------------------------------- /src/cn/ucaner/pattern/action/observer/observerIml/DiaoSi.java: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * 4 | *

Copyright 1994 JsonInternational

5 | *

All rights reserved.

6 | *

Created on 19941115

7 | *

Created by Jason

8 | * 9 | * 10 | */ 11 | package cn.ucaner.pattern.action.observer.observerIml; 12 | 13 | import cn.ucaner.pattern.action.observer.observerAbs.Observer; 14 | 15 | /** 16 | * @Package:cn.ucaner.pattern.action.observer.observerIml 17 | * @ClassName:DiaoSi 18 | * @Description:

观察者模式 --- 屌丝

19 | * @Author: - 20 | * @CreatTime:2017年10月26日 下午5:28:58 21 | * @Modify By: 22 | * @ModifyTime: 23 | * @Modify marker: 24 | * @version V1.0 25 | */ 26 | public class DiaoSi implements Observer{ 27 | 28 | private String name; 29 | 30 | public String getName() { 31 | return name; 32 | } 33 | 34 | public void setName(String name) { 35 | this.name = name; 36 | } 37 | 38 | public DiaoSi(String name) { 39 | this.name = name; 40 | } 41 | 42 | public DiaoSi() { 43 | } 44 | 45 | @Override 46 | public void Update() { 47 | System.out.println(name+"已经知道女神出门,准备跟(wei)踪(sui)"); 48 | } 49 | 50 | @Override 51 | public void Say() { 52 | System.out.println(name+"在下想约你可以吗?"); 53 | } 54 | 55 | 56 | } 57 | -------------------------------------------------------------------------------- /src/cn/ucaner/pattern/action/observer/observerIml/GaoFuShuai.java: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * 4 | *

Copyright 1994 JsonInternational

5 | *

All rights reserved.

6 | *

Created on 19941115

7 | *

Created by Jason

8 | * 9 | * 10 | */ 11 | package cn.ucaner.pattern.action.observer.observerIml; 12 | 13 | import cn.ucaner.pattern.action.observer.observerAbs.Observer; 14 | 15 | /** 16 | * @Package:cn.ucaner.pattern.action.observer.observerIml 17 | * @ClassName:GaoFuShuai 18 | * @Description:

观察者对象 - 高富帅

19 | * @Author: - Jason 20 | * @CreatTime: 21 | * @Modify By: 22 | * @ModifyTime: 23 | * @Modify marker: 24 | * @version V1.0 25 | */ 26 | public class GaoFuShuai implements Observer{ 27 | 28 | /** 29 | * 名字 30 | */ 31 | private String name; 32 | 33 | /** 34 | * 资产 35 | */ 36 | private Long property; 37 | 38 | /** 39 | * 备注 40 | */ 41 | private String Remark; 42 | 43 | @Override 44 | public void Update() { 45 | System.out.println("Hello , I'm GaoFuShuai .My Name is "+name); 46 | } 47 | 48 | @Override 49 | public void Say() { 50 | System.out.println("Little sister ,小姐姐约吗? My Wechat is "+property); 51 | } 52 | 53 | public String getName() { 54 | return name; 55 | } 56 | 57 | public void setName(String name) { 58 | this.name = name; 59 | } 60 | 61 | public Long getProperty() { 62 | return property; 63 | } 64 | 65 | public void setProperty(Long property) { 66 | this.property = property; 67 | } 68 | 69 | public String getRemark() { 70 | return Remark; 71 | } 72 | 73 | public void setRemark(String remark) { 74 | Remark = remark; 75 | } 76 | 77 | /** 78 | * GaoFuShuai. 79 | * @param name 80 | * @param property 81 | * @param remark 82 | */ 83 | public GaoFuShuai(String name, Long property, String remark) { 84 | super(); 85 | this.name = name; 86 | this.property = property; 87 | Remark = remark; 88 | } 89 | 90 | @Override 91 | public String toString() { 92 | return "I'm GaoFuShuai [name=" + name + ", property=" + property + ", Remark=" + Remark + "]"; 93 | } 94 | 95 | 96 | 97 | } 98 | -------------------------------------------------------------------------------- /src/cn/ucaner/pattern/action/observer/observerIml/NvShen.java: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * 4 | *

Copyright 1994 JsonInternational

5 | *

All rights reserved.

6 | *

Created on 19941115

7 | *

Created by Jason

8 | * 9 | * 10 | */ 11 | package cn.ucaner.pattern.action.observer.observerIml; 12 | 13 | 14 | import java.util.ArrayList; 15 | import java.util.List; 16 | 17 | import cn.ucaner.pattern.action.observer.observerAbs.Observer; 18 | import cn.ucaner.pattern.action.observer.observerAbs.Subject; 19 | 20 | /** 21 | * @Package:cn.ucaner.pattern.action.observer.observerIml 22 | * @ClassName:NvShen 23 | * @Description:

观察者模式 --- 女神

24 | * @Author: - 25 | * @CreatTime:2017年10月26日 下午5:28:12 26 | * @Modify By: 27 | * @ModifyTime: 28 | * @Modify marker: 29 | * @version V1.0 30 | */ 31 | 32 | public class NvShen implements Subject{ 33 | 34 | /** 35 | * 女神有一大堆观察者. 36 | */ 37 | private List observersList; 38 | 39 | //女神要去逛街了 40 | public void goShopping(){ 41 | System.out.println("女神准备要去逛街了!!!"); 42 | //调用通知方法 43 | Notify(); 44 | } 45 | 46 | 47 | /** 48 | * 添加观察者 49 | */ 50 | @Override 51 | public void Attach(Observer observer) { 52 | if(observersList==null){ 53 | observersList=new ArrayList(); 54 | }else { 55 | observersList.add(observer); 56 | } 57 | } 58 | 59 | 60 | /** 61 | * 删除观察者 62 | */ 63 | @Override 64 | public void Detach(Observer observer) { 65 | String name=((DiaoSi)observer).getName(); 66 | if(observersList==null||observersList.size()==0){ 67 | return; 68 | } 69 | if( observersList.remove(observer)){ 70 | System.out.println("Sorry , 条件不满足 - "+name+"已经被踢出队伍."); 71 | } 72 | } 73 | 74 | 75 | /** 76 | * 通知所有观察者 77 | */ 78 | @Override 79 | public void Notify() { 80 | //observersList 观察者List 81 | for (Observer observer:observersList) { 82 | //通知所有的跟随人员 83 | observer.Update(); 84 | observer.Say(); 85 | } 86 | System.out.print("追求者已全部出动!"); 87 | } 88 | 89 | } 90 | -------------------------------------------------------------------------------- /src/cn/ucaner/pattern/action/observer/subimpl/WeatherData.java: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * 4 | *

Copyright JasonInternational

5 | *

All rights reserved.

6 | *

Created on 2018年10月13日 下午3:09:55

7 | *

Created by Jason

8 | * 9 | * 10 | */ 11 | package cn.ucaner.pattern.action.observer.subimpl; 12 | 13 | import java.util.LinkedList; 14 | 15 | import cn.ucaner.pattern.action.observer.observerAbs.ObserverInf; 16 | import cn.ucaner.pattern.action.observer.subject.Subject; 17 | 18 | /** 19 | * @Package:cn.ucaner.pattern.action.observer.subimpl 20 | * @ClassName:WeatherData 21 | * @Description:

WeatherData

22 | * @Author: - Jason 23 | * @CreatTime:2018年10月13日 下午3:09:55 24 | * @Modify By: 25 | * @ModifyTime: 2018年10月13日 26 | * @Modify marker: 27 | * @version V1.0 28 | */ 29 | public class WeatherData implements Subject{ 30 | 31 | /** 32 | * 所有的订阅者 都存放到一起. - 维护所有注册的观察者 - 注册到这里 33 | * 链表方便Obj的添加删除操作. 34 | */ 35 | private LinkedList observers; 36 | 37 | /** 38 | *温度 39 | */ 40 | private float temperature; 41 | 42 | /** 43 | * 湿度 44 | */ 45 | private float humidity; 46 | 47 | /** 48 | * 气压 49 | */ 50 | private float pressure; 51 | 52 | /** 53 | * 构造时 - new出列表对象 54 | * WeatherData. 55 | */ 56 | public WeatherData(){ 57 | observers = new LinkedList(); 58 | } 59 | 60 | /** 61 | * @Description: 将观察者注册到列表中 62 | * @param o 观察者 63 | * @Autor: Jason 64 | */ 65 | @Override 66 | public void registerObserver(ObserverInf o) { 67 | observers.add(o); 68 | } 69 | 70 | /** 71 | * @Description: 移除 72 | * @param o 取消订阅的观察者 73 | * @Autor: Jason 74 | */ 75 | @Override 76 | public void removeObserver(ObserverInf o) { 77 | int i = observers.indexOf(o); //判断对象是不是在订阅者之中 要是存在的话就移除 78 | if (i >= 0){ 79 | observers.remove(i); 80 | }else { 81 | System.out.println(o.toString()+"没有订阅过,无法进行退订操作!"); 82 | } 83 | } 84 | 85 | 86 | /** 87 | * @Description: 通知订阅列表里的所有的订阅者 88 | * @Autor: Jason 89 | */ 90 | @Override 91 | public void notifyObservers() { 92 | for (ObserverInf observerInf : observers) { 93 | observerInf.update(temperature, humidity, pressure); 94 | } 95 | /* for (int i = 0; i < observers.size(); ++i){ 96 | ObserverInf observerInf = (ObserverInf)observers.get(i); 97 | observerInf.update(temperature, humidity, pressure); 98 | }*/ 99 | } 100 | 101 | /** 102 | * @Description: 当数据发生改变的时候 推送给订阅的人 103 | * @Autor: Jason 104 | */ 105 | public void measurementsChanged(){ 106 | notifyObservers(); 107 | } 108 | 109 | public void setMeasurements(float temperature, float humidity, float pressure){ 110 | this.temperature = temperature; 111 | this.humidity = humidity; 112 | this.pressure = pressure; 113 | measurementsChanged(); //发生改变 通知所有的订阅者 114 | } 115 | } 116 | -------------------------------------------------------------------------------- /src/cn/ucaner/pattern/action/observer/subject/Subject.java: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * 4 | *

Copyright JasonInternational

5 | *

All rights reserved.

6 | *

Created on 2018年10月13日 下午3:03:50

7 | *

Created by Jason

8 | * 9 | * 10 | */ 11 | package cn.ucaner.pattern.action.observer.subject; 12 | 13 | import cn.ucaner.pattern.action.observer.observerAbs.ObserverInf; 14 | 15 | /** 16 | * @Package:cn.ucaner.pattern.action.observer.subject 17 | * @ClassName:Subject 18 | * @Description:

主题接口

19 | * @Author: - Jason 20 | * @CreatTime:2018年10月13日 下午3:03:50 21 | * @Modify By: 22 | * @ModifyTime: 2018年10月13日 23 | * @Modify marker: 24 | * @version V1.0 25 | */ 26 | public interface Subject { 27 | 28 | /** 29 | * @Description: 用以注册观察者 - 也就是都有谁来关注这个 可以理解为订阅这个消息 30 | * @param o 具体的观察者 31 | * @Autor: Jason 32 | */ 33 | public void registerObserver(ObserverInf o); 34 | 35 | /** 36 | * @Description: 用以删除观察者 - 也就会谁会来退订这个所观察的对象 - 可以通俗的理解为退订 37 | * @param o 具体的观察者 38 | * @Autor: Jason 39 | */ 40 | public void removeObserver(ObserverInf o); 41 | 42 | /** 43 | * @Description: 来通知这个观察者 44 | * @Autor: Jason 45 | */ 46 | public void notifyObservers(); 47 | } 48 | -------------------------------------------------------------------------------- /src/cn/ucaner/pattern/action/state/StateMain.java: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * 4 | *

Copyright 1994 JsonInternational

5 | *

All rights reserved.

6 | *

Created on 19941115

7 | *

Created by Jason

8 | * 9 | * 10 | */ 11 | package cn.ucaner.pattern.action.state; 12 | 13 | import cn.ucaner.pattern.action.state.absState.Context; 14 | import cn.ucaner.pattern.action.state.allState.Stop; 15 | 16 | /** 17 | * @Package:cn.ucaner.pattern.action.state 18 | * @ClassName:StateMain 19 | * @Description:

状态模式 - 执行类

20 | * @Author: - 21 | * @CreatTime:2017年10月26日 下午4:58:00 22 | * @Modify By: 23 | * @ModifyTime: 24 | * @Modify marker: 25 | * @version V1.0 26 | */ 27 | public class StateMain { 28 | 29 | /** 30 | * @Description: TEST 不同的状态组合有不同的结果 - 电梯的运行和不同的状态有关. 31 | * @Autor: Jason 32 | */ 33 | public static void main(String[] args) { 34 | Context context=new Context(); 35 | 36 | /** 37 | * tips: 38 | * 不同的状态导致有不同的运行结果. 39 | */ 40 | 41 | //context.setNowState(new Run());// 运行 42 | //context.setNowState(new Open());//Open 开启状态 43 | //context.setNowState(new Close()); //close 关闭 44 | context.setNowState(new Stop());// stop状态 45 | 46 | 47 | /** 48 | * tips: 49 | * 不同的状态 可以进行的操作前提是有条件的. 50 | */ 51 | //context.open(); 52 | //context.close(); 53 | context.run(); 54 | //context.stop(); 55 | } 56 | } 57 | //Outputs 58 | //电梯门开启 59 | //电梯门关闭电梯正在运行 60 | //电梯停止了 61 | 62 | 63 | -------------------------------------------------------------------------------- /src/cn/ucaner/pattern/action/state/absState/Context.java: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * 4 | *

Copyright 1994 JsonInternational

5 | *

All rights reserved.

6 | *

Created on 19941115

7 | *

Created by Jason

8 | * 9 | * 10 | */ 11 | package cn.ucaner.pattern.action.state.absState; 12 | 13 | import cn.ucaner.pattern.action.state.allState.Close; 14 | import cn.ucaner.pattern.action.state.allState.Open; 15 | import cn.ucaner.pattern.action.state.allState.Run; 16 | import cn.ucaner.pattern.action.state.allState.Stop; 17 | 18 | /** 19 | * @Package:cn.ucaner.pattern.action.state.absState 20 | * @ClassName:Context 21 | * @Description:

状态模式 - 上下文

22 | * @Author: - 23 | * @CreatTime:2017年10月26日 下午4:54:51 24 | * @Modify By: 25 | * @ModifyTime: 26 | * @Modify marker: 27 | * @version V1.0 28 | */ 29 | public class Context { 30 | 31 | /** 32 | * 定义出所有的电梯状态 用在setState() 枚举状态. 33 | */ 34 | public static final Open open = new Open(); //打开状态 35 | public static final Close close = new Close();//关闭状态 36 | public static final Run run = new Run();//运行状态 37 | public static final Stop stop = new Stop();//停止状态 38 | 39 | /** 40 | * 当前的状态 41 | */ 42 | private State nowState; 43 | 44 | public void setNowState(State nowState) { 45 | this.nowState = nowState; 46 | /** 47 | * this --> context [其实就是nowContext] 48 | */ 49 | this.nowState.setContext(this); 50 | } 51 | 52 | public State getNowState() { 53 | return nowState; 54 | } 55 | 56 | public void open(){ 57 | nowState.open(); 58 | } 59 | 60 | public void close(){ 61 | nowState.close(); 62 | } 63 | 64 | public void run(){ 65 | nowState.run(); 66 | } 67 | 68 | public void stop(){ 69 | nowState.stop(); 70 | } 71 | } 72 | -------------------------------------------------------------------------------- /src/cn/ucaner/pattern/action/state/absState/State.java: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * 4 | *

Copyright 1994 JsonInternational

5 | *

All rights reserved.

6 | *

Created on 19941115

7 | *

Created by Jason

8 | * 9 | * 10 | */ 11 | package cn.ucaner.pattern.action.state.absState; 12 | 13 | /** 14 | * @Package:cn.ucaner.pattern.action.state.absState 15 | * @ClassName:State 16 | * @Description:

状态模式 - 抽象状态角色

17 | * @Author: - 18 | * @CreatTime:2017年10月26日 下午4:55:13 19 | * @Modify By: 20 | * @ModifyTime: 21 | * @Modify marker: 22 | * @version V1.0 23 | */ 24 | public abstract class State { 25 | 26 | /** 27 | * Context - 状态模式的上下文. 28 | */ 29 | protected Context context; 30 | 31 | /** 32 | * @Description: 设置状态 33 | * @param context 34 | * @Autor: Jason 35 | */ 36 | public void setContext(Context context) { 37 | this.context = context; 38 | } 39 | 40 | /** 41 | * @Description: 电梯门开启的动作 42 | * @Autor: Jason 43 | */ 44 | public abstract void open(); 45 | 46 | /** 47 | * @Description: 电梯门关闭的动作 48 | * @Autor: Jason 49 | */ 50 | public abstract void close(); 51 | 52 | /** 53 | * @Description:电梯运行起来 54 | * @Autor: Jason 55 | */ 56 | public abstract void run(); 57 | 58 | /** 59 | * @Description:电梯停下来 60 | * @Autor: Jason 61 | */ 62 | public abstract void stop(); 63 | } 64 | -------------------------------------------------------------------------------- /src/cn/ucaner/pattern/action/state/allState/Close.java: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * 4 | *

Copyright 1994 JsonInternational

5 | *

All rights reserved.

6 | *

Created on 19941115

7 | *

Created by Jason

8 | * 9 | * 10 | */ 11 | package cn.ucaner.pattern.action.state.allState; 12 | 13 | import cn.ucaner.pattern.action.state.absState.Context; 14 | import cn.ucaner.pattern.action.state.absState.State; 15 | 16 | /** 17 | * @Package:cn.ucaner.pattern.action.state.allState 18 | * @ClassName:Close 19 | * @Description:

状态模式 - 关闭状态

20 | * @Author: - 21 | * @CreatTime:2017年10月26日 下午4:55:55 22 | * @Modify By: 23 | * @ModifyTime: 24 | * @Modify marker: 25 | * @version V1.0 26 | */ 27 | public class Close extends State { 28 | 29 | 30 | /** 31 | * context - state的context 32 | */ 33 | @Override 34 | public void open() { 35 | //状态修改 36 | context.setNowState(Context.open); //设置为open状态 37 | //委托执行 38 | context.getNowState().open(); 39 | } 40 | 41 | @Override 42 | public void close() { 43 | System.out.print("电梯门关闭"); 44 | } 45 | 46 | //运行 47 | @Override 48 | public void run() { 49 | //状态修改 50 | context.setNowState(Context.run); 51 | //委托执行 52 | context.getNowState().run(); 53 | } 54 | 55 | //停止 56 | @Override 57 | public void stop() { 58 | //状态修改 59 | context.setNowState(Context.stop); 60 | //委托执行 61 | context.getNowState().stop(); 62 | 63 | } 64 | } 65 | -------------------------------------------------------------------------------- /src/cn/ucaner/pattern/action/state/allState/Open.java: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * 4 | *

Copyright 1994 JsonInternational

5 | *

All rights reserved.

6 | *

Created on 19941115

7 | *

Created by Jason

8 | * 9 | * 10 | */ 11 | package cn.ucaner.pattern.action.state.allState; 12 | 13 | import cn.ucaner.pattern.action.state.absState.Context; 14 | import cn.ucaner.pattern.action.state.absState.State; 15 | 16 | /** 17 | * @Package:cn.ucaner.pattern.action.state.allState 18 | * @ClassName:Open 19 | * @Description:

状态模式 - 打开

20 | * @Author: - 21 | * @CreatTime:2017年10月26日 下午4:56:20 22 | * @Modify By: 23 | * @ModifyTime: 24 | * @Modify marker: 25 | * @version V1.0 26 | */ 27 | public class Open extends State { 28 | 29 | 30 | /** 31 | * 开启 32 | */ 33 | @Override 34 | public void open() { 35 | System.out.println("OPEN-电梯门Open."); 36 | } 37 | 38 | /** 39 | * 关闭 40 | */ 41 | @Override 42 | public void close() { 43 | //状态修改 44 | context.setNowState(Context.close); 45 | //委托执行 46 | context.getNowState().close(); 47 | } 48 | 49 | /** 50 | * 开着门不能跑 51 | */ 52 | @Override 53 | public void run() { 54 | // by Jason 55 | System.out.println("RUN-开着门不能Run.!"); 56 | } 57 | 58 | /** 59 | * 开着门就是停止的 60 | */ 61 | @Override 62 | public void stop() { 63 | //by Jason 64 | System.out.println("STOP-开着门就是Stop.!"); 65 | } 66 | } 67 | -------------------------------------------------------------------------------- /src/cn/ucaner/pattern/action/state/allState/Run.java: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * 4 | *

Copyright 1994 JsonInternational

5 | *

All rights reserved.

6 | *

Created on 19941115

7 | *

Created by Jason

8 | * 9 | * 10 | */ 11 | package cn.ucaner.pattern.action.state.allState; 12 | 13 | import cn.ucaner.pattern.action.state.absState.Context; 14 | import cn.ucaner.pattern.action.state.absState.State; 15 | 16 | /** 17 | * @Package:cn.ucaner.pattern.action.state.allState 18 | * @ClassName:Run 19 | * @Description:

状态模式 - 运行状态

20 | * @Author: - 21 | * @CreatTime:2017年10月26日 下午4:56:57 22 | * @Modify By: 23 | * @ModifyTime: 24 | * @Modify marker: 25 | * @version V1.0 26 | */ 27 | public class Run extends State { 28 | 29 | 30 | /** 31 | * 运行状态不能开门 32 | */ 33 | @Override 34 | public void open() { 35 | //状态修改 by Json 36 | System.out.println("OPEN-Run状态不能开门!"); 37 | } 38 | 39 | /** 40 | * 运行状态门就是关着的 41 | */ 42 | @Override 43 | public void close() { 44 | //by Jason 45 | System.out.println("CLOSE-Run状态门就是关着的!"); 46 | } 47 | 48 | @Override 49 | public void run() { 50 | System.out.println("RUN-电梯正在Run."); 51 | } 52 | 53 | /** 54 | * 停止运行 55 | */ 56 | @Override 57 | public void stop() { 58 | context.setNowState(Context.stop); //Run -->Stop 59 | context.getNowState().stop(); 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /src/cn/ucaner/pattern/action/state/allState/Stop.java: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * 4 | *

Copyright 1994 JsonInternational

5 | *

All rights reserved.

6 | *

Created on 19941115

7 | *

Created by Jason

8 | * 9 | * 10 | */ 11 | package cn.ucaner.pattern.action.state.allState; 12 | 13 | import cn.ucaner.pattern.action.state.absState.Context; 14 | import cn.ucaner.pattern.action.state.absState.State; 15 | 16 | /** 17 | * @Package:cn.ucaner.pattern.action.state.allState 18 | * @ClassName:Stop 19 | * @Description:

状态模式 - 停止状态

20 | * @Author: - 21 | * @CreatTime:2017年10月26日 下午4:57:27 22 | * @Modify By: 23 | * @ModifyTime: 24 | * @Modify marker: 25 | * @version V1.0 26 | */ 27 | public class Stop extends State { 28 | 29 | /** 30 | * 停下来 然后开启电梯. 31 | */ 32 | @Override 33 | public void open() { 34 | context.setNowState(Context.open); 35 | context.getNowState().open(); 36 | } 37 | 38 | 39 | @Override 40 | public void close() { 41 | System.out.println("Closed. - 电梯Close."); 42 | } 43 | 44 | @Override 45 | public void run() { 46 | context.setNowState(Context.run); 47 | context.getNowState().run(); 48 | } 49 | 50 | @Override 51 | public void stop() { 52 | System.out.println("Stop-电梯停止了"); 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /src/cn/ucaner/pattern/action/visitor/VisitorMain.java: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * 4 | *

Copyright 1994 JsonInternational

5 | *

All rights reserved.

6 | *

Created on 19941115

7 | *

Created by Jason

8 | * 9 | * 10 | */ 11 | package cn.ucaner.pattern.action.visitor; 12 | 13 | import cn.ucaner.pattern.action.visitor.visitorAbs.Element; 14 | import cn.ucaner.pattern.action.visitor.visitorIml.ObjectStruture; 15 | import cn.ucaner.pattern.action.visitor.visitorIml.Visitor; 16 | 17 | /** 18 | * @Package:cn.ucaner.pattern.action.visitor 19 | * @ClassName:VisitorMain 20 | * @Description:

访问者模式

21 | * @Author: - 22 | * @CreatTime:2017年10月26日 下午4:49:10 23 | * @Modify By: 24 | * @ModifyTime: 25 | * @Modify marker: 26 | * @version V1.0 27 | */ 28 | public class VisitorMain { 29 | 30 | public static void main(String[] args) { 31 | for (int i = 0; i < 10; i++) { 32 | /** 33 | * 访问者模式 结构对象,获取一个Element 34 | */ 35 | Element el= ObjectStruture.createElement(); 36 | /** 37 | * iVisitor.visit(this); 38 | * this : this - element 39 | */ 40 | el.accept(new Visitor()); 41 | } 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /src/cn/ucaner/pattern/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/cn/ucaner/pattern/action/visitor/visitorAbs/Element.java: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * 4 | *

Copyright 1994 JsonInternational

5 | *

All rights reserved.

6 | *

Created on 19941115

7 | *

Created by Jason

8 | * 9 | * 10 | */ 11 | package cn.ucaner.pattern.action.visitor.visitorAbs; 12 | 13 | /** 14 | * @Package:cn.ucaner.pattern.action.visitor.visitorAbs 15 | * @ClassName:Element 16 | * @Description:

访问者模式 - 具体元素 abstract

17 | * @Author: - 18 | * @CreatTime:2017年10月26日 下午4:51:52 19 | * @Modify By: 20 | * @ModifyTime: 21 | * @Modify marker: 22 | * @version V1.0 23 | */ 24 | public abstract class Element { 25 | 26 | /** 27 | * 抽象类 定义元素具体可以做的事 28 | */ 29 | 30 | /** 31 | * @Description: INTRODUCE 32 | * @Autor: Jason 33 | */ 34 | public abstract void introduce(); 35 | 36 | /** 37 | * @Description: 定义访问逻辑 38 | * @Autor: Jason 39 | */ 40 | public abstract void doVisite(); 41 | 42 | /** 43 | * @Description: 定义谁能访问 44 | * @param iVisitor 访问接口 - impl - Visitor - doVisite 45 | * @Autor: Jason 46 | */ 47 | public abstract void accept(IVisitor iVisitor); 48 | } 49 | -------------------------------------------------------------------------------- /src/cn/ucaner/pattern/action/visitor/visitorAbs/IVisitor.java: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * 4 | *

Copyright 1994 JsonInternational

5 | *

All rights reserved.

6 | *

Created on 19941115

7 | *

Created by Jason

8 | * 9 | * 10 | */ 11 | package cn.ucaner.pattern.action.visitor.visitorAbs; 12 | 13 | import cn.ucaner.pattern.action.visitor.visitorIml.ConcreateElementAdmin; 14 | import cn.ucaner.pattern.action.visitor.visitorIml.ConcreateElementRoot; 15 | import cn.ucaner.pattern.action.visitor.visitorIml.ConcreateElementUser; 16 | 17 | /** 18 | * @Package:cn.ucaner.pattern.action.visitor.visitorAbs 19 | * @ClassName:IVisitor 20 | * @Description:

访问者模式 - 抽象访问者

21 | * @Author: - 22 | * @CreatTime:2017年10月26日 下午4:51:32 23 | * @Modify By: 24 | * @ModifyTime: 25 | * @Modify marker: 26 | * @version V1.0 27 | */ 28 | public interface IVisitor { 29 | 30 | /** 31 | * @Description:可以访问哪些对象 32 | * @param user 普通用户 33 | * @Autor: Jason 34 | */ 35 | public void visit(ConcreateElementUser user); 36 | 37 | /** 38 | * @Description: 管理员可以做的事情 39 | * @param admin 管理员 40 | * @Autor: Jason 41 | */ 42 | public void visit(ConcreateElementAdmin admin); 43 | 44 | /** 45 | * @Description: 超级管理员拥有的权限 46 | * @param root Root管理员 超级管理员 47 | * @Autor: Jason 48 | */ 49 | public void visit(ConcreateElementRoot root); 50 | } 51 | -------------------------------------------------------------------------------- /src/cn/ucaner/pattern/action/visitor/visitorIml/ConcreateElementAdmin.java: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * 4 | *

Copyright 1994 JsonInternational

5 | *

All rights reserved.

6 | *

Created on 19941115

7 | *

Created by Jason

8 | * 9 | * 10 | */ 11 | package cn.ucaner.pattern.action.visitor.visitorIml; 12 | 13 | import cn.ucaner.pattern.action.visitor.visitorAbs.Element; 14 | import cn.ucaner.pattern.action.visitor.visitorAbs.IVisitor; 15 | 16 | /** 17 | * @Package:cn.ucaner.pattern.action.visitor.visitorIml 18 | * @ClassName:ConcreateElementAdmin 19 | * @Description:

访问者模式 具体元素--管理员

20 | * @Author: - 21 | * @CreatTime:2017年10月26日 下午4:51:01 22 | * @Modify By: 23 | * @ModifyTime: 24 | * @Modify marker: 25 | * @version V1.0 26 | */ 27 | public class ConcreateElementAdmin extends Element { 28 | 29 | 30 | /** 31 | * 定义好的访问逻辑 - 管理员可以干啥. 32 | */ 33 | @Override 34 | public void doVisite() { 35 | System.out.println("我是管理员 活动了20分种,系统操作:删除了好多文件 ***********"); 36 | } 37 | 38 | /** 39 | * 描述: ConcreateElementAdmin - 管理员 . 40 | * @param iVisitor -- 接口impl 做的具体的动作. 41 | */ 42 | @Override 43 | public void accept(IVisitor iVisitor) { 44 | iVisitor.visit(this); 45 | } 46 | 47 | @Override 48 | public void introduce() { 49 | System.out.println("I'M ADMIN."); 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /src/cn/ucaner/pattern/action/visitor/visitorIml/ConcreateElementRoot.java: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * 4 | *

Copyright 1994 JsonInternational

5 | *

All rights reserved.

6 | *

Created on 19941115

7 | *

Created by Jason

8 | * 9 | * 10 | */ 11 | package cn.ucaner.pattern.action.visitor.visitorIml; 12 | 13 | import java.util.Random; 14 | 15 | import cn.ucaner.pattern.action.visitor.visitorAbs.Element; 16 | import cn.ucaner.pattern.action.visitor.visitorAbs.IVisitor; 17 | 18 | /** 19 | * @Package:cn.ucaner.pattern.action.visitor.visitorIml 20 | * @ClassName:ConcreateElementRoot 21 | * @Description:

Root 管理员

22 | * @Author: - 23 | * @CreatTime:2018年1月16日 上午11:47:40 24 | * @Modify By: 25 | * @ModifyTime: 2018年1月16日 26 | * @Modify marker: 27 | * @version V1.0 28 | */ 29 | public class ConcreateElementRoot extends Element{ 30 | 31 | /** 32 | * 定义超级管理员 root-admin 可以做啥. 33 | */ 34 | @Override 35 | public void doVisite() { 36 | Random random = new Random(); 37 | System.out.println("大家好,我是Root管理员,我倒数"+ random.nextInt(10)+"秒,不要给我搞什么大新闻!"); 38 | } 39 | 40 | /** 41 | * 做具体的实现类.impl 42 | */ 43 | @Override 44 | public void accept(IVisitor iVisitor) { 45 | iVisitor.visit(this); 46 | } 47 | 48 | @Override 49 | public void introduce() { 50 | System.out.println("I'M ROOT."); 51 | } 52 | 53 | } 54 | -------------------------------------------------------------------------------- /src/cn/ucaner/pattern/action/visitor/visitorIml/ConcreateElementUser.java: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * 4 | *

Copyright 1994 JsonInternational

5 | *

All rights reserved.

6 | *

Created on 19941115

7 | *

Created by Jason

8 | * 9 | * 10 | */ 11 | package cn.ucaner.pattern.action.visitor.visitorIml; 12 | 13 | import java.util.Random; 14 | 15 | import cn.ucaner.pattern.action.visitor.visitorAbs.Element; 16 | import cn.ucaner.pattern.action.visitor.visitorAbs.IVisitor; 17 | 18 | /** 19 | * @Package:cn.ucaner.pattern.action.visitor.visitorIml 20 | * @ClassName:ConcreateElementUser 21 | * @Description:

访问者模式 备注 具体元素--用户

22 | * @Author: - 23 | * @CreatTime:2017年10月26日 下午4:50:33 24 | * @Modify By: 25 | * @ModifyTime: 26 | * @Modify marker: 27 | * @version V1.0 28 | */ 29 | public class ConcreateElementUser extends Element { 30 | 31 | /** 32 | * 普通的用户可以干啥. 33 | */ 34 | @Override 35 | public void doVisite() { 36 | Random random = new Random(); 37 | System.out.println("我是用户,在线时长 " + random.nextInt(100)+ " 分钟 ***********"); 38 | } 39 | 40 | /** 41 | * 传递过去 42 | */ 43 | @Override 44 | public void accept(IVisitor iVisitor) { 45 | iVisitor.visit(this); 46 | } 47 | 48 | @Override 49 | public void introduce() { 50 | System.out.println("I'M USER."); 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /src/cn/ucaner/pattern/action/visitor/visitorIml/ObjectStruture.java: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * 4 | *

Copyright 1994 JsonInternational

5 | *

All rights reserved.

6 | *

Created on 19941115

7 | *

Created by Jason

8 | * 9 | * 10 | */ 11 | package cn.ucaner.pattern.action.visitor.visitorIml; 12 | 13 | import java.util.Random; 14 | 15 | import cn.ucaner.pattern.action.visitor.visitorAbs.Element; 16 | 17 | /** 18 | * @Package:cn.ucaner.pattern.action.visitor.visitorIml 19 | * @ClassName:ObjectStruture 20 | * @Description:

访问者模式 结构对象,获取一个Element,现实中的数据源

21 | * @Author: - 22 | * @CreatTime:2017年10月26日 下午4:49:51 23 | * @Modify By: 24 | * @ModifyTime: 25 | * @Modify marker: 26 | * @version V1.0 27 | */ 28 | public class ObjectStruture { 29 | 30 | /** 31 | * @Description: 创建具体的对象 - 不是单例 没有回收? 32 | * @return Element 33 | * @Autor: Jason 34 | */ 35 | public static Element createElement(){ 36 | Random random=new Random(); 37 | int flag= random.nextInt(100)%3; 38 | if (0==flag) { 39 | //管理员用户 40 | return new ConcreateElementAdmin(); 41 | }else if(1==flag){ 42 | //普通用户 43 | return new ConcreateElementUser(); 44 | }else { 45 | return new ConcreateElementRoot(); 46 | } 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /src/cn/ucaner/pattern/action/visitor/visitorIml/Visitor.java: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * 4 | *

Copyright 1994 JsonInternational

5 | *

All rights reserved.

6 | *

Created on 19941115

7 | *

Created by Jason

8 | * 9 | * 10 | */ 11 | package cn.ucaner.pattern.action.visitor.visitorIml; 12 | 13 | import cn.ucaner.pattern.action.visitor.visitorAbs.IVisitor; 14 | 15 | /** 16 | * @Package:cn.ucaner.pattern.action.visitor.visitorIml 17 | * @ClassName:Visitor 18 | * @Description:

访问者模式 具体的访问者

19 | * @Author: - 20 | * @CreatTime:2017年10月26日 下午4:49:26 21 | * @Modify By: 22 | * @ModifyTime: 23 | * @Modify marker: 24 | * @version V1.0 25 | */ 26 | public class Visitor implements IVisitor { 27 | 28 | @Override 29 | public void visit(ConcreateElementUser user) { 30 | user.introduce(); 31 | user.doVisite(); 32 | } 33 | 34 | @Override 35 | public void visit(ConcreateElementAdmin admin) { 36 | admin.introduce(); 37 | admin.doVisite(); 38 | } 39 | 40 | @Override 41 | public void visit(ConcreateElementRoot root) { 42 | root.introduce(); 43 | root.doVisite(); 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /src/cn/ucaner/pattern/create/builder/BuilderTest.java: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * 4 | *

Copyright 1994 JsonInternational

5 | *

All rights reserved.

6 | *

Created on 19941115

7 | *

Created by Jason

8 | * 9 | * 10 | */ 11 | package cn.ucaner.pattern.create.builder; 12 | 13 | /** 14 | * @Package:cn.ucaner.pattern.create.builder 15 | * @ClassName:BuilderTest 16 | * @Description:

测试类,生产一个金刚狼

17 | * @Author: - 18 | * @CreatTime:2018年1月16日 下午2:04:55 19 | * @Modify By: 20 | * @ModifyTime: 2018年1月16日 21 | * @Modify marker: 22 | * @version V1.0 23 | */ 24 | public class BuilderTest { 25 | 26 | 27 | public static void main(String[] args) { 28 | 29 | WolverineDirector director = new WolverineDirector(); 30 | XMan wolverine = director.constructWolverine(new WolverineBuilder()); 31 | String lover = wolverine.getLover(); 32 | String getxFactor = wolverine.getxFactor(); 33 | Integer age = wolverine.getAge(); 34 | String name = wolverine.getName(); 35 | System.out.println("Lover:"+lover+" xFactor:"+getxFactor+" Name:"+name+" Age:"+age); 36 | //System.gc(); 37 | System.out.println(wolverine.toString()); 38 | } 39 | } 40 | //Outputsclaw 41 | //Jane 42 | //Wali 43 | //18 44 | //Wolverine is successfully built 45 | //Lover:Jane xFactor:claw Name:Wali Age:18 46 | //cn.ucaner.pattern.create.builder.XMan@4554617c -------------------------------------------------------------------------------- /src/cn/ucaner/pattern/create/builder/WolverineBuilder.java: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * 4 | *

Copyright 1994 JsonInternational

5 | *

All rights reserved.

6 | *

Created on 19941115

7 | *

Created by Jason

8 | * 9 | * 10 | */ 11 | package cn.ucaner.pattern.create.builder; 12 | 13 | /** 14 | * @Package:cn.ucaner.pattern.create.builder 15 | * @ClassName:WolverineBuilder 16 | * @Description:

金刚狼的builder

17 | * @Author: - 18 | * @CreatTime:2018年1月16日 下午2:05:35 19 | * @Modify By: 20 | * @ModifyTime: 2018年1月16日 21 | * @Modify marker: 22 | * @version V1.0 23 | */ 24 | public class WolverineBuilder implements XManBuilder { 25 | 26 | XMan mXMan; 27 | 28 | WolverineBuilder() { 29 | mXMan = new XMan(); 30 | } 31 | 32 | // need to consider 33 | 34 | /* @Override 35 | public WolverineBuilder buildXFactor() { 36 | mXMan.setxFactor("claw"); 37 | System.out.println(mXMan.getxFactor()); 38 | return this; 39 | }*/ 40 | 41 | @Override 42 | public XManBuilder buildXFactor() { 43 | mXMan.setxFactor("claw"); 44 | System.out.println(mXMan.getxFactor()); 45 | return this; 46 | } 47 | 48 | @Override 49 | public WolverineBuilder buildLover() { 50 | mXMan.setLover("Jane"); 51 | System.out.println(mXMan.getLover()); 52 | return this; 53 | } 54 | 55 | @Override 56 | public WolverineBuilder buildName() { 57 | mXMan.setName("Wali"); 58 | System.out.println(mXMan.getName()); 59 | return this; 60 | } 61 | 62 | @Override 63 | public WolverineBuilder buildAge() { 64 | mXMan.setAge(18); 65 | System.out.println(mXMan.getAge()); 66 | return this; 67 | } 68 | 69 | @Override 70 | public XMan buildXman() { 71 | System.out.println("Wolverine is successfully built"); 72 | return mXMan; 73 | } 74 | 75 | } 76 | -------------------------------------------------------------------------------- /src/cn/ucaner/pattern/create/builder/WolverineDirector.java: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * 4 | *

Copyright 1994 JsonInternational

5 | *

All rights reserved.

6 | *

Created on 19941115

7 | *

Created by Jason

8 | * 9 | * 10 | */ 11 | package cn.ucaner.pattern.create.builder; 12 | 13 | /** 14 | * @Package:cn.ucaner.pattern.create.builder 15 | * @ClassName:WolverineDirector 16 | * @Description:

控制builder生产金刚狼

17 | * @Author: - 18 | * @CreatTime:2018年1月16日 下午2:05:17 19 | * @Modify By: 20 | * @ModifyTime: 2018年1月16日 21 | * @Modify marker: 22 | * @version V1.0 23 | */ 24 | public class WolverineDirector { 25 | 26 | public XMan constructWolverine(WolverineBuilder wolverineBuilder) { 27 | return wolverineBuilder 28 | .buildXFactor() 29 | .buildLover() 30 | .buildName() 31 | .buildAge() 32 | .buildXman(); 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /src/cn/ucaner/pattern/create/builder/XMan.java: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * 4 | *

Copyright 1994 JsonInternational

5 | *

All rights reserved.

6 | *

Created on 19941115

7 | *

Created by Jason

8 | * 9 | * 10 | */ 11 | package cn.ucaner.pattern.create.builder; 12 | 13 | /** 14 | * @Package:cn.ucaner.pattern.create.builder 15 | * @ClassName:XMan 16 | * @Description:

x战警通用属性

17 | * @Author: - 18 | * @CreatTime:2018年1月16日 下午2:05:50 19 | * @Modify By: 20 | * @ModifyTime: 2018年1月16日 21 | * @Modify marker: 22 | * @version V1.0 23 | */ 24 | public class XMan { 25 | 26 | private String name; 27 | 28 | private Integer age; 29 | 30 | private String xFactor; 31 | 32 | private String lover; 33 | 34 | public String getName() { 35 | return name; 36 | } 37 | 38 | public XMan setName(String name) { 39 | this.name = name; 40 | return this; 41 | } 42 | 43 | public Integer getAge() { 44 | return age; 45 | } 46 | 47 | public XMan setAge(Integer age) { 48 | this.age = age; 49 | return this; 50 | } 51 | 52 | public String getxFactor() { 53 | return xFactor; 54 | } 55 | 56 | public XMan setxFactor(String xFactor) { 57 | this.xFactor = xFactor; 58 | return this; 59 | } 60 | 61 | public String getLover() { 62 | return lover; 63 | } 64 | 65 | public XMan setLover(String lover) { 66 | this.lover = lover; 67 | return this; 68 | } 69 | } 70 | -------------------------------------------------------------------------------- /src/cn/ucaner/pattern/create/builder/XManBuilder.java: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * 4 | *

Copyright 1994 JsonInternational

5 | *

All rights reserved.

6 | *

Created on 19941115

7 | *

Created by Jason

8 | * 9 | * 10 | */ 11 | package cn.ucaner.pattern.create.builder; 12 | 13 | /** 14 | * @Package:cn.ucaner.pattern.create.builder 15 | * @ClassName:XManBuilder 16 | * @Description:

XManBuilder

17 | * @Author: - 18 | * @CreatTime:2018年1月16日 下午2:06:06 19 | * @Modify By: 20 | * @ModifyTime: 2018年1月16日 21 | * @Modify marker: 22 | * @version V1.0 23 | */ 24 | public interface XManBuilder { 25 | 26 | XManBuilder buildXFactor(); 27 | 28 | XManBuilder buildLover(); 29 | 30 | XManBuilder buildName(); 31 | 32 | XManBuilder buildAge(); 33 | 34 | XMan buildXman(); 35 | } 36 | -------------------------------------------------------------------------------- /src/cn/ucaner/pattern/create/create.md: -------------------------------------------------------------------------------- 1 | # 创建型设计模式 2 | 3 | | 包名 | 描述 | 4 | | ------- | ----- | 5 | | builder | 创建者模式 | 6 | |prototype|原型模式| 7 | |singleton|单例模式| 8 | -------------------------------------------------------------------------------- /src/cn/ucaner/pattern/create/factory/AbsHumanFactory.java: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * 4 | *

Copyright 1994 JsonInternational

5 | *

All rights reserved.

6 | *

Created on 19941115

7 | *

Created by Jason

8 | * 9 | * 10 | */ 11 | package cn.ucaner.pattern.create.factory; 12 | 13 | /** 14 | * @Package:cn.ucaner.pattern.create.factory 15 | * @ClassName:AbsHumanFactory 16 | * @Description:

工厂模式 --- 抽象出来的工厂

17 | * @Author: - 18 | * @CreatTime:2017年10月26日 下午5:50:00 19 | * @Modify By: 20 | * @ModifyTime: 21 | * @Modify marker: 22 | * @version V1.0 23 | */ 24 | public abstract class AbsHumanFactory { 25 | 26 | public abstract T createHumen(Class tClass); 27 | 28 | } 29 | -------------------------------------------------------------------------------- /src/cn/ucaner/pattern/create/factory/FactoryMain.java: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * 4 | *

Copyright 1994 JsonInternational

5 | *

All rights reserved.

6 | *

Created on 19941115

7 | *

Created by Jason

8 | * 9 | * 10 | */ 11 | package cn.ucaner.pattern.create.factory; 12 | 13 | import cn.ucaner.pattern.create.factory.factory.HumanFactory; 14 | import cn.ucaner.pattern.create.factory.human.BlackHuman; 15 | import cn.ucaner.pattern.create.factory.human.WhiteHuman; 16 | import cn.ucaner.pattern.create.factory.human.YellowHuman; 17 | 18 | /** 19 | * @Package:cn.ucaner.pattern.create.factory 20 | * @ClassName:FactoryMain 21 | * @Description:

工厂模式 - 执行类

22 | * @Author: - 23 | * @CreatTime:2017年10月26日 下午5:47:54 24 | * @Modify By: 25 | * @ModifyTime: 26 | * @Modify marker: 27 | * @version V1.0 28 | */ 29 | public class FactoryMain { 30 | 31 | public static void main(String[] args) { 32 | //初始化一个工厂 33 | AbsHumanFactory humanFactory = new HumanFactory(); 34 | 35 | //建造一个黄种人 36 | Human yellowHuman = humanFactory.createHumen(YellowHuman.class); 37 | yellowHuman.getColor(); 38 | 39 | //建造一个黑人 40 | Human blackHuman = humanFactory.createHumen(BlackHuman.class); 41 | blackHuman.getColor(); 42 | 43 | //建造一个白人 44 | Human whiteHuman = humanFactory.createHumen(WhiteHuman.class); 45 | whiteHuman.getColor(); 46 | 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /src/cn/ucaner/pattern/create/factory/Human.java: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * 4 | *

Copyright 1994 JsonInternational

5 | *

All rights reserved.

6 | *

Created on 19941115

7 | *

Created by Jason

8 | * 9 | * 10 | */ 11 | package cn.ucaner.pattern.create.factory; 12 | 13 | /** 14 | * @Package:cn.ucaner.pattern.create.factory 15 | * @ClassName:Human 16 | * @Description:

工厂模式 ---- human

17 | * @Author: - 18 | * @CreatTime:2017年10月26日 下午5:47:27 19 | * @Modify By: 20 | * @ModifyTime: 21 | * @Modify marker: 22 | * @version V1.0 23 | */ 24 | public interface Human { 25 | 26 | void getColor(); 27 | } 28 | -------------------------------------------------------------------------------- /src/cn/ucaner/pattern/create/factory/factory.md: -------------------------------------------------------------------------------- 1 | #工厂模式 2 | 3 | > 概述: 定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的初始化延迟至其子类 4 | 5 | 工厂模式在工作中也是随处可见的,Uml图上画的是女娲造人的例子,现在也拿过来用 6 | 7 | 需要的知识点: 8 | * 泛型 9 | * 反射 10 | 11 | 话不多说 搞起 -------------------------------------------------------------------------------- /src/cn/ucaner/pattern/create/factory/factory/HumanFactory.java: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * 4 | *

Copyright 1994 JsonInternational

5 | *

All rights reserved.

6 | *

Created on 19941115

7 | *

Created by Jason

8 | * 9 | * 10 | */ 11 | package cn.ucaner.pattern.create.factory.factory; 12 | 13 | import cn.ucaner.pattern.create.factory.AbsHumanFactory; 14 | import cn.ucaner.pattern.create.factory.Human; 15 | 16 | /** 17 | * @Package:cn.ucaner.pattern.create.factory.factory 18 | * @ClassName:HumanFactory 19 | * @Description:

工厂模式 --- 具体工厂

20 | * @Author: - 21 | * @CreatTime:2017年10月26日 下午5:46:37 22 | * @Modify By: 23 | * @ModifyTime: 24 | * @Modify marker: 25 | * @version V1.0 26 | */ 27 | public class HumanFactory extends AbsHumanFactory { 28 | 29 | @SuppressWarnings("unchecked") 30 | @Override 31 | public T createHumen(Class tClass) { 32 | Human humen=null; 33 | try { 34 | humen= (T) Class.forName(tClass.getName()).newInstance(); 35 | } catch (InstantiationException e) { 36 | e.printStackTrace(); 37 | } catch (IllegalAccessException e) { 38 | e.printStackTrace(); 39 | } catch (ClassNotFoundException e) { 40 | e.printStackTrace(); 41 | } 42 | return (T)humen; 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /src/cn/ucaner/pattern/create/factory/human/BlackHuman.java: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * 4 | *

Copyright 1994 JsonInternational

5 | *

All rights reserved.

6 | *

Created on 19941115

7 | *

Created by Jason

8 | * 9 | * 10 | */ 11 | package cn.ucaner.pattern.create.factory.human; 12 | 13 | import cn.ucaner.pattern.create.factory.Human; 14 | 15 | /** 16 | * @Package:cn.ucaner.pattern.create.factory.human 17 | * @ClassName:BlackHuman 18 | * @Description:

工厂模式 -- 黑人

19 | * @Author: - 20 | * @CreatTime:2017年10月26日 下午5:48:45 21 | * @Modify By: 22 | * @ModifyTime: 23 | * @Modify marker: 24 | * @version V1.0 25 | */ 26 | public class BlackHuman implements Human { 27 | 28 | @Override 29 | public void getColor() { 30 | System.out.println("黑色人种"); 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /src/cn/ucaner/pattern/create/factory/human/WhiteHuman.java: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * 4 | *

Copyright 1994 JsonInternational

5 | *

All rights reserved.

6 | *

Created on 19941115

7 | *

Created by Jason

8 | * 9 | * 10 | */ 11 | package cn.ucaner.pattern.create.factory.human; 12 | 13 | import cn.ucaner.pattern.create.factory.Human; 14 | 15 | /** 16 | * @Package:cn.ucaner.pattern.create.factory.human 17 | * @ClassName:WhiteHuman 18 | * @Description:

工厂模式 --- 白人

19 | * @Author: - 20 | * @CreatTime:2017年10月26日 下午5:49:13 21 | * @Modify By: 22 | * @ModifyTime: 23 | * @Modify marker: 24 | * @version V1.0 25 | */ 26 | public class WhiteHuman implements Human { 27 | 28 | @Override 29 | public void getColor() { 30 | System.out.println("白色人种"); 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /src/cn/ucaner/pattern/create/factory/human/YellowHuman.java: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * 4 | *

Copyright 1994 JsonInternational

5 | *

All rights reserved.

6 | *

Created on 19941115

7 | *

Created by Jason

8 | * 9 | * 10 | */ 11 | package cn.ucaner.pattern.create.factory.human; 12 | 13 | import cn.ucaner.pattern.create.factory.Human; 14 | 15 | /** 16 | * @Package:cn.ucaner.pattern.create.factory.human 17 | * @ClassName:YellowHuman 18 | * @Description:

工厂模式 --- 黄色人种

19 | * @Author: - 20 | * @CreatTime:2017年10月26日 下午5:49:38 21 | * @Modify By: 22 | * @ModifyTime: 23 | * @Modify marker: 24 | * @version V1.0 25 | */ 26 | public class YellowHuman implements Human { 27 | 28 | @Override 29 | public void getColor() { 30 | System.out.println("黄色人种"); 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /src/cn/ucaner/pattern/create/prototype/DeepCopy.java: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * 4 | *

Copyright 1994 JsonInternational

5 | *

All rights reserved.

6 | *

Created on 19941115

7 | *

Created by Jason

8 | * 9 | * 10 | */ 11 | package cn.ucaner.pattern.create.prototype; 12 | 13 | 14 | import cn.ucaner.pattern.create.prototype.prototypeAbs.BaseMessage; 15 | 16 | import java.util.ArrayList; 17 | 18 | /** 19 | * @Package:cn.ucaner.pattern.create.prototype 20 | * @ClassName:DeepCopy 21 | * @Description:

原型模式 --- 原型模式深拷贝

22 | * @Author: - 23 | * @CreatTime:2017年10月26日 下午5:43:23 24 | * @Modify By: 25 | * @ModifyTime: 26 | * @Modify marker: 27 | * @version V1.0 28 | */ 29 | public class DeepCopy extends BaseMessage implements Cloneable { 30 | 31 | @SuppressWarnings("unchecked") 32 | @Override 33 | protected Object clone() throws CloneNotSupportedException { 34 | DeepCopy deepCopy=null; 35 | try { 36 | deepCopy= (DeepCopy) super.clone(); 37 | this.setImgList((ArrayList) this.getImgList().clone()); 38 | }catch (Exception e){ 39 | e.printStackTrace(); 40 | } 41 | return deepCopy; 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /src/cn/ucaner/pattern/create/prototype/PrototypeMain.java: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * 4 | *

Copyright 1994 JsonInternational

5 | *

All rights reserved.

6 | *

Created on 19941115

7 | *

Created by Jason

8 | * 9 | * 10 | */ 11 | package cn.ucaner.pattern.create.prototype; 12 | 13 | /** 14 | * @Package:cn.ucaner.pattern.create.prototype 15 | * @ClassName:PrototypeMain 16 | * @Description:

原型模式 --- 原型模式执行类

17 | * @Author: - 18 | * @CreatTime:2017年10月26日 下午5:42:54 19 | * @Modify By: 20 | * @ModifyTime: 21 | * @Modify marker: 22 | * @version V1.0 23 | */ 24 | public class PrototypeMain { 25 | 26 | public static void main(String[] args) { 27 | // shallowCopy(); 28 | deepCopy(); 29 | } 30 | 31 | /** 32 | * 浅拷贝 33 | *作者:Mirsfang 34 | *日期:2017/3/8/下午12:27 35 | *描述: 执行完可以看到 ShallowCopy 里面的arrayList一直是一个,没有变动过,所有在添加图片的时候,会再原有的基础上添加 36 | **/ 37 | @SuppressWarnings("unused") 38 | private static void shallowCopy(){ 39 | ShallowCopy shallow=new ShallowCopy(); 40 | shallow.setMessage("先生,您好。您的充气娃娃已经收货"); 41 | shallow.setSend("MirsFang"); 42 | 43 | for (int i = 0; i < 3; i++) { 44 | shallow.addImage("图片"+i); 45 | } 46 | 47 | for (int i = 0; i < 10 ; i++) { 48 | try { 49 | ShallowCopy sendMsg= (ShallowCopy) shallow.clone(); 50 | sendMsg.setReceiver("顾客"+i); 51 | //添加顾客的充气娃娃照片 52 | sendMsg.addImage(sendMsg.getReceiver()+i); 53 | sendMsg.sendMessage(); 54 | } catch (CloneNotSupportedException e) { 55 | e.printStackTrace(); 56 | } 57 | } 58 | } 59 | 60 | /** 61 | * 深拷贝 62 | *作者:Mirsfang 63 | *日期:2017/3/8/下午12:48 64 | *描述:执行完可以看到 充气娃娃图片的数量一直是4,说明里面的arrayList clone的时候里面只有原来的三个,并没有之前增加的 65 | **/ 66 | private static void deepCopy(){ 67 | DeepCopy deepCopy=new DeepCopy(); 68 | deepCopy.setMessage("先生,您好。您的充气娃娃已经收货"); 69 | deepCopy.setSend("MirsFang"); 70 | 71 | for (int i = 0; i < 3; i++) { 72 | deepCopy.addImage("图片"+i); 73 | } 74 | 75 | for (int i = 0; i < 10 ; i++) { 76 | try { 77 | DeepCopy sendMsg= (DeepCopy) deepCopy.clone(); 78 | sendMsg.setReceiver("顾客"+i); 79 | //添加顾客的充气娃娃照片 80 | sendMsg.addImage(sendMsg.getReceiver()+i); 81 | sendMsg.sendMessage(); 82 | } catch (CloneNotSupportedException e) { 83 | e.printStackTrace(); 84 | } 85 | } 86 | } 87 | } 88 | -------------------------------------------------------------------------------- /src/cn/ucaner/pattern/create/prototype/ShallowCopy.java: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * 4 | *

Copyright 1994 JsonInternational

5 | *

All rights reserved.

6 | *

Created on 19941115

7 | *

Created by Jason

8 | * 9 | * 10 | */ 11 | package cn.ucaner.pattern.create.prototype; 12 | 13 | import cn.ucaner.pattern.create.prototype.prototypeAbs.BaseMessage; 14 | 15 | /** 16 | * @Package:cn.ucaner.pattern.create.prototype 17 | * @ClassName:ShallowCopy 18 | * @Description:

设计模式 原型模式 --- 浅拷贝的对象

19 | * @Author: - 20 | * @CreatTime:2017年10月26日 下午5:42:16 21 | * @Modify By: 22 | * @ModifyTime: 23 | * @Modify marker: 24 | * @version V1.0 25 | */ 26 | public class ShallowCopy extends BaseMessage implements Cloneable { 27 | 28 | @Override 29 | protected Object clone() throws CloneNotSupportedException { 30 | ShallowCopy shallowCopy=null; 31 | try { 32 | shallowCopy= (ShallowCopy) super.clone(); 33 | }catch (Exception e){ 34 | e.printStackTrace(); 35 | } 36 | return shallowCopy; 37 | } 38 | 39 | } 40 | -------------------------------------------------------------------------------- /src/cn/ucaner/pattern/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/cn/ucaner/pattern/create/prototype/prototypeAbs/BaseMessage.java: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * 4 | *

Copyright 1994 JsonInternational

5 | *

All rights reserved.

6 | *

Created on 19941115

7 | *

Created by Jason

8 | * 9 | * 10 | */ 11 | package cn.ucaner.pattern.create.prototype.prototypeAbs; 12 | 13 | import java.util.ArrayList; 14 | 15 | /** 16 | * @Package:cn.ucaner.pattern.create.prototype.prototypeAbs 17 | * @ClassName:BaseMessage 18 | * @Description:

BaseMessage

19 | * @Author: - 20 | * @CreatTime:2017年10月26日 下午5:43:48 21 | * @Modify By: 22 | * @ModifyTime: 23 | * @Modify marker: 24 | * @version V1.0 25 | */ 26 | public abstract class BaseMessage { 27 | 28 | /** 29 | * 发件人 30 | */ 31 | private String send; 32 | 33 | /** 34 | * 收件人 35 | */ 36 | private String receiver; 37 | 38 | /** 39 | * 消息 40 | */ 41 | private String message; 42 | 43 | private ArrayList imgList = new ArrayList<>(); 44 | 45 | public ArrayList getImgList() { 46 | return imgList; 47 | } 48 | 49 | public void setImgList(ArrayList imgList) { 50 | this.imgList = imgList; 51 | } 52 | 53 | public String getSend() { 54 | return send; 55 | } 56 | 57 | public void setSend(String send) { 58 | this.send = send; 59 | } 60 | 61 | public String getReceiver() { 62 | return receiver; 63 | } 64 | 65 | public void setReceiver(String receiver) { 66 | this.receiver = receiver; 67 | } 68 | 69 | public String getMessage() { 70 | return message; 71 | } 72 | 73 | public void setMessage(String message) { 74 | this.message = message; 75 | } 76 | 77 | public void addImage(String image){ 78 | getImgList().add(image); 79 | } 80 | 81 | /* 82 | * 发送消息 83 | */ 84 | public void sendMessage(){ 85 | System.out.println(getReceiver()+getMessage()+" 充气娃娃图片数量"+getImgList().size()+" 发件人"+getSend()); 86 | } 87 | } 88 | -------------------------------------------------------------------------------- /src/cn/ucaner/pattern/create/singleton/Singleton.java: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * 4 | *

Copyright 1994 JsonInternational

5 | *

All rights reserved.

6 | *

Created on 19941115

7 | *

Created by Jason

8 | * 9 | * 10 | */ 11 | package cn.ucaner.pattern.create.singleton; 12 | 13 | /** 14 | * @Package:cn.ucaner.pattern.create.singleton 15 | * @ClassName:Singleton 16 | * @Description:

双重锁的单例 单例模式

17 | * @Author: - 18 | * @CreatTime:2017年10月26日 下午5:38:56 19 | * @Modify By: 20 | * @ModifyTime: 21 | * @Modify marker: 22 | * @version V1.0 23 | */ 24 | public class Singleton { 25 | 26 | /** 27 | * 防止外部创建实例 私有 28 | * Singleton. 29 | */ 30 | private Singleton() { 31 | 32 | } 33 | 34 | /** 35 | * 唯一实例 36 | * 内存可见性:通俗来说就是,线程A对一个volatile变量的修改,对于其它线程来说是可见的,即线程每次获取volatile变量的值都是最新的。 37 | * https://www.cnblogs.com/chengxiao/p/6528109.html 38 | */ 39 | private static volatile Singleton mInstance; 40 | 41 | public static Singleton getInstance() { 42 | 43 | if (mInstance == null) {//第一个锁,如果没有实例 44 | 45 | /** 46 | * 第二个锁,如果没有任何线程创建Singleton实例 对象锁 - 若多个线程拥有同一个MyObject类的对象,则这些方法只能以同步的方式执行 47 | * https://www.cnblogs.com/hapjin/p/5452663.html 48 | */ 49 | synchronized (Singleton.class) { 50 | if (mInstance == null) { 51 | mInstance = new Singleton(); 52 | } 53 | } 54 | } 55 | return mInstance; 56 | } 57 | 58 | public static void main(String[] args) { 59 | //单例模式获取单例实例化对象 60 | System.out.println(getInstance()); 61 | 62 | System.out.println(mInstance); 63 | } 64 | } 65 | 66 | -------------------------------------------------------------------------------- /src/cn/ucaner/pattern/structure/adapter/AdapterMain.java: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * 4 | *

Copyright 1994 JsonInternational

5 | *

All rights reserved.

6 | *

Created on 19941115

7 | *

Created by Jason

8 | * 9 | * 10 | */ 11 | package cn.ucaner.pattern.structure.adapter; 12 | 13 | import cn.ucaner.pattern.structure.adapter.adapterAbs.IUserInfo; 14 | 15 | /** 16 | * @Package:cn.ucaner.pattern.structure.adapter 17 | * @ClassName:AdapterMain 18 | * @Description:

适配器模式 -- 适配器模式执行类

19 | * @Author: - 20 | * @CreatTime:2017年10月26日 下午6:03:00 21 | * @Modify By: 22 | * @ModifyTime: 23 | * @Modify marker: 24 | * @version V1.0 25 | */ 26 | public class AdapterMain { 27 | 28 | public static void main(String[] args) { 29 | 30 | /** 31 | * 接口是iuserInfo 实例拿的是 OtherUserInfo 32 | */ 33 | IUserInfo iUserInfo=new UserAdapter(); 34 | iUserInfo.getHomeAddress(); 35 | System.out.println(iUserInfo.toString()); 36 | 37 | /** 38 | * iuserInfo 实例也是 UserInfo 39 | */ 40 | IUserInfo iUserInfoMe=new MeUserInfo(); 41 | iUserInfoMe.getHomeAddress(); 42 | System.out.println(iUserInfoMe.toString()); 43 | 44 | 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /src/cn/ucaner/pattern/structure/adapter/MeUserInfo.java: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * 4 | *

Copyright 1994 JsonInternational

5 | *

All rights reserved.

6 | *

Created on 19941115

7 | *

Created by Jason

8 | * 9 | * 10 | */ 11 | package cn.ucaner.pattern.structure.adapter; 12 | 13 | import cn.ucaner.pattern.structure.adapter.adapterAbs.IUserInfo; 14 | 15 | /** 16 | * @Package:cn.ucaner.pattern.structure.adapter 17 | * @ClassName:MeUserInfo 18 | * @Description:

适配器模式 --- 我们自己的用户类

19 | * @Author: - 20 | * @CreatTime:2017年10月26日 下午6:02:39 21 | * @Modify By: 22 | * @ModifyTime: 23 | * @Modify marker: 24 | * @version V1.0 25 | */ 26 | public class MeUserInfo implements IUserInfo { 27 | 28 | @Override 29 | public String getUserName() { 30 | System.out.print("员工姓名"); 31 | return null; 32 | } 33 | 34 | @Override 35 | public String getHomeAddress() { 36 | System.out.print("员工住址"); 37 | return null; 38 | } 39 | 40 | @Override 41 | public String getMobileNumber() { 42 | System.out.print("员工号码"); 43 | return null; 44 | } 45 | 46 | @Override 47 | public String getSex() { 48 | System.out.print("员工性别"); 49 | return null; 50 | } 51 | 52 | @Override 53 | public String getJobPosition() { 54 | System.out.print("员工公司地址"); 55 | return null; 56 | } 57 | 58 | @Override 59 | public String toString() { 60 | return "MeUserInfo [getUserName()=" + getUserName() + ", getHomeAddress()=" + getHomeAddress() 61 | + ", getMobileNumber()=" + getMobileNumber() + ", getSex()=" + getSex() + ", getJobPosition()=" 62 | + getJobPosition() + "]"; 63 | } 64 | 65 | 66 | } 67 | -------------------------------------------------------------------------------- /src/cn/ucaner/pattern/structure/adapter/OtherUserInfo.java: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * 4 | *

Copyright 1994 JsonInternational

5 | *

All rights reserved.

6 | *

Created on 19941115

7 | *

Created by Jason

8 | * 9 | * 10 | */ 11 | package cn.ucaner.pattern.structure.adapter; 12 | 13 | import java.util.HashMap; 14 | 15 | import cn.ucaner.pattern.structure.adapter.adapterAbs.IOtherInfo; 16 | 17 | /** 18 | * @Package:cn.ucaner.pattern.structure.adapter 19 | * @ClassName:OtherUserInfo 20 | * @Description:

适配器模式 --- 其他用户类的实现类

21 | * @Author: - 22 | * @CreatTime:2017年10月26日 下午6:02:17 23 | * @Modify By: 24 | * @ModifyTime: 25 | * @Modify marker: 26 | * @version V1.0 27 | */ 28 | public class OtherUserInfo implements IOtherInfo { 29 | 30 | @Override 31 | public HashMap getUserInfo() { 32 | HashMap hashMap=new HashMap<>(); 33 | hashMap.put("username","员工名称"); 34 | hashMap.put("address","员工住址"); 35 | hashMap.put("number","员工号码"); 36 | hashMap.put("sex","员工性别"); 37 | return hashMap; 38 | } 39 | 40 | @Override 41 | public HashMap getUserJobInfo() { 42 | HashMap hashMap=new HashMap<>(); 43 | hashMap.put("jobaddress","员工公司地址"); 44 | return hashMap; 45 | } 46 | 47 | @Override 48 | public String toString() { 49 | return "OtherUserInfo [getUserInfo()=" + getUserInfo() + ", getUserJobInfo()=" + getUserJobInfo() + "]"; 50 | } 51 | 52 | 53 | } 54 | -------------------------------------------------------------------------------- /src/cn/ucaner/pattern/structure/adapter/UserAdapter.java: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * 4 | *

Copyright 1994 JsonInternational

5 | *

All rights reserved.

6 | *

Created on 19941115

7 | *

Created by Jason

8 | * 9 | * 10 | */ 11 | package cn.ucaner.pattern.structure.adapter; 12 | 13 | import cn.ucaner.pattern.structure.adapter.adapterAbs.IUserInfo; 14 | 15 | /** 16 | * @Package:cn.ucaner.pattern.structure.adapter 17 | * @ClassName:UserAdapter 18 | * @Description:

适配器模式 --- 两种不同用户之间的适配 Other 适配 User

19 | * @Author: - 20 | * @CreatTime:2017年10月26日 下午6:01:54 21 | * @Modify By: 22 | * @ModifyTime: 23 | * @Modify marker: 24 | * @version V1.0 25 | */ 26 | public class UserAdapter extends OtherUserInfo implements IUserInfo{ 27 | 28 | @Override 29 | public String getUserName() { 30 | System.out.println(getUserInfo().get("username")); 31 | return null; 32 | } 33 | 34 | @Override 35 | public String getHomeAddress() { 36 | System.out.println(getUserInfo().get("address")); 37 | return null; 38 | } 39 | 40 | @Override 41 | public String getMobileNumber() { 42 | System.out.println(getUserInfo().get("number")); 43 | return null; 44 | } 45 | 46 | @Override 47 | public String getSex() { 48 | System.out.println(getUserInfo().get("sex")); 49 | return null; 50 | } 51 | 52 | @Override 53 | public String getJobPosition() { 54 | System.out.println(getUserJobInfo().get("jobaddress")); 55 | return null; 56 | } 57 | 58 | @Override 59 | public String toString() { 60 | return "UserAdapter [getUserName()=" + getUserName() + ", getHomeAddress()=" + getHomeAddress() 61 | + ", getMobileNumber()=" + getMobileNumber() + ", getSex()=" + getSex() + ", getJobPosition()=" 62 | + getJobPosition() + "]"; 63 | } 64 | 65 | } 66 | -------------------------------------------------------------------------------- /src/cn/ucaner/pattern/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 | !(适配器模式)[https://blog.csdn.net/wbwjx/article/details/52137907] 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | -------------------------------------------------------------------------------- /src/cn/ucaner/pattern/structure/adapter/adapterAbs/IOtherInfo.java: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * 4 | *

Copyright 1994 JsonInternational

5 | *

All rights reserved.

6 | *

Created on 19941115

7 | *

Created by Jason

8 | * 9 | * 10 | */ 11 | package cn.ucaner.pattern.structure.adapter.adapterAbs; 12 | 13 | 14 | import java.util.HashMap; 15 | 16 | /** 17 | * @Package:cn.ucaner.pattern.structure.adapter.adapterAbs 18 | * @ClassName:IOtherInfo 19 | * @Description:

适配器模式 - - 需要对接的用户接口类

20 | * @Author: - 21 | * @CreatTime:2017年10月26日 下午6:03:38 22 | * @Modify By: 23 | * @ModifyTime: 24 | * @Modify marker: 25 | * @version V1.0 26 | */ 27 | public interface IOtherInfo { 28 | 29 | /** 30 | * @Description:获取用户的User信息 31 | * @return: HashMap 32 | * @CreatTime: 2018年9月23日 33 | * @Autor: Jason - jasonandy@hotmail.com 34 | */ 35 | HashMap getUserInfo(); 36 | 37 | /** 38 | * @Description: 获取的是用户的job信息 39 | * @return: HashMap 40 | * @CreatTime: 2018年9月23日 41 | * @Autor: Jason - jasonandy@hotmail.com 42 | */ 43 | HashMap getUserJobInfo(); 44 | } 45 | -------------------------------------------------------------------------------- /src/cn/ucaner/pattern/structure/adapter/adapterAbs/IUserInfo.java: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * 4 | *

Copyright 1994 JsonInternational

5 | *

All rights reserved.

6 | *

Created on 19941115

7 | *

Created by Jason

8 | * 9 | * 10 | */ 11 | package cn.ucaner.pattern.structure.adapter.adapterAbs; 12 | 13 | /** 14 | * @Package:cn.ucaner.pattern.structure.adapter.adapterAbs 15 | * @ClassName:IUserInfo 16 | * @Description:

适配器模式 - -抽象用户类

17 | * @Author: - 18 | * @CreatTime:2017年10月26日 下午6:03:19 19 | * @Modify By: 20 | * @ModifyTime: 21 | * @Modify marker: 22 | * @version V1.0 23 | */ 24 | public interface IUserInfo { 25 | 26 | //user信息 27 | String getUserName(); 28 | String getHomeAddress(); 29 | String getMobileNumber(); 30 | String getSex(); 31 | 32 | //job信息 33 | String getJobPosition(); 34 | 35 | 36 | 37 | } 38 | -------------------------------------------------------------------------------- /src/cn/ucaner/pattern/structure/adapter/charge/ChargeTest.java: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * 4 | *

Copyright 1994 JsonInternational

5 | *

All rights reserved.

6 | *

Created on 19941115

7 | *

Created by Jason

8 | * 9 | * 10 | */ 11 | package cn.ucaner.pattern.structure.adapter.charge; 12 | 13 | import cn.ucaner.pattern.structure.adapter.charge.inf.ThreeInterface; 14 | import cn.ucaner.pattern.structure.adapter.charge.inf.TwoInterface; 15 | 16 | /** 17 | * @Package:cn.ucaner.pattern.structure.adapter.charge 18 | * @ClassName:ChargeTest 19 | * @Description:

ChargeTest 适配器测试

20 | * @Author: - Jason 21 | * @CreatTime:2018年6月5日 下午9:02:23 22 | * @Modify By: 23 | * @ModifyTime: 2018年6月5日 24 | * @Modify marker: 25 | * @version V1.0 26 | */ 27 | public class ChargeTest { 28 | 29 | /** 30 | * 31 | * @Description: Just for test 32 | * @param args 33 | * @Autor: Jason - jasonandy@hotmail.com 34 | */ 35 | public static void main(String[] args) { 36 | 37 | TwoInterface twoInterface = new ChinaCharge();//2口 38 | 39 | ThreeInterface threeInterface = new Three2TwoAdapter(twoInterface); 40 | 41 | ThreeInterface threeInterface2 = new HongKongCharge(); 42 | 43 | Three3TwoAdapter three3TwoAdapter = new Three3TwoAdapter(threeInterface2); 44 | 45 | three3TwoAdapter.OfferPowerForTwo(); 46 | 47 | threeInterface.OfferPowerForThree(); 48 | } 49 | 50 | } 51 | -------------------------------------------------------------------------------- /src/cn/ucaner/pattern/structure/adapter/charge/ChinaCharge.java: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * 4 | *

Copyright 1994 JsonInternational

5 | *

All rights reserved.

6 | *

Created on 19941115

7 | *

Created by Jason

8 | * 9 | * 10 | */ 11 | package cn.ucaner.pattern.structure.adapter.charge; 12 | 13 | import cn.ucaner.pattern.structure.adapter.charge.inf.TwoInterface; 14 | 15 | /** 16 | * @Package:cn.ucaner.pattern.structure.adapter.charge 17 | * @ClassName:RealTwo 18 | * @Description:

China 中国的插头 标准两口 220v

19 | * @Author: - Jason 20 | * @CreatTime:2018年6月5日 下午8:54:41 21 | * @Modify By: 22 | * @ModifyTime: 2018年6月5日 23 | * @Modify marker: 24 | * @version V1.0 25 | */ 26 | public class ChinaCharge implements TwoInterface{ 27 | 28 | /** 29 | * OfferPowerForTwo 标准的两口插座 30 | */ 31 | @Override 32 | public void OfferPowerForTwo() { 33 | System.out.println("I'm China Charge. 220V. - 中国的标准的220V 50HZ 电源."); 34 | } 35 | 36 | } 37 | -------------------------------------------------------------------------------- /src/cn/ucaner/pattern/structure/adapter/charge/HongKongCharge.java: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * 4 | *

Copyright 1994 JsonInternational

5 | *

All rights reserved.

6 | *

Created on 19941115

7 | *

Created by Jason

8 | * 9 | * 10 | */ 11 | package cn.ucaner.pattern.structure.adapter.charge; 12 | 13 | import cn.ucaner.pattern.structure.adapter.charge.inf.ThreeInterface; 14 | 15 | /** 16 | * @Package:cn.ucaner.pattern.structure.adapter.charge 17 | * @ClassName:HongKongCharge 18 | * @Description:

19 | * @Author: - Jason 20 | * @CreatTime:2018年9月23日 - 上午11:00:08 21 | * @Modify By: 22 | * @ModifyTime: 2018年9月23日 23 | * @Modify marker: 24 | * @version V1.0 25 | */ 26 | public class HongKongCharge implements ThreeInterface{ 27 | 28 | /** 29 | * 大家好这里是标准的3口插头 30 | */ 31 | @Override 32 | public void OfferPowerForThree() { 33 | System.out.println("I'm Three Charge - HK Standard"); 34 | } 35 | 36 | } 37 | -------------------------------------------------------------------------------- /src/cn/ucaner/pattern/structure/adapter/charge/Three2TwoAdapter.java: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * 4 | *

Copyright 1994 JsonInternational

5 | *

All rights reserved.

6 | *

Created on 19941115

7 | *

Created by Jason

8 | * 9 | * 10 | */ 11 | package cn.ucaner.pattern.structure.adapter.charge; 12 | 13 | import cn.ucaner.pattern.structure.adapter.charge.inf.ThreeInterface; 14 | import cn.ucaner.pattern.structure.adapter.charge.inf.TwoInterface; 15 | 16 | /** 17 | * @Package:cn.ucaner.pattern.structure.adapter.charge 18 | * @ClassName:Three2TwoAdapter 19 | * @Description:

3口转2口 转接头

20 | * @Author: - Jason 21 | * @CreatTime:2018年6月5日 下午8:58:51 22 | * @Modify By: 23 | * @ModifyTime: 2018年6月5日 24 | * @Modify marker: 25 | * @version V1.0 26 | */ 27 | public class Three2TwoAdapter implements ThreeInterface{ 28 | 29 | /** 30 | * 2口充电头 - 适配器 31 | */ 32 | TwoInterface twoInterface; 33 | 34 | /** 35 | * 3口 转两口的插座 - 适配 36 | * @param twoInterface 37 | */ 38 | public Three2TwoAdapter(TwoInterface twoInterface) { 39 | super(); 40 | this.twoInterface = twoInterface; 41 | } 42 | 43 | 44 | /** 45 | * 三口的适配器 适用的是俩孔的插座 46 | */ 47 | @Override 48 | public void OfferPowerForThree() { 49 | twoInterface.OfferPowerForTwo(); 50 | } 51 | 52 | } 53 | -------------------------------------------------------------------------------- /src/cn/ucaner/pattern/structure/adapter/charge/Three3TwoAdapter.java: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * 4 | *

Copyright 1994-2018 JasonInternational

5 | *

All rights reserved.

6 | *

Created on ${date}

7 | *

Created by Jason - jasonandy@hotmail.com

8 | * 9 | * 10 | */ 11 | package cn.ucaner.pattern.structure.adapter.charge; 12 | 13 | import cn.ucaner.pattern.structure.adapter.charge.inf.ThreeInterface; 14 | import cn.ucaner.pattern.structure.adapter.charge.inf.TwoInterface; 15 | 16 | public class Three3TwoAdapter implements TwoInterface{ 17 | 18 | ThreeInterface threeInterface; 19 | 20 | /** 21 | * 2口 转3口的插座 - 适配 22 | * @param twoInterface 23 | */ 24 | public Three3TwoAdapter(ThreeInterface threeInterface) { 25 | super(); 26 | this.threeInterface = threeInterface; 27 | } 28 | 29 | 30 | @Override 31 | public void OfferPowerForTwo() { 32 | threeInterface.OfferPowerForThree(); 33 | } 34 | 35 | } 36 | -------------------------------------------------------------------------------- /src/cn/ucaner/pattern/structure/adapter/charge/inf/ThreeInterface.java: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * 4 | *

Copyright 1994 JsonInternational

5 | *

All rights reserved.

6 | *

Created on 19941115

7 | *

Created by Jason

8 | * 9 | * 10 | */ 11 | package cn.ucaner.pattern.structure.adapter.charge.inf; 12 | 13 | /** 14 | * @Package:cn.ucaner.pattern.structure.adapter.charge.inf 15 | * @ClassName:ThreeInterface 16 | * @Description:

三口插头

17 | *
创建一个能够根据所传递对象的不同而具有不同行为的方法被称为[策略设计模式]
18 | * @Author: - Jason 19 | * @CreatTime:2018年6月5日 下午8:51:29 20 | * @Modify By: 21 | * @ModifyTime: 2018年6月5日 22 | * @Modify marker: 23 | * @version V1.0 24 | */ 25 | public interface ThreeInterface { 26 | 27 | /** 28 | * @Description:三个口的插头有 一 个 功能,能够为三个触角的插头提供电源 29 | * @CreatTime: 2018年9月23日 30 | * @Autor: Jason - jasonandy@hotmail.com 31 | */ 32 | public void OfferPowerForThree(); 33 | 34 | 35 | 36 | 37 | } 38 | -------------------------------------------------------------------------------- /src/cn/ucaner/pattern/structure/adapter/charge/inf/TwoInterface.java: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * 4 | *

Copyright 1994 JsonInternational

5 | *

All rights reserved.

6 | *

Created on 19941115

7 | *

Created by Jason

8 | * 9 | * s 10 | * 11 | */ 12 | package cn.ucaner.pattern.structure.adapter.charge.inf; 13 | 14 | /** 15 | * @Package:cn.ucaner.pattern.structure.adapter.charge.inf 16 | * @ClassName:TwoInterface 17 | * @Description:

两个接口

18 | *
创建一个能够根据所传递对象的不同而具有不同行为的方法被称为[策略设计模式 ] 抽象类更好 对类的抽象 
19 | * @Author: - Jason 20 | * @CreatTime:2018年6月5日 下午8:52:55 21 | * @Modify By: 22 | * @ModifyTime: 2018年6月5日 23 | * @Modify marker: 24 | * @version V1.0 25 | */ 26 | public interface TwoInterface { 27 | 28 | /** 29 | * @Description: 两口的插座 30 | * @CreatTime: 2018年9月23日 31 | * @Autor: Jason - jasonandy@hotmail.com 32 | */ 33 | public void OfferPowerForTwo(); 34 | 35 | } 36 | -------------------------------------------------------------------------------- /src/cn/ucaner/pattern/structure/bridge/BridgeMain.java: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * 4 | *

Copyright 1994 JsonInternational

5 | *

All rights reserved.

6 | *

Created on 19941115

7 | *

Created by Jason

8 | * 9 | * 10 | */ 11 | package cn.ucaner.pattern.structure.bridge; 12 | 13 | import cn.ucaner.pattern.structure.bridge.abs.Implementor; 14 | 15 | /** 16 | * 17 | * @Package:cn.ucaner.pattern.structure.bridge 18 | * @ClassName:BridgeMain 19 | * @Description:

桥接模式 -- 执行类

20 | * @Author: - 21 | * @CreatTime:2017年10月26日 下午5:59:16 22 | * @Modify By: 23 | * @ModifyTime: 24 | * @Modify marker: 25 | * @version V1.0 26 | */ 27 | public class BridgeMain { 28 | 29 | 30 | public static void main(String[] args) { 31 | /** 32 | * 实现化角色 33 | */ 34 | Implementor implementor = new ConcreteImplementor(); 35 | 36 | /** 37 | * 抽象化角色 38 | */ 39 | RefinedAbstraction refinedAbstraction = new RefinedAbstraction(implementor); 40 | 41 | /** 42 | * 抽象化角色搞事情 43 | */ 44 | refinedAbstraction.doSomethings(); 45 | 46 | implementor.doSomethingA(); 47 | implementor.doSomethingB(); 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /src/cn/ucaner/pattern/structure/bridge/ConcreteImplementor.java: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * 4 | *

Copyright 1994 JsonInternational

5 | *

All rights reserved.

6 | *

Created on 19941115

7 | *

Created by Jason

8 | * 9 | * 10 | */ 11 | package cn.ucaner.pattern.structure.bridge; 12 | 13 | import cn.ucaner.pattern.structure.bridge.abs.Implementor; 14 | 15 | /** 16 | * @Package:cn.ucaner.pattern.structure.bridge 17 | * @ClassName:ConcreteImplementor 18 | * @Description:

桥接模式 -- 具体实现类

19 | * @Author: - 20 | * @CreatTime:2017年10月26日 下午5:59:37 21 | * @Modify By: 22 | * @ModifyTime: 23 | * @Modify marker: 24 | * @version V1.0 25 | */ 26 | public class ConcreteImplementor implements Implementor { 27 | 28 | @Override 29 | public void doSomethingA() { 30 | System.out.println("bridge do something A"); 31 | } 32 | 33 | @Override 34 | public void doSomethingB() { 35 | System.out.println("bridge do something B"); 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /src/cn/ucaner/pattern/structure/bridge/RefinedAbstraction.java: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * 4 | *

Copyright 1994 JsonInternational

5 | *

All rights reserved.

6 | *

Created on 19941115

7 | *

Created by Jason

8 | * 9 | * 10 | */ 11 | package cn.ucaner.pattern.structure.bridge; 12 | 13 | import cn.ucaner.pattern.structure.bridge.abs.Abstraction; 14 | import cn.ucaner.pattern.structure.bridge.abs.Implementor; 15 | 16 | /** 17 | * @Package:cn.ucaner.pattern.structure.bridge 18 | * @ClassName:RefinedAbstraction 19 | * @Description:

桥接模式 --- 具体抽象化角色

20 | * @Author: - 21 | * @CreatTime:2017年10月26日 下午5:58:08 22 | * @Modify By: 23 | * @ModifyTime: 24 | * @Modify marker: 25 | * @version V1.0 26 | */ 27 | public class RefinedAbstraction extends Abstraction { 28 | 29 | public RefinedAbstraction(Implementor implementor) { 30 | super(implementor); 31 | } 32 | 33 | /** 34 | * 抽象类 - dosomething 35 | */ 36 | @Override 37 | public void doSomethings() { 38 | super.doSomethings(); 39 | getImplementor().doSomethingB(); 40 | getImplementor().doSomethingA(); 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /src/cn/ucaner/pattern/structure/bridge/abs/Abstraction.java: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * 4 | *

Copyright 1994 JsonInternational

5 | *

All rights reserved.

6 | *

Created on 19941115

7 | *

Created by Jason

8 | * 9 | * 10 | */ 11 | package cn.ucaner.pattern.structure.bridge.abs; 12 | 13 | /** 14 | * @Package:cn.ucaner.pattern.structure.bridge.abs 15 | * @ClassName:Abstraction 16 | * @Description:

桥接模式 --- 抽象化角色

17 | *
 桥接Bridge是用于把 [抽象化与实现化]解耦,使得二者可以独立变化 
18 | * @Author: - 19 | * @CreatTime:2017年10月26日 下午5:58:30 20 | * @Modify By: 21 | * @ModifyTime: 22 | * @Modify marker: 23 | * @version V1.0 24 | */ 25 | public abstract class Abstraction{ 26 | 27 | /** 28 | * Implementor 实现器 - 其实就是 抽象化 和 实现化 解耦 29 | */ 30 | private Implementor implementor; 31 | 32 | public Abstraction(Implementor implementor) { 33 | this.implementor = implementor; 34 | } 35 | 36 | public void doSomethings(){ 37 | System.out.println("Abs 开始搞事情!"); 38 | implementor.doSomethingA(); 39 | implementor.doSomethingB(); 40 | System.out.println("Abs 搞事情完毕!"); 41 | } 42 | 43 | public Implementor getImplementor(){ 44 | return implementor; 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /src/cn/ucaner/pattern/structure/bridge/abs/Implementor.java: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * 4 | *

Copyright 1994 JsonInternational

5 | *

All rights reserved.

6 | *

Created on 19941115

7 | *

Created by Jason

8 | * 9 | * 10 | */ 11 | package cn.ucaner.pattern.structure.bridge.abs; 12 | 13 | /** 14 | * @Package:cn.ucaner.pattern.structure.bridge.abs 15 | * @ClassName:Implementor 16 | * @Description:

桥接模式 --- 实现化角色

17 | * @Author: - 18 | * @CreatTime:2017年10月26日 下午5:58:48 19 | * @Modify By: 20 | * @ModifyTime: 21 | * @Modify marker: 22 | * @version V1.0 23 | */ 24 | public interface Implementor { 25 | 26 | /** 27 | * @Description: doSomethingA 28 | * @Autor: Jason 29 | */ 30 | public void doSomethingA(); 31 | 32 | /** 33 | * @Description: doSomethingB 34 | * @Autor: Jason 35 | */ 36 | public void doSomethingB(); 37 | } 38 | -------------------------------------------------------------------------------- /src/cn/ucaner/pattern/structure/bridge/bridge.md: -------------------------------------------------------------------------------- 1 | # 桥接模式 2 | 3 | 桥接模式又称桥梁模式。 4 | 5 | > 将抽象和实现解耦,使得两者可以独立的变化 6 | 7 | 类图在XMind文件中已经有了,可以看出他也是一个比较简单的模式,他有四个角色 8 | 9 | * Abstraction 抽象化角色;定义出该角色的行为,同事保存一个实现化角色的引用,一般为抽象类 10 | * Implementor 实现化角色 ;接口或者抽象类,定义角色必须的行为和属性 11 | * RefinedAbstraction 修正抽象化角色;引用实现化角色对抽象化角色进行修正 12 | * ConcreteImplementor 具体实现化角色 ;它实现接口或抽象类定义的方法和属性 13 | 14 | -------------------------------------------------------------------------------- /src/cn/ucaner/pattern/structure/bridge/db/Bridge.java: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * 4 | *

Copyright 1994 JsonInternational

5 | *

All rights reserved.

6 | *

Created on 19941115

7 | *

Created by Jason

8 | * 9 | * 10 | */ 11 | package cn.ucaner.pattern.structure.bridge.db; 12 | 13 | import cn.ucaner.pattern.structure.bridge.db.inf.Driver; 14 | 15 | /** 16 | * @Package:cn.ucaner.pattern.structure.bridge.db 17 | * @ClassName:Bridge 18 | * @Description:

Bridge

19 | * @Author: - Jason 20 | * @CreatTime:2018年6月5日 下午9:34:03 21 | * @Modify By: 22 | * @ModifyTime: 2018年6月5日 23 | * @Modify marker: 24 | * @version V1.0 25 | */ 26 | public abstract class Bridge { 27 | 28 | /** 29 | * JDBC 驱动 30 | */ 31 | private Driver driver; 32 | 33 | /** 34 | * @Description: 连接器 35 | * @Autor: Jason - jasonandy@hotmail.com 36 | */ 37 | public void connect(){ 38 | driver.connect(); 39 | } 40 | 41 | public Driver getDriver() { 42 | return driver; 43 | } 44 | 45 | public void setDriver(Driver driver) { 46 | this.driver = driver; 47 | } 48 | 49 | } 50 | -------------------------------------------------------------------------------- /src/cn/ucaner/pattern/structure/bridge/db/BridgeTest.java: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * 4 | *

Copyright 1994 JsonInternational

5 | *

All rights reserved.

6 | *

Created on 19941115

7 | *

Created by Jason

8 | * 9 | * 10 | */ 11 | package cn.ucaner.pattern.structure.bridge.db; 12 | 13 | import cn.ucaner.pattern.structure.bridge.db.inf.Driver; 14 | 15 | /** 16 | * @Package:cn.ucaner.pattern.structure.bridge.db 17 | * @ClassName:BridgeTest 18 | * @Description:

BridgeTest

19 | * @Author: - Jason 20 | * @CreatTime:2018年6月5日 下午9:37:19 21 | * @Modify By: 22 | * @ModifyTime: 2018年6月5日 23 | * @Modify marker: 24 | * @version V1.0 25 | */ 26 | public class BridgeTest { 27 | 28 | public static void main(String[] args) { 29 | 30 | Bridge mysqlBridge = new MyBridge(); 31 | 32 | Driver mysqlDriver = new Mysql(); 33 | mysqlBridge.setDriver(mysqlDriver); 34 | mysqlBridge.connect(); 35 | 36 | Bridge oracleBridge = new OracleBridge(); 37 | 38 | Driver oracle = new Oracle(); 39 | oracleBridge.setDriver(oracle); 40 | oracleBridge.connect(); 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /src/cn/ucaner/pattern/structure/bridge/db/MyBridge.java: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * 4 | *

Copyright 1994 JsonInternational

5 | *

All rights reserved.

6 | *

Created on 19941115

7 | *

Created by Jason

8 | * 9 | * 10 | */ 11 | package cn.ucaner.pattern.structure.bridge.db; 12 | 13 | /** 14 | * @Package:cn.ucaner.pattern.structure.bridge.db 15 | * @ClassName:MyBridge 16 | * @Description:

MyBridge

17 | * @Author: - Jason 18 | * @CreatTime:2018年6月5日 下午9:36:29 19 | * @Modify By: 20 | * @ModifyTime: 2018年6月5日 21 | * @Modify marker: 22 | * @version V1.0 23 | */ 24 | public class MyBridge extends Bridge{ 25 | 26 | /** 27 | * MyBridge. 28 | */ 29 | public MyBridge() { 30 | super(); 31 | System.out.println("** MyBridge 桥接器准备完毕 **"); 32 | } 33 | 34 | } 35 | -------------------------------------------------------------------------------- /src/cn/ucaner/pattern/structure/bridge/db/Mysql.java: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * 4 | *

Copyright 1994 JsonInternational

5 | *

All rights reserved.

6 | *

Created on 19941115

7 | *

Created by Jason

8 | * 9 | * 10 | */ 11 | package cn.ucaner.pattern.structure.bridge.db; 12 | 13 | import cn.ucaner.pattern.structure.bridge.db.inf.Driver; 14 | 15 | /** 16 | * @Package:cn.ucaner.pattern.structure.bridge.db 17 | * @ClassName:Mysql 18 | * @Description:

Mysql

19 | * @Author: - Jason 20 | * @CreatTime:2018年6月5日 下午9:30:46 21 | * @Modify By: 22 | * @ModifyTime: 2018年6月5日 23 | * @Modify marker: 24 | * @version V1.0 25 | */ 26 | public class Mysql implements Driver{ 27 | 28 | @Override 29 | public void connect() { 30 | System.out.println("I'm Mysql Driver."); 31 | } 32 | 33 | } 34 | -------------------------------------------------------------------------------- /src/cn/ucaner/pattern/structure/bridge/db/Oracle.java: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * 4 | *

Copyright 1994 JsonInternational

5 | *

All rights reserved.

6 | *

Created on 19941115

7 | *

Created by Jason

8 | * 9 | * 10 | */ 11 | package cn.ucaner.pattern.structure.bridge.db; 12 | 13 | import cn.ucaner.pattern.structure.bridge.db.inf.Driver; 14 | 15 | /** 16 | * @Package:cn.ucaner.pattern.structure.bridge.db 17 | * @ClassName:Oracle 18 | * @Description:

Oracle

19 | * @Author: - Jason 20 | * @CreatTime:2018年6月5日 下午9:32:51 21 | * @Modify By: 22 | * @ModifyTime: 2018年6月5日 23 | * @Modify marker: 24 | * @version V1.0 25 | */ 26 | public class Oracle implements Driver{ 27 | 28 | @Override 29 | public void connect() { 30 | System.out.println("I'm Oracle Driver."); 31 | } 32 | 33 | } 34 | -------------------------------------------------------------------------------- /src/cn/ucaner/pattern/structure/bridge/db/OracleBridge.java: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * 4 | *

Copyright JasonInternational

5 | *

All rights reserved.

6 | *

Created on 2018年10月18日 下午7:47:58

7 | *

Created by Jason

8 | * 9 | * 10 | */ 11 | package cn.ucaner.pattern.structure.bridge.db; 12 | 13 | /** 14 | * @Package:cn.ucaner.pattern.structure.bridge.db 15 | * @ClassName:OracleBridge 16 | * @Description:

OracleBridge

17 | * @Author: - Jason 18 | * @CreatTime:2018年10月18日 下午7:47:58 19 | * @Modify By: 20 | * @ModifyTime: 2018年10月18日 21 | * @Modify marker: 22 | * @version V1.0 23 | */ 24 | public class OracleBridge extends Bridge{ 25 | 26 | /** 27 | * OracleBridge. 28 | */ 29 | public OracleBridge() { 30 | super(); 31 | System.out.println("** OracleBridge 准备完毕! **"); 32 | } 33 | 34 | 35 | } 36 | -------------------------------------------------------------------------------- /src/cn/ucaner/pattern/structure/bridge/db/inf/Driver.java: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * 4 | *

Copyright 1994 JsonInternational

5 | *

All rights reserved.

6 | *

Created on 19941115

7 | *

Created by Jason

8 | * 9 | * 10 | */ 11 | package cn.ucaner.pattern.structure.bridge.db.inf; 12 | 13 | /** 14 | * @Package:cn.ucaner.pattern.structure.bridge.db.inf 15 | * @ClassName:Driver 16 | * @Description:

JDBC 驱动

17 | * @Author: - Jason 18 | * @CreatTime:2018年6月5日 下午9:29:12 19 | * @Modify By: 20 | * @ModifyTime: 2018年6月5日 21 | * @Modify marker: 22 | * @version V1.0 23 | */ 24 | public interface Driver { 25 | 26 | /** 27 | * @Description: 连接器 28 | * @Autor: Jason - jasonandy@hotmail.com 29 | */ 30 | public void connect(); 31 | 32 | } 33 | -------------------------------------------------------------------------------- /src/cn/ucaner/pattern/structure/decorator/DecoratorMain.java: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * 4 | *

Copyright 1994 JsonInternational

5 | *

All rights reserved.

6 | *

Created on 19941115

7 | *

Created by Jason

8 | * 9 | * 10 | */ 11 | package cn.ucaner.pattern.structure.decorator; 12 | 13 | import cn.ucaner.pattern.structure.decorator.decoratorAbs.SchoolReport; 14 | import cn.ucaner.pattern.structure.decorator.decoratorIml.FouthGradeSchoolReport; 15 | import cn.ucaner.pattern.structure.decorator.decoratorIml.GoodBoyDecortaor; 16 | import cn.ucaner.pattern.structure.decorator.decoratorIml.RankDecortaor; 17 | import cn.ucaner.pattern.structure.decorator.decoratorIml.SuagrFouthGradeSchoolReport; 18 | 19 | /** 20 | * @Package:cn.ucaner.pattern.structure.decorator 21 | * @ClassName:DecoratorMain 22 | * @Description:

装饰器模式 - 装饰器模式运行类 23 | * {@link https://www.cnblogs.com/octobershiner/archive/2011/11/04/2236730.html} 24 | *

25 | * @Author: - 26 | * @CreatTime:2017年10月26日 下午5:15:16 27 | * @Modify By: 28 | * @ModifyTime: 29 | * @Modify marker: 30 | * @version V1.0 31 | */ 32 | public class DecoratorMain { 33 | 34 | public static void main(String[] args) { 35 | absDecorator(); 36 | extendsDecorator(); 37 | normol(); 38 | } 39 | 40 | /** 41 | * @Description: 一般情况下 -- 没有包装的情况下 42 | * @Autor: Jason 43 | */ 44 | private static void normol(){ 45 | 46 | System.out.println("****************没有包装成绩的情况下*********************"); 47 | //把成绩单领回家 48 | SchoolReport schoolReport=new FouthGradeSchoolReport(); 49 | //家长看成绩单 50 | schoolReport.report(); 51 | schoolReport.sign(" 大家好我是校长"); 52 | //schoolReport.discuss("我建议你别浪费钱!"); 53 | //准备挨打 54 | System.out.println("********************************************************"); 55 | } 56 | 57 | /** 58 | * @Description:如果用继承装饰 59 | * @Autor: Jason 60 | */ 61 | private static void extendsDecorator(){ 62 | /** 63 | * 这里是被包装了的成绩单 家长看到的只是比较好的成绩 64 | */ 65 | SchoolReport schoolReport = new SuagrFouthGradeSchoolReport(); 66 | 67 | /** 68 | * 看成绩单 69 | */ 70 | schoolReport.report(); 71 | 72 | /** 73 | * 签字确认 74 | */ 75 | schoolReport.sign("马化腾"); 76 | 77 | /** 78 | * 继承方式的弊端,如果以后要有五年级 六年级 七年级的成绩单, 79 | * 那么需要你分别对这几个年级的成绩单进行装饰, 80 | * 如果需要装饰的条件一旦很多,比如说平时表现啊什么的,就得一一去装饰,带来类的爆炸性增长, 81 | **/ 82 | } 83 | 84 | 85 | /** 86 | * @Description: 利用抽象装饰 87 | * @Autor: Jason 88 | */ 89 | private static void absDecorator(){ 90 | // ******************************** CallMethod Start ***************************************** 91 | 92 | /** 93 | * 原始的成绩 -- 没有经过包装的成绩 94 | */ 95 | SchoolReport schoolReport=new FouthGradeSchoolReport(); 96 | /** 97 | * 装饰表现 98 | */ 99 | schoolReport=new GoodBoyDecortaor(schoolReport); 100 | 101 | /** 102 | * 装饰排名 103 | */ 104 | schoolReport=new RankDecortaor(schoolReport); 105 | 106 | /** 107 | * 装饰了几次后 - 开始报告成绩! 108 | */ 109 | schoolReport.report(); 110 | 111 | /** 112 | * 查阅者签名确认 113 | */ 114 | schoolReport.sign("马云"); 115 | 116 | schoolReport.discuss("建议好好读书!"); //这里没有打印出来 117 | 118 | // ******************************** CallMethod End ***************************************** 119 | } 120 | 121 | } 122 | -------------------------------------------------------------------------------- /src/cn/ucaner/pattern/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/cn/ucaner/pattern/structure/decorator/decoratorAbs/Decorator.java: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * 4 | *

Copyright 1994 JsonInternational

5 | *

All rights reserved.

6 | *

Created on 19941115

7 | *

Created by Jason

8 | * 9 | * 10 | */ 11 | package cn.ucaner.pattern.structure.decorator.decoratorAbs; 12 | 13 | /** 14 | * @Package:cn.ucaner.pattern.structure.decorator.decoratorAbs 15 | * @ClassName:Decorator 16 | * @Description:

装饰器模式 - 17 | * 抽象装饰器 这种方式看起来和静态代理模式很像 {@link cn.ucaner.pattern.structure.proxy.staticProxy.Proxy }

18 | * @Author: - 19 | * @CreatTime:2017年10月26日 下午5:16:35 20 | * @Modify By: 21 | * @ModifyTime: 22 | * @Modify marker: 23 | * @version V1.0 24 | */ 25 | public abstract class Decorator extends SchoolReport { 26 | 27 | /** 28 | * 成绩单的抽象类 29 | */ 30 | private SchoolReport schoolReport; 31 | 32 | /** 33 | * Decorator. 将成绩单的属性包装到 Decorator里面去 34 | * @param schoolReport 35 | */ 36 | public Decorator(SchoolReport schoolReport) { 37 | this.schoolReport = schoolReport; 38 | } 39 | 40 | /** 41 | * 展示自己的成绩 42 | */ 43 | public void report(){ 44 | schoolReport.report(); 45 | } 46 | 47 | @Override 48 | public void sign(String name) { 49 | schoolReport.sign(name); 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /src/cn/ucaner/pattern/structure/decorator/decoratorAbs/SchoolReport.java: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * 4 | *

Copyright 1994 JsonInternational

5 | *

All rights reserved.

6 | *

Created on 19941115

7 | *

Created by Jason

8 | * 9 | * 10 | */ 11 | package cn.ucaner.pattern.structure.decorator.decoratorAbs; 12 | 13 | /** 14 | * @Package:cn.ucaner.pattern.structure.decorator.decoratorAbs 15 | * @ClassName:SchoolReport 16 | * @Description:

装饰器模式 - 成绩单抽象类

17 | * @Author: - 18 | * @CreatTime:2017年10月26日 下午5:17:14 19 | * @Modify By: 20 | * @ModifyTime: 21 | * @Modify marker: 22 | * @version V1.0 23 | */ 24 | public abstract class SchoolReport { 25 | 26 | /** 27 | * 展示自己的成绩 28 | */ 29 | public abstract void report(); 30 | 31 | /** 32 | * 家长签名 33 | */ 34 | public abstract void sign(String name); 35 | 36 | /** 37 | * 建议-给出建议 38 | */ 39 | public abstract void discuss(String discuss); 40 | 41 | } 42 | -------------------------------------------------------------------------------- /src/cn/ucaner/pattern/structure/decorator/decoratorIml/FouthGradeSchoolReport.java: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * 4 | *

Copyright 1994 JsonInternational

5 | *

All rights reserved.

6 | *

Created on 19941115

7 | *

Created by Jason

8 | * 9 | * 10 | */ 11 | package cn.ucaner.pattern.structure.decorator.decoratorIml; 12 | 13 | import cn.ucaner.pattern.structure.decorator.decoratorAbs.SchoolReport; 14 | 15 | /** 16 | * @Package:cn.ucaner.pattern.structure.decorator.decoratorIml 17 | * @ClassName:FouthGradeSchoolReport 18 | * @Description:

装饰器模式 - - 四年级成绩单

19 | * @Author: - 20 | * @CreatTime:2017年10月26日 下午5:17:57 21 | * @Modify By: 22 | * @ModifyTime: 23 | * @Modify marker: 24 | * @version V1.0 25 | */ 26 | public class FouthGradeSchoolReport extends SchoolReport { 27 | 28 | 29 | @Override 30 | public void report() { 31 | System.out.print(" 数学60,语文:80,英语:90 "); 32 | } 33 | 34 | @Override 35 | public void sign(String name) { 36 | System.out.println(" 家长签名:" + name); 37 | } 38 | 39 | @Override 40 | public void discuss(String discuss) { 41 | System.out.println(" 建议: " + discuss); 42 | } 43 | 44 | } 45 | -------------------------------------------------------------------------------- /src/cn/ucaner/pattern/structure/decorator/decoratorIml/GoodBoyDecortaor.java: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * 4 | *

Copyright 1994 JsonInternational

5 | *

All rights reserved.

6 | *

Created on 19941115

7 | *

Created by Jason

8 | * 9 | * 10 | */ 11 | package cn.ucaner.pattern.structure.decorator.decoratorIml; 12 | 13 | import cn.ucaner.pattern.structure.decorator.decoratorAbs.Decorator; 14 | import cn.ucaner.pattern.structure.decorator.decoratorAbs.SchoolReport; 15 | 16 | /** 17 | * @Package:cn.ucaner.pattern.structure.decorator.decoratorIml 18 | * @ClassName:GoodBoyDecortaor 19 | * @Description:

装饰器模式 - - 装饰在学校的表现

20 | * @Author: - 21 | * @CreatTime:2017年10月26日 下午5:20:40 22 | * @Modify By: 23 | * @ModifyTime: 24 | * @Modify marker: 25 | * @version V1.0 26 | */ 27 | public class GoodBoyDecortaor extends Decorator { 28 | 29 | public GoodBoyDecortaor(SchoolReport schoolReport) { 30 | super(schoolReport); 31 | } 32 | 33 | /** 34 | * @Description:报告之前 先包装一下数据 35 | * @Autor: Jason 36 | */ 37 | private void goodBoyDecorator(){ 38 | System.out.println("我在学校表现很好,没毛病!"); 39 | } 40 | 41 | /** 42 | * 1.goodBoyDecorator 43 | * 2.成绩报告. 44 | */ 45 | @Override 46 | public void report() { 47 | goodBoyDecorator(); 48 | super.report(); 49 | 50 | } 51 | 52 | /** 53 | * 给出建议 54 | */ 55 | @Override 56 | public void discuss(String discuss) { 57 | System.out.println("表现好就可以骄傲了?我骄傲过吗?"); 58 | } 59 | } 60 | -------------------------------------------------------------------------------- /src/cn/ucaner/pattern/structure/decorator/decoratorIml/RankDecortaor.java: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * 4 | *

Copyright 1994 JsonInternational

5 | *

All rights reserved.

6 | *

Created on 19941115

7 | *

Created by Jason

8 | * 9 | * 10 | */ 11 | package cn.ucaner.pattern.structure.decorator.decoratorIml; 12 | 13 | import cn.ucaner.pattern.structure.decorator.decoratorAbs.Decorator; 14 | import cn.ucaner.pattern.structure.decorator.decoratorAbs.SchoolReport; 15 | 16 | /** 17 | * @Package:cn.ucaner.pattern.structure.decorator.decoratorIml 18 | * @ClassName:RankDecortaor 19 | * @Description:

装饰器模式 - 装饰学校排名

20 | * @Author: - 21 | * @CreatTime:2017年10月26日 下午5:21:15 22 | * @Modify By: 23 | * @ModifyTime: 24 | * @Modify marker: 25 | * @version V1.0 26 | */ 27 | public class RankDecortaor extends Decorator { 28 | 29 | public RankDecortaor(SchoolReport schoolReport) { 30 | super(schoolReport); 31 | } 32 | 33 | private void rankDecortaor(){ 34 | System.out.println("在学校排名也很靠前"); 35 | } 36 | 37 | @Override 38 | public void report() { 39 | rankDecortaor(); 40 | super.report(); 41 | } 42 | 43 | @Override 44 | public void discuss(String discuss) { 45 | System.out.println("学校的排名这么靠前,还需要啥建议?建议低调一点,继续保持!"); 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /src/cn/ucaner/pattern/structure/decorator/decoratorIml/SuagrFouthGradeSchoolReport.java: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * 4 | *

Copyright 1994 JsonInternational

5 | *

All rights reserved.

6 | *

Created on 19941115

7 | *

Created by Jason

8 | * 9 | * 10 | */ 11 | package cn.ucaner.pattern.structure.decorator.decoratorIml; 12 | 13 | /** 14 | * @Package:cn.ucaner.pattern.structure.decorator.decoratorIml 15 | * @ClassName:SuagrFouthGradeSchoolReport 16 | * @Description:

装饰器模式 SuagrFouthGradeSchoolReport - FouthGradeSchoolReport

17 | * @Author: - 18 | * @CreatTime:2017年10月26日 下午5:21:41 19 | * @Modify By: 20 | * @ModifyTime: 21 | * @Modify marker: 22 | * @version V1.0 23 | */ 24 | public class SuagrFouthGradeSchoolReport extends FouthGradeSchoolReport { 25 | 26 | /** 27 | * 先把最高成绩说出去 28 | */ 29 | private void reportHighSorce(){ 30 | System.out.print("我英语得了90分,语文得了80分. "); 31 | } 32 | 33 | @Override 34 | public void report() { 35 | reportHighSorce(); 36 | super.report(); 37 | } 38 | } 39 | 40 | -------------------------------------------------------------------------------- /src/cn/ucaner/pattern/structure/flyweight/Circle.java: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * 4 | *

Copyright JasonInternational

5 | *

All rights reserved.

6 | *

Created on 2018年10月18日 下午2:23:26

7 | *

Created by Jason

8 | * 9 | * 10 | */ 11 | package cn.ucaner.pattern.structure.flyweight; 12 | 13 | import cn.ucaner.pattern.structure.flyweight.flyweightAbs.Shape; 14 | 15 | /** 16 | * @Package:cn.ucaner.pattern.structure.flyweight 17 | * @ClassName:Circle 18 | * @Description:

Circle

19 | * @Author: - Jason 20 | * @CreatTime:2018年10月18日 下午2:23:26 21 | * @Modify By: 22 | * @ModifyTime: 2018年10月18日 23 | * @Modify marker: 24 | * @version V1.0 25 | */ 26 | public class Circle extends Shape{ 27 | 28 | private String color; 29 | 30 | public Circle(String color){ 31 | this.color = color; 32 | } 33 | 34 | @Override 35 | public void draw() { 36 | System.out.println("Draw a Circle Which Color is " + color +"."); 37 | } 38 | 39 | } 40 | -------------------------------------------------------------------------------- /src/cn/ucaner/pattern/structure/flyweight/ConcreateFlyweight.java: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * 4 | *

Copyright 1994 JsonInternational

5 | *

All rights reserved.

6 | *

Created on 19941115

7 | *

Created by Jason

8 | * 9 | * 10 | */ 11 | package cn.ucaner.pattern.structure.flyweight; 12 | 13 | 14 | import java.util.Random; 15 | 16 | import cn.ucaner.pattern.structure.flyweight.flyweightAbs.Flyweight; 17 | 18 | /** 19 | * @Package:cn.ucaner.pattern.structure.flyweight 20 | * @ClassName:ConcreateFlyweight 21 | * @Description:

享元模式 -- 具体享元对象

22 | * @Author: - Jason 23 | * @CreatTime:2017年10月26日 下午6:10:48 24 | * @Modify By: 25 | * @ModifyTime: 2018年10月18日 26 | * @Modify marker: 27 | * @version V1.0 28 | */ 29 | public class ConcreateFlyweight extends Flyweight{ 30 | 31 | /** 32 | * ConcreateFlyweight. 传入外部状态 33 | * @param extrinsic 外部状态 34 | */ 35 | public ConcreateFlyweight(String extrinsic) { 36 | super(extrinsic); 37 | } 38 | 39 | /** 40 | * 根据外部状态进行逻辑处理 41 | */ 42 | @Override 43 | public void operate() { 44 | System.out.println(Extrinsic + "订单,订单编号"+new Random().nextInt(99999)); 45 | } 46 | 47 | @Override 48 | public void show() { 49 | System.out.println("内部状态"+getIntrinsic()); 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /src/cn/ucaner/pattern/structure/flyweight/DrawFactory.java: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * 4 | *

Copyright JasonInternational

5 | *

All rights reserved.

6 | *

Created on 2018年10月18日 下午2:24:40

7 | *

Created by Jason

8 | * 9 | * 10 | */ 11 | package cn.ucaner.pattern.structure.flyweight; 12 | 13 | import java.util.HashMap; 14 | 15 | import cn.ucaner.pattern.structure.flyweight.flyweightAbs.Shape; 16 | 17 | /** 18 | * @Package:cn.ucaner.pattern.structure.flyweight 19 | * @ClassName:DrawFactory 20 | * @Description:

DrawFactory

21 | * @Author: - Jason 22 | * @CreatTime:2018年10月18日 下午2:24:40 23 | * @Modify By: 24 | * @ModifyTime: 2018年10月18日 25 | * @Modify marker: 26 | * @version V1.0 27 | */ 28 | public class DrawFactory { 29 | 30 | /** 31 | * 定义一个池容器 - 享元池 32 | */ 33 | private static HashMap colorsPool = new HashMap(); 34 | 35 | /** 36 | * @Description: 获取对象 37 | * @param color 38 | * @return Shape 39 | * @Autor: Jason 40 | */ 41 | public static Shape getShape(String color){ 42 | 43 | /** 44 | * 需要返回的对象 45 | */ 46 | Shape shape = null; 47 | 48 | if(colorsPool.containsKey(color)){ 49 | shape = colorsPool.get(color); //外部状态 50 | }else { 51 | shape = new Circle(color); //如果不存在的话创建 放入池子中 52 | colorsPool.put(color,shape); 53 | } 54 | return shape; 55 | } 56 | 57 | /** 58 | * @Description: 获取池的大小 59 | * @return int 池子大小 60 | * @Autor: Jason 61 | */ 62 | public static int getPoolSize(){ 63 | return colorsPool.size(); 64 | } 65 | 66 | } 67 | -------------------------------------------------------------------------------- /src/cn/ucaner/pattern/structure/flyweight/DrawMain.java: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * 4 | *

Copyright JasonInternational

5 | *

All rights reserved.

6 | *

Created on 2018年10月18日 下午2:28:01

7 | *

Created by Jason

8 | * 9 | * 10 | */ 11 | package cn.ucaner.pattern.structure.flyweight; 12 | 13 | import cn.ucaner.pattern.structure.flyweight.flyweightAbs.Shape; 14 | 15 | /** 16 | * @Package:cn.ucaner.pattern.structure.flyweight 17 | * @ClassName:DrawMain 18 | * @Description:

DrawMain

19 | * @Author: - Jason 20 | * @CreatTime:2018年10月18日 下午2:28:01 21 | * @Modify By: 22 | * @ModifyTime: 2018年10月18日 23 | * @Modify marker: 24 | * @version V1.0 25 | */ 26 | public class DrawMain { 27 | 28 | public static void main(String[] args) { 29 | 30 | Shape shape1 = DrawFactory.getShape("RED"); 31 | Shape shape2 = DrawFactory.getShape("GREY"); 32 | Shape shape3 = DrawFactory.getShape("GREEN"); 33 | Shape shape4 = DrawFactory.getShape("RED"); 34 | Shape shape5 = DrawFactory.getShape("GREY"); 35 | Shape shape6 = DrawFactory.getShape("GREY"); 36 | 37 | shape1.draw(); 38 | shape2.draw(); 39 | shape3.draw(); 40 | shape4.draw(); 41 | shape5.draw(); 42 | shape6.draw(); 43 | 44 | System.out.println("一共绘制了" + DrawFactory.getPoolSize() + "种颜色的圆形."); 45 | } 46 | 47 | } 48 | -------------------------------------------------------------------------------- /src/cn/ucaner/pattern/structure/flyweight/FlyweightFactory.java: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * 4 | *

Copyright 1994 JsonInternational

5 | *

All rights reserved.

6 | *

Created on 19941115

7 | *

Created by Jason

8 | * 9 | * 10 | */ 11 | package cn.ucaner.pattern.structure.flyweight; 12 | 13 | import java.util.HashMap; 14 | 15 | import cn.ucaner.pattern.structure.flyweight.flyweightAbs.Flyweight; 16 | 17 | /** 18 | * @Package:cn.ucaner.pattern.structure.flyweight 19 | * @ClassName:FlyweightFactory 20 | * @Description:

享元模式 --- 享元工厂

21 | * @Author: - 22 | * @CreatTime:2017年10月26日 下午6:10:24 23 | * @Modify By: 24 | * @ModifyTime: 25 | * @Modify marker: 26 | * @version V1.0 27 | */ 28 | public class FlyweightFactory { 29 | 30 | /** 31 | * 定义一个池容器 - 享元池 32 | */ 33 | private static HashMap pool=new HashMap<>(); 34 | 35 | /** 36 | * @Description: 获取 Flyweight 对象 37 | * @param Extrinsic 外部状态 38 | * @return Flyweight 39 | * @Autor: Jason 40 | */ 41 | public static Flyweight getFlyweight(String Extrinsic){ 42 | /** 43 | * 需要返回的对象 44 | */ 45 | Flyweight flyweight = null; 46 | if(pool.containsKey(Extrinsic)){ 47 | flyweight=pool.get(Extrinsic); //外部状态 48 | }else { 49 | flyweight=new ConcreateFlyweight(Extrinsic); //如果不存在的话创建 放入池子中 50 | pool.put(Extrinsic,flyweight); 51 | } 52 | return flyweight; 53 | } 54 | 55 | /** 56 | * @Description: 获取池的大小 57 | * @return int 池子大小 58 | * @Autor: Jason 59 | */ 60 | public static int getPoolSize(){ 61 | return pool.size(); 62 | } 63 | } 64 | -------------------------------------------------------------------------------- /src/cn/ucaner/pattern/structure/flyweight/FlyweightMain.java: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * 4 | *

Copyright 1994 JsonInternational

5 | *

All rights reserved.

6 | *

Created on 19941115

7 | *

Created by Jason

8 | * 9 | * 10 | */ 11 | package cn.ucaner.pattern.structure.flyweight; 12 | 13 | import cn.ucaner.pattern.structure.flyweight.flyweightAbs.Flyweight; 14 | 15 | /** 16 | * @Package:cn.ucaner.pattern.structure.flyweight 17 | * @ClassName:FlyweightMain 18 | * @Description:

享元模式 --- 享元模式执行类 - https://www.cnblogs.com/chenssy/p/3330555.html

19 | * @Author: - 20 | * @CreatTime:2017年10月26日 下午6:09:45 21 | * @Modify By: 22 | * @ModifyTime: 23 | * @Modify marker: 24 | * @version V1.0 25 | */ 26 | public class FlyweightMain { 27 | 28 | public static void main(String[] args) { 29 | 30 | Flyweight fly1; 31 | Flyweight fly2; 32 | Flyweight fly3; 33 | Flyweight fly4; 34 | Flyweight fly5; 35 | Flyweight fly6; 36 | 37 | //根据类型创建订单对象 38 | fly1 = FlyweightFactory.getFlyweight("CAR"); 39 | fly2 = FlyweightFactory.getFlyweight("BOOK"); 40 | fly3 = FlyweightFactory.getFlyweight("HOUSE"); 41 | fly4 = FlyweightFactory.getFlyweight("BOOK"); 42 | fly5 = FlyweightFactory.getFlyweight("CAR"); 43 | fly6 = FlyweightFactory.getFlyweight("AUDI"); 44 | 45 | //调用 46 | fly1.operate(); 47 | //fly1.show(); 48 | 49 | fly2.operate(); 50 | fly3.operate(); 51 | fly4.operate(); 52 | fly5.operate(); 53 | fly6.operate(); 54 | 55 | //查看池中对象的数量 56 | System.out.print("pool 中对象的大小 = "+FlyweightFactory.getPoolSize()); 57 | 58 | } 59 | 60 | 61 | } 62 | -------------------------------------------------------------------------------- /src/cn/ucaner/pattern/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 | | -------------------- | ------- | 23 | | Flyweight | 抽象享元对象 | 24 | | ConcreateFlyweight | 具体享元对象 | 25 | | FlyweightFactory | 享元工厂 | 26 | | FlyweightMain | 享元模式执行类 | 27 | 28 | 一个外部状态,对应一个对象,其他的实例都是基于这个对象。 29 | 30 | -------------------------------------------------------------------------------- /src/cn/ucaner/pattern/structure/flyweight/flyweightAbs/Flyweight.java: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * 4 | *

Copyright 1994 JsonInternational

5 | *

All rights reserved.

6 | *

Created on 19941115

7 | *

Created by Jason

8 | * 9 | * 10 | */ 11 | package cn.ucaner.pattern.structure.flyweight.flyweightAbs; 12 | 13 | /** 14 | * @Package:cn.ucaner.pattern.structure.flyweight.flyweightAbs 15 | * @ClassName:Flyweight 16 | * @Description:

享元模式 --- 抽象享元对象 - https://www.cnblogs.com/lfxiao/p/6817141.html

17 | * @Author: - 18 | * @CreatTime:2017年10月26日 下午6:11:06 19 | * @Modify By: 20 | * @ModifyTime: 21 | * @Modify marker: 22 | * @version V1.0 23 | */ 24 | public abstract class Flyweight { 25 | 26 | /** 27 | * 内部状态 28 | */ 29 | private String intrinsic; 30 | 31 | /** 32 | * 外部状态 33 | */ 34 | protected final String Extrinsic; 35 | 36 | /** 37 | * Flyweight. 要求享元角色必须接受外部状态 38 | * @param extrinsic 39 | */ 40 | public Flyweight(String extrinsic) { 41 | Extrinsic = extrinsic; 42 | } 43 | 44 | /** 45 | * @Description:定义业务操作 46 | * @Autor: Jason 47 | */ 48 | public abstract void operate(); 49 | 50 | /** 51 | * @Description: 展示操作 52 | * @Autor: Jason 53 | */ 54 | public abstract void show(); 55 | 56 | /** 57 | * @Description: 内部状态的get和set 58 | * @return String 59 | * @Autor: Jason 60 | */ 61 | public String getIntrinsic() { 62 | return intrinsic; 63 | } 64 | 65 | public void setIntrinsic(String intrinsic) { 66 | this.intrinsic = intrinsic; 67 | } 68 | } 69 | -------------------------------------------------------------------------------- /src/cn/ucaner/pattern/structure/flyweight/flyweightAbs/Shape.java: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * 4 | *

Copyright JasonInternational

5 | *

All rights reserved.

6 | *

Created on 2018年10月18日 下午2:22:23

7 | *

Created by Jason

8 | * 9 | * 10 | */ 11 | package cn.ucaner.pattern.structure.flyweight.flyweightAbs; 12 | 13 | /** 14 | * @Package:cn.ucaner.pattern.structure.flyweight.flyweightAbs 15 | * @ClassName:Shape 16 | * @Description:

Shape

17 | * @Author: - Jason 18 | * @CreatTime:2018年10月18日 下午2:22:23 19 | * @Modify By: 20 | * @ModifyTime: 2018年10月18日 21 | * @Modify marker: 22 | * @version V1.0 23 | */ 24 | public abstract class Shape { 25 | 26 | /** 27 | * 内部状态 28 | */ 29 | private String intrinsic; 30 | 31 | /** 32 | * @Description: 假如我们有一个绘图的应用程序,通过它我们可以出绘制各种 33 | * 各样的形状、颜色的图形,那么这里形状和颜色就是内部状态了 34 | * 通过享元模式我们就可以实现该属性的共享了 35 | * @Autor: Jason 36 | */ 37 | public abstract void draw(); 38 | 39 | 40 | public String getIntrinsic() { 41 | return intrinsic; 42 | } 43 | 44 | public void setIntrinsic(String intrinsic) { 45 | this.intrinsic = intrinsic; 46 | } 47 | 48 | } 49 | -------------------------------------------------------------------------------- /src/cn/ucaner/pattern/structure/proxy/ProxyMain.java: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * 4 | *

Copyright 1994 JsonInternational

5 | *

All rights reserved.

6 | *

Created on 19941115

7 | *

Created by Jason

8 | * 9 | * 10 | */ 11 | package cn.ucaner.pattern.structure.proxy; 12 | 13 | import cn.ucaner.pattern.structure.proxy.dynamicProxy.RealSujectImpl; 14 | import cn.ucaner.pattern.structure.proxy.dynamicProxy.Subject; 15 | import cn.ucaner.pattern.structure.proxy.dynamicProxy.SubjectInvocationHandler; 16 | import cn.ucaner.pattern.structure.proxy.staticProxy.Proxy; 17 | import cn.ucaner.pattern.structure.proxy.staticProxy.RealSuject; 18 | 19 | /** 20 | * @Package:cn.ucaner.pattern.structure.proxy 21 | * @ClassName:ProxyMain 22 | * @Description:

代理模式运行类

23 | * @Author: - 24 | * @CreatTime:2017年10月26日 下午1:45:08 25 | * @Modify By: 26 | * @ModifyTime: 27 | * @Modify marker: 28 | * @version V1.0 29 | */ 30 | public class ProxyMain { 31 | 32 | public static void main(String[] args) { 33 | //静态代理 34 | staticProxy(); 35 | //动态代理 36 | dynamicProxy(); 37 | } 38 | 39 | /** 40 | * 静态代理 41 | */ 42 | private static void staticProxy() { 43 | RealSuject realSuject = new RealSuject(); 44 | Proxy proxy = new Proxy(realSuject); 45 | proxy.request(); 46 | } 47 | 48 | /** 49 | * 动态代理 50 | */ 51 | private static void dynamicProxy(){ 52 | RealSujectImpl realSubject=new RealSujectImpl(); 53 | SubjectInvocationHandler handler=new SubjectInvocationHandler(realSubject); 54 | Subject subject= (Subject) handler.getProxy(); 55 | subject.request(); 56 | } 57 | } -------------------------------------------------------------------------------- /src/cn/ucaner/pattern/structure/proxy/dynamicProxy/RealSujectImpl.java: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * 4 | *

Copyright 1994 JsonInternational

5 | *

All rights reserved.

6 | *

Created on 19941115

7 | *

Created by Jason

8 | * 9 | * 10 | */ 11 | package cn.ucaner.pattern.structure.proxy.dynamicProxy; 12 | 13 | /** 14 | * @Package:cn.ucaner.pattern.structure.proxy.dynamicProxy 15 | * @ClassName:RealSujectImpl 16 | * @Description:

代理模式 - 动态代理真实类

17 | * @Author: - 18 | * @CreatTime:2017年10月26日 下午5:09:51 19 | * @Modify By: 20 | * @ModifyTime: 21 | * @Modify marker: 22 | * @version V1.0 23 | */ 24 | public class RealSujectImpl implements Subject { 25 | 26 | @Override 27 | public void request() { 28 | System.out.println("*** dynamicProxy do request ***"); 29 | } 30 | 31 | } 32 | -------------------------------------------------------------------------------- /src/cn/ucaner/pattern/structure/proxy/dynamicProxy/Subject.java: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * 4 | *

Copyright 1994 JsonInternational

5 | *

All rights reserved.

6 | *

Created on 19941115

7 | *

Created by Jason

8 | * 9 | * 10 | */ 11 | package cn.ucaner.pattern.structure.proxy.dynamicProxy; 12 | 13 | /** 14 | * @Package:cn.ucaner.pattern.structure.proxy.dynamicProxy 15 | * @ClassName:Subject 16 | * @Description:

代理模式 - 动态代理接口类

17 | * @Author: - 18 | * @CreatTime:2017年10月26日 下午5:09:26 19 | * @Modify By: 20 | * @ModifyTime: 21 | * @Modify marker: 22 | * @version V1.0 23 | */ 24 | public interface Subject { 25 | 26 | /** 27 | * dynamicProxy 28 | */ 29 | public abstract void request(); 30 | 31 | } 32 | 33 | -------------------------------------------------------------------------------- /src/cn/ucaner/pattern/structure/proxy/dynamicProxy/SubjectInvocationHandler.java: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * 4 | *

Copyright 1994 JsonInternational

5 | *

All rights reserved.

6 | *

Created on 19941115

7 | *

Created by Jason

8 | * 9 | * 10 | */ 11 | package cn.ucaner.pattern.structure.proxy.dynamicProxy; 12 | 13 | import java.lang.reflect.InvocationHandler; 14 | import java.lang.reflect.Method; 15 | import java.lang.reflect.Proxy; 16 | 17 | /** 18 | * @Package:cn.ucaner.pattern.structure.proxy.dynamicProxy 19 | * @ClassName:SubjectInvocationHandler 20 | * @Description:

动态代理模式 -- 21 | * 利用java.lang.reflect.Proxy类和java.lang.reflect.InvocationHandler接口定义代理类的实现 22 | *

23 | * @Author: - 24 | * @CreatTime:2017年10月26日 下午5:04:37 25 | * @Modify By: 26 | * @ModifyTime: 27 | * @Modify marker: 28 | * @version V1.0 29 | */ 30 | public class SubjectInvocationHandler implements InvocationHandler { 31 | 32 | /** 33 | * 目标对象 34 | */ 35 | private Object target; 36 | 37 | 38 | public SubjectInvocationHandler(Object target) { 39 | this.target = target; 40 | } 41 | 42 | /** 43 | * 描述: 实现调用 44 | */ 45 | @Override 46 | public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { 47 | System.out.println("----Dynamic Proxy invoke method Start ----"); 48 | Object result = method.invoke(target, args);//方法调用 49 | System.out.println("----Dynamic Proxy invoke method End by Jason----"); 50 | return result; 51 | } 52 | 53 | public Object getProxy() { 54 | 55 | //获取当前线程的 classloder 56 | ClassLoader loader = Thread.currentThread().getContextClassLoader(); 57 | 58 | //获取所有的interface 59 | Class[] interfaces = target.getClass().getInterfaces(); 60 | return Proxy.newProxyInstance(loader, interfaces, this); 61 | } 62 | } 63 | -------------------------------------------------------------------------------- /src/cn/ucaner/pattern/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/cn/ucaner/pattern/structure/proxy/staticProxy/Proxy.java: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * 4 | *

Copyright 1994 JsonInternational

5 | *

All rights reserved.

6 | *

Created on 19941115

7 | *

Created by Jason

8 | * 9 | * 10 | */ 11 | package cn.ucaner.pattern.structure.proxy.staticProxy; 12 | 13 | import cn.ucaner.pattern.structure.decorator.decoratorAbs.Decorator; 14 | 15 | /** 16 | * @Package:cn.ucaner.pattern.structure.proxy.staticProxy 17 | * @ClassName:Proxy 18 | * @Description:

代理模式 代理模式代理类,他和装饰器模式的实现有点相近{@link Decorator}

19 | * @Author: - 20 | * @CreatTime:2017年10月26日 下午1:47:45 21 | * @Modify By: 22 | * @ModifyTime: 23 | * @Modify marker: 24 | * @version V1.0 25 | */ 26 | public class Proxy implements Subject { 27 | 28 | private Subject realSuject; 29 | 30 | public Proxy(Subject realSuject) { 31 | this.realSuject = realSuject; 32 | } 33 | 34 | @Override 35 | public void request() { 36 | if(realSuject!=null){ 37 | realSuject.request(); 38 | } 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /src/cn/ucaner/pattern/structure/proxy/staticProxy/RealSuject.java: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * 4 | *

Copyright 1994 JsonInternational

5 | *

All rights reserved.

6 | *

Created on 19941115

7 | *

Created by Jason

8 | * 9 | * 10 | */ 11 | package cn.ucaner.pattern.structure.proxy.staticProxy; 12 | 13 | /** 14 | * @Package:cn.ucaner.pattern.structure.proxy.staticProxy 15 | * @ClassName:RealSuject 16 | * @Description:

代理模式真实类

17 | * @Author: - 18 | * @CreatTime:2017年10月26日 下午1:47:02 19 | * @Modify By: 20 | * @ModifyTime: 21 | * @Modify marker: 22 | * @version V1.0 23 | */ 24 | public class RealSuject implements Subject { 25 | 26 | @Override 27 | public void request() { 28 | System.out.println("*** static proxy do request !By Jason ***"); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /src/cn/ucaner/pattern/structure/proxy/staticProxy/Subject.java: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * 4 | *

Copyright 1994 JsonInternational

5 | *

All rights reserved.

6 | *

Created on 19941115

7 | *

Created by Jason

8 | * 9 | * 10 | */ 11 | package cn.ucaner.pattern.structure.proxy.staticProxy; 12 | 13 | /** 14 | * @Package:cn.ucaner.pattern.structure.proxy.staticProxy 15 | * @ClassName:Subject 16 | * @Description:

static Proxy 代理模式接口类

17 | * @Author: - 18 | * @CreatTime:2017年10月26日 下午1:46:44 19 | * @Modify By: 20 | * @ModifyTime: 21 | * @Modify marker: 22 | * @version V1.0 23 | */ 24 | public interface Subject { 25 | 26 | /** 27 | * static Proxy 28 | */ 29 | void request(); 30 | 31 | } 32 | -------------------------------------------------------------------------------- /src/cn/ucaner/pattern/structure/structure.md: -------------------------------------------------------------------------------- 1 | #结构型设计模式 2 | 3 | |包名|描述| 4 | |---|---| 5 | |proxy|代理模式| --------------------------------------------------------------------------------