├── .gitignore ├── Algorithm ├── Introduction to A star.mdown ├── README.txt ├── gen_code_template.py ├── src │ ├── chapter3 │ │ ├── e1 │ │ │ ├── README.txt │ │ │ ├── solution1.cpp │ │ │ ├── solution1.py │ │ │ ├── solution2.cpp │ │ │ └── solution2.py │ │ ├── e10 │ │ │ ├── README.txt │ │ │ └── solution1.cpp │ │ ├── e11 │ │ │ ├── README.txt │ │ │ └── solution1.cpp │ │ ├── e12 │ │ │ ├── README.txt │ │ │ └── solution1.cpp │ │ ├── e13 │ │ │ ├── README.txt │ │ │ └── solution1.cpp │ │ ├── e14 │ │ │ ├── README.txt │ │ │ └── solution1.cpp │ │ ├── e15 │ │ │ ├── README.txt │ │ │ └── solution1.cpp │ │ ├── e16 │ │ │ ├── README.txt │ │ │ └── solution1.cpp │ │ ├── e17 │ │ │ ├── README.txt │ │ │ └── solution1.cpp │ │ ├── e18 │ │ │ ├── README.txt │ │ │ └── solution1.cpp │ │ ├── e19 │ │ │ ├── README.txt │ │ │ └── solution1.cpp │ │ ├── e2 │ │ │ ├── README.txt │ │ │ └── solution1.cpp │ │ ├── e20 │ │ │ ├── README.txt │ │ │ └── solution1.cpp │ │ ├── e21 │ │ │ ├── README.txt │ │ │ └── solution1.cpp │ │ ├── e22 │ │ │ ├── README.txt │ │ │ └── solution1.cpp │ │ ├── e23 │ │ │ ├── README.txt │ │ │ └── solution1.cpp │ │ ├── e24 │ │ │ ├── README.txt │ │ │ └── solution1.cpp │ │ ├── e25 │ │ │ ├── README.txt │ │ │ └── solution1.cpp │ │ ├── e26 │ │ │ ├── README.txt │ │ │ └── solution1.cpp │ │ ├── e27 │ │ │ ├── README.txt │ │ │ └── solution1.cpp │ │ ├── e28 │ │ │ ├── README.txt │ │ │ └── e28.cpp │ │ ├── e29 │ │ │ ├── README.txt │ │ │ └── e29.cpp │ │ ├── e3 │ │ │ ├── README.txt │ │ │ └── solution1.cpp │ │ ├── e30 │ │ │ ├── README.txt │ │ │ └── e30.cpp │ │ ├── e31 │ │ │ ├── README.txt │ │ │ └── e31.cpp │ │ ├── e32 │ │ │ ├── README.txt │ │ │ └── e32.cpp │ │ ├── e33 │ │ │ ├── README.txt │ │ │ └── e33.cpp │ │ ├── e34 │ │ │ ├── README.txt │ │ │ └── e34.cpp │ │ ├── e35 │ │ │ ├── README.txt │ │ │ └── e35.kt │ │ ├── e36 │ │ │ ├── README.txt │ │ │ └── e36.kt │ │ ├── e37 │ │ │ ├── README.txt │ │ │ └── e37.kt │ │ ├── e38 │ │ │ ├── README.txt │ │ │ └── e38.kt │ │ ├── e39 │ │ │ ├── README.txt │ │ │ └── e39.kt │ │ ├── e4 │ │ │ ├── README.txt │ │ │ └── solution1.cpp │ │ ├── e40 │ │ │ ├── README.txt │ │ │ └── e40.kt │ │ ├── e41 │ │ │ ├── README.txt │ │ │ └── e41.kt │ │ ├── e5 │ │ │ ├── README.txt │ │ │ ├── solution1.cpp │ │ │ └── solution2.cpp │ │ ├── e6 │ │ │ ├── README.txt │ │ │ └── solution1.cpp │ │ ├── e7 │ │ │ ├── README.txt │ │ │ ├── solution1.cpp │ │ │ └── solution2.cpp │ │ ├── e8 │ │ │ ├── README.txt │ │ │ └── solution1.cpp │ │ └── e9 │ │ │ ├── README.txt │ │ │ └── solution1.cpp │ └── chapter4 │ │ ├── e1 │ │ ├── README.txt │ │ └── e1.kt │ │ ├── e10 │ │ ├── README.txt │ │ └── e10.kt │ │ ├── e11 │ │ ├── README.txt │ │ └── e11.kt │ │ ├── e12 │ │ ├── README.txt │ │ └── e12.kt │ │ ├── e13 │ │ ├── README.txt │ │ └── e13.kt │ │ ├── e14 │ │ ├── Main.java │ │ ├── README.txt │ │ └── e14.kt │ │ ├── e15 │ │ ├── README.txt │ │ └── e15.kt │ │ ├── e16 │ │ ├── README.txt │ │ └── e16.kt │ │ ├── e17 │ │ ├── README.txt │ │ └── e17.kt │ │ ├── e18 │ │ ├── README.txt │ │ └── e18.kt │ │ ├── e19 │ │ ├── README.txt │ │ └── e19.kt │ │ ├── e2 │ │ ├── README.txt │ │ └── e2.kt │ │ ├── e20 │ │ ├── README.txt │ │ └── e20.kt │ │ ├── e21 │ │ ├── README.txt │ │ └── e21.kt │ │ ├── e22 │ │ ├── README.txt │ │ └── e22.kt │ │ ├── e23 │ │ ├── README.txt │ │ └── e23.kt │ │ ├── e24 │ │ ├── README.txt │ │ └── e24.kt │ │ ├── e25 │ │ ├── README.txt │ │ ├── e25.c │ │ └── e25.kt │ │ ├── e26 │ │ ├── README.txt │ │ └── e26.c │ │ ├── e27 │ │ └── README.txt │ │ ├── e3 │ │ ├── README.txt │ │ └── e3.kt │ │ ├── e4 │ │ ├── README.txt │ │ └── e4.kt │ │ ├── e5 │ │ ├── README.txt │ │ └── e5.kt │ │ ├── e6 │ │ └── README.txt │ │ ├── e7 │ │ ├── README.txt │ │ └── e7.kt │ │ ├── e8 │ │ ├── README.txt │ │ └── e8.kt │ │ └── e9 │ │ ├── README.txt │ │ └── e9.kt └── 算法设计与分析笔记.mdown ├── Android ├── 15 个 Android 通用流行框架大全.md ├── 4 行代码实现 Android 快速文件下载.md ├── Android Design Support Library 兼容库使用详解 │ └── Android Design Support Library 兼容库使用详解.md ├── Android Service 通信 │ ├── Android Service 通信.md │ └── AndroidStudy_Service │ │ ├── .gitignore │ │ ├── .idea │ │ ├── .name │ │ ├── compiler.xml │ │ ├── copyright │ │ │ └── profiles_settings.xml │ │ ├── gradle.xml │ │ ├── misc.xml │ │ ├── modules.xml │ │ ├── runConfigurations.xml │ │ └── vcs.xml │ │ ├── AndroidStudy_Service.iml │ │ ├── app │ │ ├── .gitignore │ │ ├── app.iml │ │ ├── build.gradle │ │ ├── proguard-rules.pro │ │ └── src │ │ │ ├── androidTest │ │ │ └── java │ │ │ │ └── com │ │ │ │ └── yangruihan │ │ │ │ └── androidstudy_service │ │ │ │ └── ApplicationTest.java │ │ │ ├── main │ │ │ ├── AndroidManifest.xml │ │ │ ├── java │ │ │ │ └── com │ │ │ │ │ └── yangruihan │ │ │ │ │ └── androidstudy_service │ │ │ │ │ ├── MainActivity.java │ │ │ │ │ └── MyService.java │ │ │ └── res │ │ │ │ ├── layout │ │ │ │ └── activity_main.xml │ │ │ │ ├── menu │ │ │ │ └── menu_main.xml │ │ │ │ ├── mipmap-hdpi │ │ │ │ └── ic_launcher.png │ │ │ │ ├── mipmap-mdpi │ │ │ │ └── ic_launcher.png │ │ │ │ ├── mipmap-xhdpi │ │ │ │ └── ic_launcher.png │ │ │ │ ├── mipmap-xxhdpi │ │ │ │ └── ic_launcher.png │ │ │ │ ├── mipmap-xxxhdpi │ │ │ │ └── ic_launcher.png │ │ │ │ ├── values-v21 │ │ │ │ └── styles.xml │ │ │ │ ├── values-w820dp │ │ │ │ └── dimens.xml │ │ │ │ └── values │ │ │ │ ├── colors.xml │ │ │ │ ├── dimens.xml │ │ │ │ ├── strings.xml │ │ │ │ └── styles.xml │ │ │ └── test │ │ │ └── java │ │ │ └── com │ │ │ └── yangruihan │ │ │ └── androidstudy_service │ │ │ └── ExampleUnitTest.java │ │ ├── build.gradle │ │ ├── gradle.properties │ │ ├── gradle │ │ └── wrapper │ │ │ ├── gradle-wrapper.jar │ │ │ └── gradle-wrapper.properties │ │ ├── gradlew │ │ ├── gradlew.bat │ │ └── settings.gradle ├── Android编程规范不完全指南.md ├── Android退出应用最优雅的方式.mdown └── Android面试经验总结.mdown ├── Backup └── config │ ├── .tmux.conf │ ├── .tmux.conf.green │ ├── .tmux.conf2 │ ├── .vimrc │ ├── .vimrc_new │ ├── .zshrc │ └── sougo_short.ini ├── Blender └── Blender快捷键.md ├── Build ├── build.py ├── config.json └── template.txt ├── C# └── async_await的前世今生.md ├── C++ ├── C、C++中#和##的用法.md └── gdb快捷键.md ├── C ├── 10个经典的C语言小程序.mdown ├── C.md ├── C中setjmp和longjmp.md └── C问题与技巧.md ├── CEP ├── CEP笔记.md ├── Clipboard.jsx ├── HelloWorld.jsx ├── History.jsx ├── LayerTest.jsx ├── Selection.jsx └── images │ ├── p1.png │ ├── p2.png │ ├── p3.png │ └── p4.png ├── CMake ├── CMake CPP 模板.md ├── CMake Link macos Framework.md └── CMake自定义命令.md ├── Compiler ├── src │ ├── c2 │ │ ├── c2.py │ │ └── c2_2.py │ └── c3 │ │ ├── lex.l │ │ └── lex.yy.c └── 《编译原理》笔记.md ├── ComputerOrganization └── 重点.mdown ├── DataStruct ├── List │ ├── C │ │ └── List.c │ ├── Java │ │ ├── LinkListTest.java │ │ └── SqListTest.java │ └── Python │ │ ├── list.py │ │ └── list_test.py ├── Map │ ├── C │ │ └── Map.c │ └── Java │ │ ├── GraphAdjListTest.java │ │ └── MGraphTest.java ├── README.md ├── Stack_Queue │ ├── C │ │ ├── Queue.c │ │ └── Stack.c │ └── Java │ │ ├── LinkQueueTest.java │ │ ├── LinkStackTest.java │ │ ├── SqQueueTest.java │ │ └── SqStackTest.java ├── String │ └── Java │ │ └── KMPTest.java └── Tree │ ├── C │ ├── BinaryTree.c │ └── Tree.c │ └── Java │ └── BinaryTreeTest.java ├── Database └── Oracle DB笔记.md ├── DesignPattern ├── README.md ├── src │ └── com │ │ └── yrh │ │ ├── pattern │ │ ├── abstract_factory_pattern │ │ │ ├── README.md │ │ │ └── src │ │ │ │ ├── Client.java │ │ │ │ ├── ConcreteFactory1.java │ │ │ │ ├── ConcreteFactory2.java │ │ │ │ ├── Factory.java │ │ │ │ ├── ProductA.java │ │ │ │ ├── ProductA1.java │ │ │ │ ├── ProductA2.java │ │ │ │ ├── ProductB.java │ │ │ │ ├── ProductB1.java │ │ │ │ └── ProductB2.java │ │ ├── adapter_pattern │ │ │ ├── README.md │ │ │ └── src │ │ │ │ ├── Adaptee.java │ │ │ │ ├── Adapter.java │ │ │ │ ├── Client.java │ │ │ │ └── Target.java │ │ ├── bridge_pattern │ │ │ ├── README.md │ │ │ └── src │ │ │ │ ├── Abstraction.java │ │ │ │ ├── Client.java │ │ │ │ ├── ConcreteImplementorA.java │ │ │ │ ├── ConcreteImplementorB.java │ │ │ │ ├── Implementor.java │ │ │ │ └── RefinedAbstraction.java │ │ ├── builder_pattern │ │ │ ├── README.md │ │ │ └── src │ │ │ │ ├── Builder.java │ │ │ │ ├── Client.java │ │ │ │ ├── ConcreteBuilder1.java │ │ │ │ ├── ConcreteBuilder2.java │ │ │ │ ├── Director.java │ │ │ │ └── Product.java │ │ ├── chain_of_responsibility_pattern │ │ │ ├── README.md │ │ │ └── src │ │ │ │ ├── Client.java │ │ │ │ ├── ConcreteHandler1.java │ │ │ │ ├── ConcreteHandler2.java │ │ │ │ ├── ConcreteHandler3.java │ │ │ │ └── Handler.java │ │ ├── command_pattern │ │ │ ├── README.md │ │ │ └── src │ │ │ │ ├── Client.java │ │ │ │ ├── Command.java │ │ │ │ ├── ConcreteCommand.java │ │ │ │ ├── Invoker.java │ │ │ │ └── Receiver.java │ │ ├── composite_pattern │ │ │ ├── README.md │ │ │ └── src │ │ │ │ ├── Client.java │ │ │ │ ├── Component.java │ │ │ │ ├── Composite.java │ │ │ │ └── Leaf.java │ │ ├── decorator_pattern │ │ │ ├── README.md │ │ │ └── src │ │ │ │ ├── BoardShoes.java │ │ │ │ ├── Client.java │ │ │ │ ├── Finery.java │ │ │ │ ├── Jeans.java │ │ │ │ ├── Person.java │ │ │ │ └── TShirts.java │ │ ├── facade_pattern │ │ │ ├── README.md │ │ │ └── src │ │ │ │ ├── Client.java │ │ │ │ ├── Facade.java │ │ │ │ ├── SubSystemOne.java │ │ │ │ ├── SubSystemThree.java │ │ │ │ └── SubSystemTwo.java │ │ ├── factory_method_pattern │ │ │ ├── README.md │ │ │ └── src │ │ │ │ ├── Client.java │ │ │ │ ├── Factory.java │ │ │ │ ├── Leifeng.java │ │ │ │ ├── Undergraduate.java │ │ │ │ ├── UndergraduateFactory.java │ │ │ │ ├── Volunteer.java │ │ │ │ └── VolunteerFactory.java │ │ ├── flyweight_pattern │ │ │ ├── README.md │ │ │ └── src │ │ │ │ ├── Client.java │ │ │ │ ├── ConcreteFlyweight.java │ │ │ │ ├── Flyweight.java │ │ │ │ ├── FlyweightFactory.java │ │ │ │ └── UnsharedConcreteFlyweight.java │ │ ├── interpreter_pattern │ │ │ ├── README.md │ │ │ └── src │ │ │ │ ├── AbstractExpression.java │ │ │ │ ├── Client.java │ │ │ │ ├── Context.java │ │ │ │ ├── NonterminalExpression.java │ │ │ │ └── TerminalExpression.java │ │ ├── iterator_pattern │ │ │ ├── README.md │ │ │ └── src │ │ │ │ ├── Aggregate.java │ │ │ │ ├── Client.java │ │ │ │ ├── ConcreteAggregate.java │ │ │ │ ├── ConcreteIterator.java │ │ │ │ └── Iterator.java │ │ ├── mediator_pattern │ │ │ ├── README.md │ │ │ └── src │ │ │ │ ├── Client.java │ │ │ │ ├── Colleague.java │ │ │ │ ├── ConcreteColleague1.java │ │ │ │ ├── ConcreteColleague2.java │ │ │ │ ├── ConcreteMediator.java │ │ │ │ └── Mediator.java │ │ ├── memento_pattern │ │ │ ├── README.md │ │ │ └── src │ │ │ │ ├── Caretaker.java │ │ │ │ ├── Memento.java │ │ │ │ └── Originator.java │ │ ├── observer_pattern │ │ │ ├── README.md │ │ │ └── src │ │ │ │ ├── Client.java │ │ │ │ ├── ConcreteObserver.java │ │ │ │ ├── ConcreteSubject.java │ │ │ │ ├── Observer.java │ │ │ │ └── Subject.java │ │ ├── prototype_pattern │ │ │ ├── README.md │ │ │ └── src │ │ │ │ ├── Client.java │ │ │ │ ├── ConcretePrototype.java │ │ │ │ └── Prototype.java │ │ ├── proxy_pattern │ │ │ ├── README.md │ │ │ └── src │ │ │ │ ├── Client.java │ │ │ │ ├── Proxy.java │ │ │ │ ├── RealSubject.java │ │ │ │ └── Subject.java │ │ ├── simple_factory_pattern │ │ │ ├── README.md │ │ │ └── src │ │ │ │ ├── Client.java │ │ │ │ ├── OperationFactory.java │ │ │ │ └── operation │ │ │ │ ├── Operation.java │ │ │ │ ├── OperationAdd.java │ │ │ │ ├── OperationDiv.java │ │ │ │ ├── OperationMul.java │ │ │ │ ├── OperationPow.java │ │ │ │ └── OperationSub.java │ │ ├── singleton_pattern │ │ │ ├── README.md │ │ │ └── src │ │ │ │ ├── Client.java │ │ │ │ ├── ClientMultiProcess.java │ │ │ │ ├── Singleton.java │ │ │ │ └── SingletonMultiProcess.java │ │ ├── state_pattern │ │ │ ├── README.md │ │ │ └── src │ │ │ │ ├── Client.java │ │ │ │ ├── ConcreteStateA.java │ │ │ │ ├── ConcreteStateB.java │ │ │ │ ├── Context.java │ │ │ │ └── State.java │ │ ├── strategy_pattern │ │ │ ├── README.md │ │ │ └── src │ │ │ │ ├── CashContext.java │ │ │ │ ├── CashNormal.java │ │ │ │ ├── CashRebate.java │ │ │ │ ├── CashReturn.java │ │ │ │ ├── CashSuper.java │ │ │ │ └── Client.java │ │ ├── template_method_pattern │ │ │ ├── README.md │ │ │ └── src │ │ │ │ ├── AbstractClass.java │ │ │ │ ├── Client.java │ │ │ │ ├── ConcreteClassA.java │ │ │ │ └── ConcreteClassB.java │ │ └── visitor_pattern │ │ │ ├── README.md │ │ │ └── src │ │ │ ├── Client.java │ │ │ ├── ConcreteElementA.java │ │ │ ├── ConcreteElementB.java │ │ │ ├── ConcreteVisitor1.java │ │ │ ├── ConcreteVisitor2.java │ │ │ ├── Element.java │ │ │ ├── ObjectStructure.java │ │ │ └── Visitor.java │ │ └── principle │ │ ├── CARP │ │ └── README.md │ │ ├── dependence_inversion_principle │ │ └── README.md │ │ ├── law_of_demeter_principle │ │ └── README.md │ │ ├── liskov_substitution_principle │ │ └── README.md │ │ ├── open_closed_principle │ │ ├── About.md │ │ └── README.md │ │ └── single_responsibility_principle │ │ ├── About.md │ │ └── README.md └── 设计模式复习笔记.md ├── Emacs ├── Emacs快捷键列表.md ├── Emacs配置说明.md ├── Markdown-mode说明.md ├── config │ ├── __emacs2 │ ├── _emacs │ ├── init.el │ ├── init10.el │ ├── init11.el │ ├── init2.el │ ├── init3.el │ ├── init4.el │ ├── init5.el │ ├── init6.el │ ├── init7.el │ ├── init8.el │ └── init9.el └── scripts │ └── em.py ├── GameDevelopment ├── .DS_Store ├── GameDesign │ ├── 动态音频.md │ ├── 半条命中的隐形教程.md │ ├── 如何分析游戏.md │ └── 游戏机制对体验与情感的影响.md ├── GameDevelop │ ├── 2D_images │ │ ├── 2d_01.png │ │ ├── 2d_02.png │ │ ├── 2d_03.png │ │ ├── 2d_04.png │ │ ├── 2d_05.png │ │ └── 2d_06.png │ ├── AStar算法介绍.md │ ├── AStar算法实现.md │ ├── Codes │ │ └── AStar算法实现 │ │ │ ├── implementation.cpp │ │ │ ├── implementation.py │ │ │ └── main.py │ ├── ECS架构概述.md │ ├── Unity3D中的内存管理.md │ ├── Unreal Engine │ │ ├── Images │ │ │ ├── 1_1.png │ │ │ ├── 1_10.png │ │ │ ├── 1_11.png │ │ │ ├── 1_2.png │ │ │ ├── 1_3.png │ │ │ ├── 1_4.png │ │ │ ├── 1_5.png │ │ │ ├── 1_6.png │ │ │ ├── 1_7.png │ │ │ ├── 1_8.png │ │ │ └── 1_9.png │ │ └── UnrealEngine学习笔记.md │ ├── 【翻译】2D 可见性.md │ └── 程序华随机地牢生成1.md ├── Images │ ├── Ecs_001.png │ ├── Ecs_002.png │ ├── Ecs_003.png │ ├── Ecs_004.png │ ├── Ecs_arch.png │ ├── as_1.png │ ├── as_10_1.png │ ├── as_10_2.png │ ├── as_10_3.png │ ├── as_10_4.png │ ├── as_11_1.png │ ├── as_11_2.png │ ├── as_11_3.png │ ├── as_11_4.png │ ├── as_11_5.png │ ├── as_11_6.png │ ├── as_12.png │ ├── as_13.png │ ├── as_2.png │ ├── as_3.png │ ├── as_3_1.png │ ├── as_4_1.png │ ├── as_4_2.png │ ├── as_4_3.png │ ├── as_4_4.png │ ├── as_5_1.png │ ├── as_5_2.png │ ├── as_5_3.png │ ├── as_5_4.png │ ├── as_6.png │ ├── as_7.png │ ├── as_8.png │ ├── as_9_1.png │ ├── as_9_2.png │ ├── as_9_3.png │ ├── as_9_4.png │ ├── as_9_5.png │ ├── as_code_1.png │ ├── as_code_2.png │ ├── as_code_3.png │ ├── as_code_4.png │ ├── as_code_5.png │ ├── as_code_6.png │ ├── as_code_7.png │ ├── as_code_8.png │ └── asi_1.png └── README.md ├── GameEngineArchitecture └── 《游戏引擎架构》笔记.md ├── Git ├── Git SSH Key 生成并添加到 Github 步骤.md ├── push到github时每次都要输入用户名和密码的问题.mdown ├── 如何在一台电脑使用多个github账号.md └── 日常使用 Git 的 19 个建议.mdown ├── Google Study jam ├── Android_study_1a.mdown ├── Android_study_1b.mdown ├── Android_study_2a.mdown ├── Android_study_2b.mdown ├── Android_study_3a.mdown ├── Android_study_3b.mdown ├── GoogleIntroduction │ ├── .gitignore │ ├── .idea │ │ ├── .name │ │ ├── compiler.xml │ │ ├── copyright │ │ │ └── profiles_settings.xml │ │ ├── encodings.xml │ │ ├── gradle.xml │ │ ├── misc.xml │ │ ├── modules.xml │ │ └── runConfigurations.xml │ ├── app │ │ ├── .gitignore │ │ ├── build.gradle │ │ ├── proguard-rules.pro │ │ └── src │ │ │ ├── androidTest │ │ │ └── java │ │ │ │ └── cn │ │ │ │ └── studyjams │ │ │ │ └── s1 │ │ │ │ └── sj23 │ │ │ │ └── yangruihan │ │ │ │ └── ApplicationTest.java │ │ │ ├── main │ │ │ ├── AndroidManifest.xml │ │ │ ├── java │ │ │ │ └── cn │ │ │ │ │ └── studyjams │ │ │ │ │ └── s1 │ │ │ │ │ └── sj23 │ │ │ │ │ └── yangruihan │ │ │ │ │ ├── IntroCultureActivity.java │ │ │ │ │ ├── IntroDisputeActivity.java │ │ │ │ │ ├── IntroFaultActivity.java │ │ │ │ │ ├── IntroHistoryActivity.java │ │ │ │ │ ├── IntroProductActivity.java │ │ │ │ │ └── MainActivity.java │ │ │ └── res │ │ │ │ ├── drawable │ │ │ │ └── google_logo.png │ │ │ │ ├── layout │ │ │ │ ├── activity_intro_culture.xml │ │ │ │ ├── activity_intro_dispute.xml │ │ │ │ ├── activity_intro_fault.xml │ │ │ │ ├── activity_intro_history.xml │ │ │ │ ├── activity_intro_product.xml │ │ │ │ └── activity_main.xml │ │ │ │ ├── mipmap-hdpi │ │ │ │ └── ic_launcher.png │ │ │ │ ├── mipmap-mdpi │ │ │ │ └── ic_launcher.png │ │ │ │ ├── mipmap-xhdpi │ │ │ │ └── ic_launcher.png │ │ │ │ ├── mipmap-xxhdpi │ │ │ │ └── ic_launcher.png │ │ │ │ ├── mipmap-xxxhdpi │ │ │ │ └── ic_launcher.png │ │ │ │ ├── values-w820dp │ │ │ │ └── dimens.xml │ │ │ │ └── values │ │ │ │ ├── colors.xml │ │ │ │ ├── dimens.xml │ │ │ │ ├── strings.xml │ │ │ │ └── styles.xml │ │ │ └── test │ │ │ └── java │ │ │ └── cn │ │ │ └── studyjams │ │ │ └── s1 │ │ │ └── sj23 │ │ │ └── yangruihan │ │ │ └── ExampleUnitTest.java │ ├── build.gradle │ ├── gradle.properties │ ├── gradle │ │ └── wrapper │ │ │ ├── gradle-wrapper.jar │ │ │ └── gradle-wrapper.properties │ ├── gradlew │ ├── gradlew.bat │ └── settings.gradle ├── PS1_PubLearn.mdown └── PS2.mdown ├── Gradle └── Gradle:新一代自动化构建工具.mdown ├── Image ├── 8种排序之间的关系.png ├── 冒泡排序.png ├── 基数排序.jpg ├── 堆排序-交换.jpg ├── 堆排序-交换2.jpg ├── 堆排序-建堆.jpg ├── 希尔排序.png ├── 归并排序.jpg ├── 快速排序.jpg ├── 数值类型之间的合法转换图.png ├── 直接插入排序实例.png └── 简单选择排序.png ├── Interview └── 判断一个单链表是否有环及环的链接点.md ├── Java ├── 10个精妙的Java编码最佳实践.txt ├── Java Class 字节码文件结构详解.md ├── Java IO │ ├── File.mdown │ └── Java IO 流以及装饰器模式在其上的运用.mdown ├── Java Socket编程入门.md ├── Java 中的锁.md ├── Java 内部类的一些总结.md ├── Java 垃圾回收机制.md ├── Java 注解全面解析.md ├── Java 直接(堆外)内存使用详解.md ├── Java 读取文件夹大小的6种方法及代码.mdown ├── Java 静态方法何时使用.md ├── Java中的弱引用详解.mdown ├── Java中需要注意的小细节.mdown ├── Java动态代理(JDK和cglib).md ├── Java字符串的10大问题盘点.mdown ├── Java接口回调机制详解 │ ├── Java接口回调机制详解.mdown │ └── src │ │ └── Test.java ├── Java程序员常用的10大构建工具.md ├── Java程序员必须掌握的8大排序算法 │ ├── Java程序员必须掌握的8大排序算法.mdown │ └── src │ │ ├── BubbleSort.java │ │ ├── HeapSort.java │ │ ├── InsertionSorting.java │ │ ├── MergeSort.java │ │ ├── QuickSort.java │ │ ├── RadixSort.java │ │ ├── SelectionSort.java │ │ └── ShellSort.java ├── Java类的生命周期详解 │ ├── 1.png │ └── Java类的生命周期详解.mdown ├── Java语法糖之foreach.md ├── SLF4J - Profiling.md ├── 《Java核心技术》笔记 │ └── 《Java核心技术》回顾笔记.mdown └── 如何避免if else.md ├── Linux ├── Java 开发必会的 Linux 命令.mdown ├── Linux 学习笔记.mdown ├── Linux操作系统基础知识学习.mdown ├── Ubuntu 下推荐的软件.mdown └── debian_install.sh ├── Lisp ├── lisp笔记.md ├── path-lib │ ├── packages.lisp │ └── path-lib.lisp └── test-case │ └── test-case.lisp ├── Lua ├── Lua_Source_Internal │ ├── README.md │ ├── doc │ │ ├── ch02-Lua中的数据类型.md │ │ └── ch02-Lua字符串类型.md │ └── pic │ │ ├── ch02-1-1.png │ │ ├── ch02-1-2.png │ │ ├── ch02-2-1.png │ │ ├── ch02-2-2.png │ │ └── ch02-2-3.png ├── Lua模式匹配.md └── Lua注意事项.md ├── ML └── ML-For-Beginners.md ├── Mac ├── Homebrew │ ├── brew install 失败.md │ └── brew update 失败.md ├── Mac环境搭建.md ├── OS X 支持 NTFS 读写.mdown ├── OS X下设置终端不同类型文件显示不同颜色方法.mdown └── Tmux 速成教程:技巧和调整 │ ├── Tmux 速成教程:技巧和调整.mdown │ └── image │ ├── 1.jpg │ ├── 10.jpg │ ├── 2.jpg │ ├── 3.jpg │ ├── 4.jpg │ ├── 5.jpg │ ├── 6.jpg │ ├── 7.jpg │ ├── 8.jpg │ └── 9.jpg ├── Markdown └── Markdown入门.md ├── Network ├── HTTP Header详解.md └── 计算机网络复习笔记.md ├── OpenGL └── 《计算机图形学》笔记 │ ├── README.md │ └── src │ ├── README.md │ ├── dda_algorithm.py │ ├── draw_line.py │ ├── rotating_cube.py │ ├── rotating_cube_2.py │ ├── rotating_triangle.py │ ├── sierpinski_2d_point.py │ ├── sierpinski_2d_surface.py │ ├── sierpinski_3d_point.py │ ├── sierpinski_3d_surface.py │ ├── sierpinski_3d_tetrahedron.py │ ├── simple.py │ ├── simple_2.py │ ├── simple_draw_rect_mouse_down.py │ ├── simple_draw_rect_mouse_move.py │ ├── simple_menu.py │ └── simple_mouse_event.py ├── OperatingSystem └── 操作系统知识点.mdown ├── Others ├── ARM 嵌入式系统复习笔记.md ├── 编程字体下载.mdown └── 软件项目管理复习笔记.md ├── ProgrammingLanguage └── book │ ├── cal_2 │ ├── lexicalanalyzer.c │ ├── mycal │ ├── parser.c │ └── token.h │ └── calc │ ├── mycalc.l │ └── mycalc.y ├── Python ├── 10行Python代码写的模糊查询.mdown ├── Python 序列化模型数据为 JSON.md ├── PythonLearnNote.md ├── Pythonista 容易忽略的python编程方式.md ├── Python字符串的格式化.md ├── Python实现控制台中的进度条.mdown ├── Python的函数式编程.md ├── Python通用邮件发送(smtplib).mdown ├── Python高效编程小技巧.md ├── python——with语句和上下文管理器ContextManager.md ├── python——with语句和上下文管理器ContextManager.org └── 一些实用的python小建议.md ├── PythonUtils └── py_progressbar │ ├── README.md │ ├── __init__.py │ └── progress_bar.py ├── README.md ├── ROS ├── ROS命令集.md └── Ubuntu 14.04 中安装 opencv2.4.9.md ├── RegularExpression ├── 匹配字符串.md └── 最全的常用正则表达式大全.mdown ├── Rust └── RustBook学习笔记.md ├── SDL └── 常见错误.md ├── SVN ├── SVN版本管理:两种开发模式.md └── 命令行配置全局忽略.md ├── Scripts ├── .tmux.conf ├── SS │ ├── bbr.sh │ ├── shadowsocksR.sh │ └── ssr.sh ├── all_git_pull.py ├── auto_install_for_ubuntu1604.sh ├── auto_t.py ├── clip.py ├── git_add_commit_push.sh ├── sources.list └── update.sh ├── Sublime Text ├── Preferences.txt ├── Sublime text3 常见快捷键.md └── SublimeText3常用插件.md ├── Tmux └── conf ├── Unity3D ├── ECS │ ├── ECS.md │ └── ECS启动流程.drawio ├── Understanding FixedUpdate, FixedTimeStep and Maximum Allowed Timestep in Unity.md ├── Unity 3D 学习笔记.md ├── Unity 3D 快捷键.md ├── Unity 背景动态模糊(blur)和截屏方法(转).md ├── Unity 资源的优化管理.md ├── Unity3D 动画介绍.md ├── Unity3D 学习资源.md ├── Unity3D 项目架构设计与开发管理.md ├── Unity3d 工具分享——uGUI Text组件文本匹配.md ├── image_res │ ├── animation_missing_1.png │ ├── animation_missing_2.png │ ├── animation_missing_3.png │ ├── animation_missing_4.png │ ├── animation_missing_5.png │ ├── animation_missing_6.png │ ├── animation_missing_7.png │ ├── u3d-1-1.jpg │ ├── u3d-1-2.jpg │ ├── u3d_tool_text_match_1.png │ └── u3d_tool_text_match_2.gif ├── uGUI 系统的介绍.md ├── 使用 NUnit 为 Unity3D 编写高质量单元测试的思考(转).md ├── 查找Prefab资源引用.md └── 解决由于层级变动导致动画引用Missing问题.md ├── Unreal ├── UE 视频资源.md └── Unreal源代码阅读笔记.md ├── VSCode └── macOS问题汇总.md └── Vim ├── Vim快捷键整理.md └── vimrc /.gitignore: -------------------------------------------------------------------------------- 1 | __pycache__ 2 | .vscode -------------------------------------------------------------------------------- /Algorithm/Introduction to A star.mdown: -------------------------------------------------------------------------------- 1 | [阅读原文](http://www.redblobgames.com/pathfinding/a-star/introduction.html) -------------------------------------------------------------------------------- /Algorithm/README.txt: -------------------------------------------------------------------------------- 1 | 此笔记是本人学校课程笔记,基于《算法设计与分析》(第三版) -------------------------------------------------------------------------------- /Algorithm/src/chapter3/e1/README.txt: -------------------------------------------------------------------------------- 1 | 求1/1!-1/3!+1/5!-1/7!+...+(-1)^(n+1)/(2*n-1)! -------------------------------------------------------------------------------- /Algorithm/src/chapter3/e1/solution1.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | int main(int argc, char const *argv[]) 4 | { 5 | int sign, n; 6 | float s = 1, t; 7 | 8 | scanf("%d", &n); 9 | // 循环累加 10 | for(int i = 2; i <= n; i++) 11 | { 12 | // 求阶乘 13 | t = 1; 14 | for(int j = 2; j <= 2 * i - 1; j++) t *= j; 15 | 16 | // 求符号 17 | sign = 1; 18 | for(int j = 1; j <= i + 1; j++) sign *= (-1); 19 | 20 | // 累加 21 | s += sign / t; 22 | } 23 | 24 | printf("%.10f\n", s); 25 | 26 | return 0; 27 | } -------------------------------------------------------------------------------- /Algorithm/src/chapter3/e1/solution1.py: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8 -*- 2 | def main(): 3 | n = raw_input() 4 | s = 1.0 5 | for i in range(2, int(n) + 1): 6 | # 求阶乘 7 | t = reduce(lambda x, y: x * y, range(2, 2 * i)) * 1.0 8 | # 求符号 9 | sign = 1 if (i + 1) % 2 == 0 else -1 10 | s += sign / t 11 | print s 12 | 13 | if __name__ == '__main__': 14 | main() -------------------------------------------------------------------------------- /Algorithm/src/chapter3/e1/solution2.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | /** 4 | * 在 solution1 上进行优化,阶乘不需要全部算完,并且正负标记也不需要循环求得 5 | **/ 6 | int main(int argc, char const *argv[]) 7 | { 8 | int n, sign; 9 | float s, t = 1; 10 | 11 | scanf("%d", &n); 12 | s = 1; 13 | sign = 1; 14 | for (int i = 2; i <= n; ++i) 15 | { 16 | sign *= -1; 17 | t *= (2 * i - 2) * (2 * i - 1); 18 | s += sign / t; 19 | } 20 | 21 | printf("%.10f\n", s); 22 | return 0; 23 | } -------------------------------------------------------------------------------- /Algorithm/src/chapter3/e1/solution2.py: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8 -*- 2 | def main(): 3 | n = int(raw_input()) 4 | sign = 1 5 | t = 1.0 6 | s = 1.0 7 | for i in range(2, n + 1): 8 | sign *= -1 9 | t *= (2 * i - 2) * (2 * i - 1) 10 | s += sign / t 11 | print s 12 | 13 | if __name__ == '__main__': 14 | main() -------------------------------------------------------------------------------- /Algorithm/src/chapter3/e10/README.txt: -------------------------------------------------------------------------------- 1 | 找出n个自然数(1, 2, 3, ... , n)中取r个数的组合。例如,当n=5,r=3时,所有组合有: 2 | 1 2 3 3 | 1 2 4 4 | 1 2 5 5 | 1 3 4 6 | 1 3 5 7 | 1 4 5 8 | 2 3 4 9 | 2 3 5 10 | 2 4 5 11 | 3 4 5 12 | total=10{组合的总数} 13 | -------------------------------------------------------------------------------- /Algorithm/src/chapter3/e10/solution1.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | int a[100]; 4 | 5 | /** 6 | * 从n个数中选出m个 7 | */ 8 | void f(int m, int k) 9 | { 10 | for (int i = m; i >= k; --i) 11 | { 12 | a[k] = i; 13 | if(k > 1) f(i - 1, k - 1); 14 | else 15 | { 16 | for(int j = a[0]; j > 0; --j) 17 | printf("%d\t", a[j]); 18 | printf("\n"); 19 | } 20 | } 21 | } 22 | 23 | int main(int argc, char* argv[]) 24 | { 25 | int n, r; 26 | scanf("%d%d", &n, &r); 27 | if(r > n) 28 | printf("Input Error"); 29 | else 30 | { 31 | a[0] = r; 32 | f(n, r); 33 | } 34 | return 0; 35 | } 36 | -------------------------------------------------------------------------------- /Algorithm/src/chapter3/e11/README.txt: -------------------------------------------------------------------------------- 1 | 某校决定由全校学生选举自己的学生会主席。有5个候选人,编号分别为1,2,3,4,5,选举其中一人为学生会主席,每个学生一张选票,只能填写一个人。请编程完成统计选票的工作。 2 | -------------------------------------------------------------------------------- /Algorithm/src/chapter3/e11/solution1.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | int main(int argc, char* argv[]) 4 | { 5 | int a[5] = {0, 0, 0, 0, 0}; 6 | int n; 7 | scanf("%d", &n); 8 | while(n != -1) 9 | { 10 | if (n > 0 && n <= 5) a[n - 1]++; 11 | else printf("invalid"); 12 | scanf("%d", &n); 13 | } 14 | for(int i = 0; i < 5; i++) 15 | printf("%d:%d\t", i + 1, a[i]); 16 | return 0; 17 | } 18 | -------------------------------------------------------------------------------- /Algorithm/src/chapter3/e12/README.txt: -------------------------------------------------------------------------------- 1 | 编程统计身高(单位为厘米)。统计分150~154、155~159、160~164、165~169、170~174、175~179、低于150和高于179,共8档次进行。 2 | -------------------------------------------------------------------------------- /Algorithm/src/chapter3/e12/solution1.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | int main(int argc, char* argv[]) 4 | { 5 | int height, a[8] = {0}; 6 | scanf("%d", &height); 7 | while(height != -1) 8 | { 9 | if(height > 179) a[7]++; 10 | else if(height < 150) a[0]++; 11 | else a[height / 5 - 29]++; 12 | scanf("%d", &height); 13 | } 14 | 15 | for(int i = 0; i < 8; ++i) 16 | printf("%d\t", a[i]); 17 | 18 | return 0; 19 | } 20 | -------------------------------------------------------------------------------- /Algorithm/src/chapter3/e13/README.txt: -------------------------------------------------------------------------------- 1 | 一次考试共考了语文、代数和外语3科。某小组共有9人,考后各科及格名单如下表,请编写算法找出3科全及格的学生的名单(学号)。 2 | 3 | -------------------------- 4 | 科目 及格学生学号 5 | -------------------------- 6 | 语文 1,9,6,8,4,3,7 7 | 代数 5,2,9,1,3,7 8 | 外语 8,1,6,7,3,5,4,9 9 | -------------------------- 10 | -------------------------------------------------------------------------------- /Algorithm/src/chapter3/e13/solution1.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | int main(int argc, char* argv[]) 4 | { 5 | int n, a[9] = {0}; 6 | 7 | scanf("%d", &n); 8 | while(n != -1) 9 | { 10 | if(n > 0 && n <= 9) a[n - 1]++; 11 | scanf("%d", &n); 12 | } 13 | 14 | for(int i = 0; i < 9; ++i) 15 | if(a[i] == 3) printf("%d\n", i + 1); 16 | 17 | return 0; 18 | } 19 | -------------------------------------------------------------------------------- /Algorithm/src/chapter3/e14/README.txt: -------------------------------------------------------------------------------- 1 | 编写算法将数字编号“翻译”成英文编号。 2 | 例如:将编号35706“翻译”成英文编号 three-five-seven-zero-six。 3 | -------------------------------------------------------------------------------- /Algorithm/src/chapter3/e14/solution1.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | 4 | int main(int argc, char* argv[]) 5 | { 6 | char num[40]; 7 | char eng[10][6] = {"zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"}; 8 | 9 | scanf("%s", num); 10 | printf("%s", eng[num[0] - 48]); 11 | for(int i = 1; i < strlen(num); ++i) 12 | printf("-%s",eng[num[i] - 48]); 13 | 14 | return 0; 15 | } 16 | -------------------------------------------------------------------------------- /Algorithm/src/chapter3/e15/README.txt: -------------------------------------------------------------------------------- 1 | 一个顾客买了价值x元的商品(不考虑角、分),并将y元的钱给销售员。编写算法:在各种币值的钱都很充分的情况下,是销售员能用张数最少的钱币找给顾客。 2 | -------------------------------------------------------------------------------- /Algorithm/src/chapter3/e15/solution1.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | int main(int argc, char* argv[]) 4 | { 5 | int money[6] = {50, 20, 10, 5, 2, 1}, a[6]; 6 | int x, y; 7 | scanf("%d%d", &x, &y); 8 | y -= x; 9 | for (int i = 0; i < 6; ++i) 10 | { 11 | a[i] = y / money[i]; 12 | y -= a[i] * money[i]; 13 | printf("%d : %d\n", money[i], a[i]); 14 | } 15 | 16 | return 0; 17 | } 18 | -------------------------------------------------------------------------------- /Algorithm/src/chapter3/e16/README.txt: -------------------------------------------------------------------------------- 1 | 求x,使X²为一个各位数字互不相同的9位数。 -------------------------------------------------------------------------------- /Algorithm/src/chapter3/e16/solution1.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | int main(int argc, char* argv[]) 4 | { 5 | for (int i = 10000; i <= 31622; i++) 6 | { 7 | int x[10] = {1, 1, 1, 1, 1, 1, 1, 1, 1, 1}; 8 | long k = i * i; 9 | int n, m = 0; 10 | while(k != 0) 11 | { 12 | if((x[n = k % 10] != 1)) break; 13 | else 14 | { 15 | x[n]--; 16 | m++; 17 | } 18 | k /= 10; 19 | } 20 | if (m == 9) 21 | printf("%d: %ld\n", i, i * i); 22 | } 23 | return 0; 24 | } 25 | -------------------------------------------------------------------------------- /Algorithm/src/chapter3/e17/README.txt: -------------------------------------------------------------------------------- 1 | 12个小朋友手拉手站成一个圆圈,从某一个小朋友开始报数,报到7的那个小朋友退到圈外,然后他的下一位重新报“1”。这样继续下去,知道最后只剩下一个小朋友。求解这个小朋友原来站在什么位置。 -------------------------------------------------------------------------------- /Algorithm/src/chapter3/e18/README.txt: -------------------------------------------------------------------------------- 1 | 高精度数据×长整数 -------------------------------------------------------------------------------- /Algorithm/src/chapter3/e19/README.txt: -------------------------------------------------------------------------------- 1 | 编程求当n<=100时,n!的准确值。 -------------------------------------------------------------------------------- /Algorithm/src/chapter3/e2/README.txt: -------------------------------------------------------------------------------- 1 | 一个数如果恰好等于它的因子之和(包括1, 但不包括它本身)则称这个数为完数,例如,28的因子为1,2,4,7,14,而28=1+2+4+7+14。因此28是“完数”。编写代码找出1000之内的所有完数,并按下面格式输出其因子:28 it's factors are 1, 2, 4, 7, 14。 -------------------------------------------------------------------------------- /Algorithm/src/chapter3/e20/README.txt: -------------------------------------------------------------------------------- 1 | 编程打印有如下规律的n×n方阵。 2 | 使左对角线和右对角线上的元素为0,它们上方的元素为1,左边的元素为2,下方的元素为3,右边的元素为4,下图是一个符合条件的五阶矩阵。 3 | 0 1 1 1 0 4 | 2 0 1 0 4 5 | 2 2 0 4 4 6 | 2 0 3 0 4 7 | 0 3 3 3 0 -------------------------------------------------------------------------------- /Algorithm/src/chapter3/e20/solution1.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | int main(int argc, char* argv[]) 4 | { 5 | int a[100][100], n; 6 | 7 | scanf("%d", &n); 8 | for (int i = 1; i <= n; ++i) 9 | for (int j = 1; j <= n; ++j) 10 | if (i == j || i + j == n + 1) a[i][j] = 0; 11 | else 12 | if (i + j < n + 1) 13 | if (i < j) a[i][j] = 1; 14 | else a[i][j] = 2; 15 | else 16 | if (i > j) a[i][j] = 3; 17 | else a[i][j] = 4; 18 | 19 | for (int i = 1; i <= n; ++i) 20 | { 21 | for (int j = 1; j <= n; ++j) 22 | printf("%d ", a[i][j]); 23 | printf("\n"); 24 | } 25 | return 0; 26 | } 27 | -------------------------------------------------------------------------------- /Algorithm/src/chapter3/e21/README.txt: -------------------------------------------------------------------------------- 1 | 螺旋阵:任意给定n值,按如下螺旋的方式输出方阵。 2 | n = 3 3 | 输出: 4 | 1 8 7 5 | 2 9 6 6 | 3 4 5 7 | 8 | n = 4 9 | 输出: 10 | 1 12 11 10 11 | 2 13 16 9 12 | 3 14 15 8 13 | 4 5 6 7 -------------------------------------------------------------------------------- /Algorithm/src/chapter3/e22/README.txt: -------------------------------------------------------------------------------- 1 | 魔方阵是我国古代发明的一种数字游戏:n阶魔方是指这样一种方阵,它的每一行、每一列以及对角线上的个数之和为一个相同的常数,这个常数是:n×(n² + 1) / 2,此常数被称为魔方阵常数。由于偶次阶魔方阵(n=偶数)求解起来比较困难,这里只考虑n为奇数的情况。 2 | 以下就是一个n=3的魔方阵: 3 | 6 1 8 4 | 7 5 3 5 | 2 9 4 6 | 它的各行、各列及对角线上的元素之和为15。 -------------------------------------------------------------------------------- /Algorithm/src/chapter3/e23/README.txt: -------------------------------------------------------------------------------- 1 | 统计问题:找链环数字对的出现频率。 2 | 输入n(2≤n≤100)个数字(即0与9之间的数据),然后统计出这组数中相邻两数字组成的链环数字对出现的次数。如:当既有(0,3)又有(3,0)出现时,称它们为链环数字对,算法要统计输出它们各自的出现次数。 -------------------------------------------------------------------------------- /Algorithm/src/chapter3/e24/README.txt: -------------------------------------------------------------------------------- 1 | 有3n个花盆,红色、蓝色和黄色的各n个。开始时排列的顺序是混乱的,如黄、红、蓝、黄、黄、蓝、黄、红、红、黄、蓝、红、黄、红、黄、蓝、蓝、红、红、红、黄、蓝、蓝、黄、黄、黄、红、红、蓝、蓝、蓝。 2 | 请编写一个程序:将各花盆按红、黄、蓝、红、黄、蓝……的顺序排列,而且要求花盆之间的交换次数最少。 -------------------------------------------------------------------------------- /Algorithm/src/chapter3/e25/README.txt: -------------------------------------------------------------------------------- 1 | 一次考试,共考了5门课。统计50个学生中至少有3门课成绩高于90分的人数。 -------------------------------------------------------------------------------- /Algorithm/src/chapter3/e25/solution1.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | int main(int argc, char* argv[]) 4 | { 5 | int sum, n, a; 6 | for (int i = 0; i < 50; i++) 7 | { 8 | n = 0; 9 | for (int j = 0; j < 5; j++) 10 | { 11 | scanf("%d", a); 12 | if (a >= 90) n++; 13 | } 14 | if (n >= 3) sum++; 15 | } 16 | printf("%d\n", sum); 17 | return 0; 18 | } 19 | -------------------------------------------------------------------------------- /Algorithm/src/chapter3/e26/README.txt: -------------------------------------------------------------------------------- 1 | 开灯问题:有从1到n依次编号的n个同学和n盏灯。1号同学将所有的灯都关掉;2号同学将编号为2的倍数的灯都打开;3号同学则将编号为3的倍数的灯做相反处理(该号灯如果打开,则关掉;如果关闭的,则打开);以后的同学都将自己编号的倍数的灯,作相反处理。问经过n个同学操作后,哪些灯是打开的? -------------------------------------------------------------------------------- /Algorithm/src/chapter3/e26/solution1.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | int main(int argc, char* argv[]) 4 | { 5 | int a[101], n; 6 | // 初始化数组 7 | for (int i = 0; i < 101; ++i) 8 | a[i] = 0; 9 | 10 | scanf("%d", &n); 11 | 12 | for (int i = 2; i <= n; ++i) 13 | for (int k = 1; k * i <= n; k++) 14 | a[k * i] = 1 - a[k * i]; 15 | 16 | for (int i = 1; i <= n; ++i) 17 | if (a[i] == 1) printf("%d ", i); 18 | 19 | return 0; 20 | } 21 | -------------------------------------------------------------------------------- /Algorithm/src/chapter3/e27/README.txt: -------------------------------------------------------------------------------- 1 | 下图所示的圆圈中,把相隔一个数据的两个数(如图中 1 和 10, 3 和 5, 3 和 6)称作是“一对数”,编写算法求出乘积最大的一对数和乘积最小的一对数。输出格式如下: 2 | max=? * ? = ? 3 | min=? * ? = ? 4 | 5 | 1 6 | 17 16 7 | 8 10 8 | 12 16 9 | 5 1 10 | 9 9 11 | 3 15 12 | 8 12 13 | 6 -------------------------------------------------------------------------------- /Algorithm/src/chapter3/e28/README.txt: -------------------------------------------------------------------------------- 1 | 冒泡排序算法的改进。 -------------------------------------------------------------------------------- /Algorithm/src/chapter3/e29/README.txt: -------------------------------------------------------------------------------- 1 | 编程判定从键盘输入n个数据互不相等。 2 | 3 | // 这题用 set 或者 map 更方便 -------------------------------------------------------------------------------- /Algorithm/src/chapter3/e3/README.txt: -------------------------------------------------------------------------------- 1 | 求一个矩阵的鞍点,即在行上最小而在列上最大的点 -------------------------------------------------------------------------------- /Algorithm/src/chapter3/e30/README.txt: -------------------------------------------------------------------------------- 1 | 输入3个数值,判断以它们为边长是否能构成三角形。如果能构成,则判断属于哪种特殊三角形:等边、等腰或直角。 -------------------------------------------------------------------------------- /Algorithm/src/chapter3/e31/README.txt: -------------------------------------------------------------------------------- 1 | 编写算法,求任意3个数的最小公倍数。 -------------------------------------------------------------------------------- /Algorithm/src/chapter3/e32/README.txt: -------------------------------------------------------------------------------- 1 | 警察局抓了a,b,c,d 4名偷窃嫌疑犯,其中只有一人是小偷。审问中, 2 | a说:“我不是小偷。” 3 | b说:“c是小偷。” 4 | c说:“小偷肯定是d。” 5 | d说:“c在冤枉人。” 6 | 现在已经知道4个人中3个人说的是真话,一人说的是假话,问到底谁是小偷? -------------------------------------------------------------------------------- /Algorithm/src/chapter3/e32/e32.cpp: -------------------------------------------------------------------------------- 1 | //============================================================================ 2 | // Name : e32.cpp 3 | // Author : 4 | // Version : 5 | // Copyright : Your copyright notice 6 | // Description : Hello World in C++, Ansi-style 7 | //============================================================================ 8 | 9 | #include 10 | using namespace std; 11 | 12 | int main() { 13 | for (int i = 0; i < 4; ++i) 14 | if ((i != 0) + (i == 3) + (i == 4) + (i != 4) == 3) 15 | cout << "小偷是:" << i << endl; 16 | return 0; 17 | } 18 | -------------------------------------------------------------------------------- /Algorithm/src/chapter3/e33/README.txt: -------------------------------------------------------------------------------- 1 | 3位老师对某次数学竞赛进行了预测。他们的预测如下: 2 | 甲说:学生A得第一名,学生B得第三名。 3 | 乙说:学生C得第一名,学生D得第四名。 4 | 丙说:学生D得第二名,学生A得第三名。 5 | 竞赛结果表明,他们都说对了一半,说错了一半,并且无并列名次,试编程输出A,B,C,D各自的名次。 -------------------------------------------------------------------------------- /Algorithm/src/chapter3/e34/README.txt: -------------------------------------------------------------------------------- 1 | 填写运算符。 2 | 输入任意5个数 x1, x2, x3, x4, x5 每两个相邻数之间填上一个运算符。在填入4个运算符“+、-、*、/”后,使得表达式值为一个指定值y(y由键盘输入)。 3 | 求所有满足条件的表达式。 -------------------------------------------------------------------------------- /Algorithm/src/chapter3/e35/README.txt: -------------------------------------------------------------------------------- 1 | 有10箱产品,每箱有1000件,正品每件100克。其中有几箱是次品,每件次品比正品轻10克,问能否用秤只称一次,就找出哪几箱是次品。 -------------------------------------------------------------------------------- /Algorithm/src/chapter3/e36/README.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yangruihan/Notes/4e9855bf07f5ea772649b685995c9294eccfcdac/Algorithm/src/chapter3/e36/README.txt -------------------------------------------------------------------------------- /Algorithm/src/chapter3/e36/e36.kt: -------------------------------------------------------------------------------- 1 | package e36 2 | 3 | import java.util.* 4 | 5 | /** 6 | * Created by Yrh on 2015/12/3. 7 | */ 8 | 9 | fun main(args: Array) { 10 | val scanner = Scanner(System.`in`) 11 | println("Please enter a number: ") 12 | val n = scanner.nextLong() 13 | val k = (if (n % 3 == 0L) 1 else 0) + (if (n % 5 == 0L) 2 else 0) + (if (n % 7 == 0L) 4 else 0) 14 | when (k) { 15 | 7 -> print("All") 16 | 6 -> print("5 and 7") 17 | 5 -> print("3 and 7") 18 | 4 -> print("7") 19 | 3 -> print("3 and 5") 20 | 2 -> print("5") 21 | 1 -> print("3") 22 | 0 -> print("none") 23 | } 24 | } -------------------------------------------------------------------------------- /Algorithm/src/chapter3/e37/README.txt: -------------------------------------------------------------------------------- 1 | 求n次二项式各项的系数。 -------------------------------------------------------------------------------- /Algorithm/src/chapter3/e37/e37.kt: -------------------------------------------------------------------------------- 1 | package e37 2 | 3 | import java.util.* 4 | 5 | /** 6 | * Created by Yrh on 2015/12/3. 7 | */ 8 | 9 | fun coeff(a: IntArray, n: Int) { 10 | if (n < 2) { 11 | a[1] = 1 12 | a[2] = 1 13 | } else { 14 | coeff(a, n - 1) 15 | a[n + 1] = 1 16 | for (i in n downTo 2) 17 | a[i] += a[i - 1] 18 | a[1] = 1 19 | } 20 | } 21 | 22 | fun main(args: Array) { 23 | val scanner = Scanner(System.`in`) 24 | var a = IntArray(100) 25 | val n = scanner.nextInt() 26 | coeff(a, n) 27 | for (i in 1..(n + 1)) 28 | print("${a[i]} ") 29 | } -------------------------------------------------------------------------------- /Algorithm/src/chapter3/e38/README.txt: -------------------------------------------------------------------------------- 1 | 数组中有n个数据,要将它们顺序循环向后移k位,即前面的元素向后移k为,后面的元素则循环向前移k位,例:0,1,2,3,4循环移3位后为2,3,4,0,1。考虑到n会很大,不允许用2×n以上的空间来完成此题。 -------------------------------------------------------------------------------- /Algorithm/src/chapter3/e39/README.txt: -------------------------------------------------------------------------------- 1 | 编写算法完成下面给“余”猜数的游戏。 2 | 心里先想好一个1~100之间的整数x,将它分别除以3,5和7并得到3个余数。把这3个余数输入计算机,计算机能马上猜出这个数。 -------------------------------------------------------------------------------- /Algorithm/src/chapter3/e39/e39.kt: -------------------------------------------------------------------------------- 1 | package e39 2 | 3 | import java.util.* 4 | 5 | /** 6 | * Created by Yrh on 2015/12/3. 7 | */ 8 | 9 | fun main(args: Array) { 10 | val scanner = Scanner(System.`in`) 11 | println("Please think of a number between 1 and 100.") 12 | println("Your number divided by 3 has a remainder of: ") 13 | val a = scanner.nextInt() 14 | println("Your number divided by 5 has a remainder of: ") 15 | val b = scanner.nextInt() 16 | println("Your number divided by 7 has a remainder of: ") 17 | val c = scanner.nextInt() 18 | var d = 70 * a + 21 * b + 15 * c 19 | while (d > 105) 20 | d -= 105 21 | println("Your number was $d") 22 | } -------------------------------------------------------------------------------- /Algorithm/src/chapter3/e4/README.txt: -------------------------------------------------------------------------------- 1 | 编写算法:打印具有下面规律的图形 2 | 1 3 | 5 2 4 | 8 6 3 5 | 10 9 7 4 -------------------------------------------------------------------------------- /Algorithm/src/chapter3/e4/solution1.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | int main(int argc, char const *argv[]) 4 | { 5 | int a[100][100], n, k; 6 | scanf("%d", &n); 7 | k = 1; 8 | for(int i = 1; i <= n; i++) 9 | for(int j = 1; j <= n + 1 - i; j++) 10 | { 11 | a[i - 1 + j][j] = k; 12 | k++; 13 | } 14 | for(int i = 1; i <=n; i++) 15 | { 16 | for(int j = 1; j<=i; j++) 17 | printf("%d\t", a[i][j]); 18 | printf("\n"); 19 | } 20 | return 0; 21 | } -------------------------------------------------------------------------------- /Algorithm/src/chapter3/e40/README.txt: -------------------------------------------------------------------------------- 1 | 楼梯上有n阶台阶,上楼时可以一步上1阶,也可以一步上2阶,编写算法计算共有多少种不同的上楼梯方法。 -------------------------------------------------------------------------------- /Algorithm/src/chapter3/e40/e40.kt: -------------------------------------------------------------------------------- 1 | package e40 2 | 3 | import java.util.* 4 | 5 | /** 6 | * Created by Yrh on 2015/12/3. 7 | */ 8 | 9 | fun f(n: Int): Int { 10 | return when (n) { 11 | 1 -> 1 12 | 2 -> 2 13 | else -> f(n-1) + f(n-2) 14 | } 15 | } 16 | 17 | fun main(args: Array) { 18 | val scanner = Scanner(System.`in`) 19 | val n = scanner.nextInt() 20 | println("f($n) = ${f(n)}") 21 | } -------------------------------------------------------------------------------- /Algorithm/src/chapter3/e41/README.txt: -------------------------------------------------------------------------------- 1 | 核反应堆中有α和β两种粒子,每秒钟内一个α粒子变化为3个β粒子,而一个β粒子可以变化为1个α粒子和2个β粒子。若在t=0时刻,反应堆中只有一个α粒子,求在t时刻的反应堆中α粒子和β粒子数。 -------------------------------------------------------------------------------- /Algorithm/src/chapter3/e41/e41.kt: -------------------------------------------------------------------------------- 1 | package e41 2 | 3 | import java.util.* 4 | 5 | /** 6 | * Created by Yrh on 2015/12/3. 7 | */ 8 | 9 | fun main(args: Array) { 10 | val scanner = Scanner(System.`in`) 11 | var n = IntArray(100) 12 | var m = IntArray(100) 13 | val t = scanner.nextInt() 14 | n[0] = 1 15 | m[0] = 0 16 | for (i in 1..t) { 17 | n[i] = m[i-1] 18 | m[i] = 3*n[i-1]+2*m[i-1] 19 | } 20 | 21 | println(n[t]) 22 | println(m[t]) 23 | } 24 | -------------------------------------------------------------------------------- /Algorithm/src/chapter3/e5/README.txt: -------------------------------------------------------------------------------- 1 | 汉诺塔问题:古代有一个梵塔,塔内有3个基座A,B,C,开始时A基座上有64个盘子,盘子大小不等,大的在下,小的在上。有一个老和尚想把这64个盘子从A座移动到B座,但每次只允许移动一个盘子,且在移动过程中,3个基座上的盘子都是中保持大盘在下,小盘在上。移动过程中可以利用C基座做辅助。请编程打印出移动过程。 -------------------------------------------------------------------------------- /Algorithm/src/chapter3/e5/solution1.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | int hanoi(char from, char to, char mid, int num) 4 | { 5 | if(num == 1) 6 | { 7 | printf("%c->%c\n", from, to); 8 | return 1; 9 | } 10 | else return hanoi(from, mid, to, num - 1) + hanoi(from, to, mid, 1) + hanoi(mid, to, from, num - 1); 11 | } 12 | 13 | int main(int argc, char const *argv[]) 14 | { 15 | int n; 16 | scanf("%d", &n); 17 | printf("%d\n", hanoi('A', 'B', 'C', n)); 18 | return 0; 19 | } -------------------------------------------------------------------------------- /Algorithm/src/chapter3/e5/solution2.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | void hanoi(int n, char a, char b, char c) 4 | { 5 | if(n>0) 6 | { 7 | hanoi(n - 1, a, c, b); 8 | printf("Move dish %d from pile %c to %c\n", n, a, b); 9 | hanoi(n - 1, c, b, a); 10 | } 11 | } 12 | 13 | int main(int argc, char const *argv[]) 14 | { 15 | int n; 16 | scanf("%d", &n); 17 | hanoi(n, 'A', 'B', 'C'); 18 | return 0; 19 | } -------------------------------------------------------------------------------- /Algorithm/src/chapter3/e6/README.txt: -------------------------------------------------------------------------------- 1 | 整数的分划问题: 2 | 对于一个正整数n的分划,就是把n表示一系列正整数之和的表达式。注意,分划与顺序无关,例如6=5+1和6=1+5被认为是同一种分化。另外,这个整数n本身也算是一种分划。 3 | 例如对于正整数n=6,它可以分划为: 4 | 6 5 | 5+1 6 | 4+2 4+1+1 7 | 3+3 3+2+1 3+1+1+1 8 | 2+2+2 2+2+1+1 2+1+1+1+1 9 | 1+1+1+1+1+1 10 | 现在的问题是,对于给定的正整数n,要求编写算法计算出其分划的数目P(n)。 11 | -------------------------------------------------------------------------------- /Algorithm/src/chapter3/e6/solution1.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | int Divinteger(int n, int m) 4 | { 5 | // 当m>n时,是没有意义的,因为不存在一种划分使得划分出来的因子还要比最终的和大 6 | if(m > n) return Divinteger(n, n); 7 | 8 | // 当n或者m等于1时,此时都只有一种划分 9 | // n等于1时表示,被划分数为1,显然只有1这种划分 10 | // m等于1时表示,将被划分数划分成若干个1相加,显然也只有1+1+...+1这种划分 11 | else if(n == 1 or m == 1) return 1; 12 | 13 | // 当n和m相等时,则总划分数为本身的1加上将n划分成不超过本身-1的总划分数 14 | else if(n == m) return 1 + Divinteger(n, m - 1); 15 | 16 | // 剩下的划分数等于不包含m的划分数加上包含m的划分数 17 | else return Divinteger(n, m - 1) + Divinteger(n - m, m); 18 | } 19 | 20 | int main(int argc, char* argv[]) 21 | { 22 | int n; 23 | scanf("%d", &n); 24 | printf("%d", Divinteger(n, n)); 25 | return 0; 26 | } 27 | -------------------------------------------------------------------------------- /Algorithm/src/chapter3/e7/README.txt: -------------------------------------------------------------------------------- 1 | 任给一个十进制的正整数,请从低位到高位逐位输出各位数字。 2 | -------------------------------------------------------------------------------- /Algorithm/src/chapter3/e7/solution1.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | int main(int argc, char* argv[]) 4 | { 5 | int n; 6 | scanf("%d", &n); 7 | int m = n; 8 | while(m != 0) 9 | { 10 | printf("%d", m % 10); 11 | m /= 10; 12 | } 13 | return 0; 14 | } 15 | -------------------------------------------------------------------------------- /Algorithm/src/chapter3/e7/solution2.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | void f(int n) 4 | { 5 | if (n < 10) printf("%d", n); 6 | else 7 | { 8 | printf("%d", n % 10); 9 | f(n / 10); 10 | } 11 | } 12 | 13 | int main(int argc, char* argv[]) 14 | { 15 | int n; 16 | scanf("%d", &n); 17 | f(n); 18 | return 0; 19 | } 20 | -------------------------------------------------------------------------------- /Algorithm/src/chapter3/e8/README.txt: -------------------------------------------------------------------------------- 1 | 任给十进制的正整数,请从高位到低位逐位输出各位数字。 2 | -------------------------------------------------------------------------------- /Algorithm/src/chapter3/e8/solution1.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | 4 | int main(int argc, char* argv[]) 5 | { 6 | char num[100]; 7 | scanf("%s", num); 8 | for(int i = 0; i < strlen(num); ++i) 9 | printf("%c", num[i]); 10 | return 0; 11 | } 12 | -------------------------------------------------------------------------------- /Algorithm/src/chapter3/e9/README.txt: -------------------------------------------------------------------------------- 1 | 任何一个正整数都可以用2的幂次方表示。 2 | 例如:137=2^7+2^3+2^0,同时约定几次方用括号来表示,即a^b可表示为a(b),由此可知,137可表示为:2(7)+2(3)+2(0),进一步:7=2^2+2+2^0(2^1用2表示)3=2+2^0。所以最后137可表示为:2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)。 3 | 输入:正整数(n<=20 000)。 4 | 输出:符合约定的n的0,2表示(在表示中不能有空格)。 5 | -------------------------------------------------------------------------------- /Algorithm/src/chapter4/e1/README.txt: -------------------------------------------------------------------------------- 1 | 兔子繁殖问题: 2 | 一对兔子从出生后第三个月开始,每月生一对小兔子。小兔子到第三个月又开始生下一代小兔子。假若兔子只生不死,一月份抱来一对刚出生的兔子,问一年中每个月各有多少只兔子。 -------------------------------------------------------------------------------- /Algorithm/src/chapter4/e1/e1.kt: -------------------------------------------------------------------------------- 1 | package e1 2 | 3 | /** 4 | * Created by Yrh on 2015/12/4. 5 | */ 6 | fun main(args: Array) { 7 | var a = IntArray(12) 8 | a[0] = 1 9 | a[1] = 1 10 | for (i in 2..a.size - 1) 11 | a[i] = a[i - 1] + a[i - 2] 12 | a.forEach { 13 | println(it) 14 | } 15 | } -------------------------------------------------------------------------------- /Algorithm/src/chapter4/e10/README.txt: -------------------------------------------------------------------------------- 1 | 编写算法解如下数字迷: 2 | 3 | A B C A B 4 | × A 5 | ———————————————————— 6 | D D D D D D -------------------------------------------------------------------------------- /Algorithm/src/chapter4/e10/e10.kt: -------------------------------------------------------------------------------- 1 | package e10 2 | 3 | /** 4 | * Created by yangruihan on 15/12/5. 5 | */ 6 | 7 | fun main(args: Array) { 8 | for (i in 1..9) 9 | for (j in 3..9) 10 | if ((100000 * i + 10000 * i + 1000 * i + 100 * i + 10 * i + i) % j == 0) { 11 | val k = (100000 * i + 10000 * i + 1000 * i + 100 * i + 10 * i + i) / j 12 | if (k < 100000 && k / 10000 % 10 == j && k / 10 % 10 == j && k / 1000 % 10 == k % 10) 13 | print("$k * $j = $i$i$i$i$i$i\n") 14 | } 15 | } -------------------------------------------------------------------------------- /Algorithm/src/chapter4/e11/README.txt: -------------------------------------------------------------------------------- 1 | 求3个数的最小公倍数(蛮力法). -------------------------------------------------------------------------------- /Algorithm/src/chapter4/e11/e11.kt: -------------------------------------------------------------------------------- 1 | package e11 2 | 3 | import java.util.* 4 | 5 | /** 6 | * Created by yangruihan on 15/12/5. 7 | */ 8 | 9 | fun main(args: Array) { 10 | val scanner = Scanner(System.`in`) 11 | val a = scanner.nextInt() 12 | val b = scanner.nextInt() 13 | val c = scanner.nextInt() 14 | // i 是 a,b,c 中的最大值 15 | var i = when { 16 | a > b && a > c -> a 17 | b > a && b > c -> b 18 | else -> c 19 | } 20 | while (true) { 21 | if (i % a == 0 && i % b == 0 && i % c == 0) break 22 | else i++ 23 | } 24 | print("$a $b $c least common multiple is $i") 25 | } 26 | -------------------------------------------------------------------------------- /Algorithm/src/chapter4/e12/README.txt: -------------------------------------------------------------------------------- 1 | 狱吏问题. 2 | 某国王大赦囚犯,让一狱吏n次通过一排锁着的n间牢房,每通过一次,按所定规则转动n间牢房中的某些门锁,每转动一次,原来锁着的门被打开,原来打开的门被锁上,通过n次后,门锁开着的,牢房中的犯人放出,否则犯人不得获释. 3 | 转动门锁的规则是这样的:第一次通过牢房,从第一间开始要转动每一把门锁,即把全部锁打开;第二次通过牢房时,从第二间开始转动,每隔一间转动一次;......;第k次通过牢房,从第k间开始转动,每隔k-1间转动一次;问通过n次后,哪些牢房的锁仍然是打开的? -------------------------------------------------------------------------------- /Algorithm/src/chapter4/e12/e12.kt: -------------------------------------------------------------------------------- 1 | package e12 2 | 3 | import java.util.* 4 | 5 | /** 6 | * Created by yangruihan on 15/12/5. 7 | */ 8 | 9 | fun main(args: Array) { 10 | val scanner = Scanner(System.`in`) 11 | val n = scanner.nextInt() 12 | for (i in 1..n) 13 | if (i * i <= n) 14 | print("${i * i} is free\n") 15 | } -------------------------------------------------------------------------------- /Algorithm/src/chapter4/e13/README.txt: -------------------------------------------------------------------------------- 1 | 金块问题. 2 | 老板有一袋金块(共n块,n是2的幂(n≥2)),最优秀的雇员得到其中最终的一块,最差的雇员得到其中最轻的一块.假设有一台比较重量的仪器,希望用最少的比较次数找出最重和最轻的金块. -------------------------------------------------------------------------------- /Algorithm/src/chapter4/e14/README.txt: -------------------------------------------------------------------------------- 1 | 残缺棋盘. 2 | 残缺棋盘是一个有 2^k×2^k(k≥1) 个方格的棋盘,其中恰有1个方格残缺.如下图所示4种情况: 3 | 4 | --------- 5 | | |****| 6 | | |****| 7 | --------- 8 | |****|****| 9 | |****|****| 10 | --------- 11 | 12 | --------- 13 | |****| | 14 | |****| | 15 | --------- 16 | |****|****| 17 | |****|****| 18 | --------- 19 | 20 | --------- 21 | |****|****| 22 | |****|****| 23 | --------- 24 | | |****| 25 | | |****| 26 | --------- 27 | 28 | --------- 29 | |****|****| 30 | |****|****| 31 | --------- 32 | |****| | 33 | |****| | 34 | --------- 35 | 上图的棋盘被称作为"三格板",残缺棋盘问题就是要用这4种三格板覆盖更大的残缺棋盘. 36 | 在此覆盖中要求: 37 | 1. 两个三格板不能重叠. 38 | 2. 三格板不能覆盖残缺方格,但必须覆盖其他所有的方格. -------------------------------------------------------------------------------- /Algorithm/src/chapter4/e15/README.txt: -------------------------------------------------------------------------------- 1 | 求数列的最大子段和. 2 | 给定n个元素的整数列(可能为负数)a1,a2,...,an.求形如: 3 | ai,ai+1,...,aj (i, j = 1,...,n, i ≤ j) 4 | 的子段,使其和为最大.当所有整数均为负整数时定义其最大子段和为0. -------------------------------------------------------------------------------- /Algorithm/src/chapter4/e16/README.txt: -------------------------------------------------------------------------------- 1 | 大整数乘法 -------------------------------------------------------------------------------- /Algorithm/src/chapter4/e17/README.txt: -------------------------------------------------------------------------------- 1 | 求一组数中第二小的数据 -------------------------------------------------------------------------------- /Algorithm/src/chapter4/e18/README.txt: -------------------------------------------------------------------------------- 1 | 对于给定的n个元素的数组a[0:n-1],要求从中找出第k小的元素 -------------------------------------------------------------------------------- /Algorithm/src/chapter4/e19/README.txt: -------------------------------------------------------------------------------- 1 | 键盘输入一个高精度的正整数n,去掉其中任意s个数字后剩下的数字按原左右次序将组成一个新的正整数。编程对给定的n和s,寻找一种方案使得剩下的数字组成的新数最小。 2 | 输出应包括所去掉的数字的位置和组成的新的正整数(n不超过240位)。 -------------------------------------------------------------------------------- /Algorithm/src/chapter4/e2/README.txt: -------------------------------------------------------------------------------- 1 | 求两个数的最大公约数。 -------------------------------------------------------------------------------- /Algorithm/src/chapter4/e2/e2.kt: -------------------------------------------------------------------------------- 1 | package e2 2 | 3 | import java.util.* 4 | 5 | /** 6 | * Created by Yrh on 2015/12/4. 7 | */ 8 | fun main(args: Array) { 9 | val scanner = Scanner(System.`in`) 10 | var a = scanner.nextInt() 11 | var b = scanner.nextInt() 12 | while (a % b != 0) { 13 | val c = a % b 14 | a = b 15 | b = c 16 | } 17 | print(b) 18 | } -------------------------------------------------------------------------------- /Algorithm/src/chapter4/e20/README.txt: -------------------------------------------------------------------------------- 1 | 数列极差问题。 2 | 在黑板上写了n个正整数拍成的一个数列,进行如下操作:每次擦去其中的两个数a和b,然后在数列中加入一个数a*b+1,如此下去直至黑板上剩下一个数,在所有按这种操作方式最后得到的数中,最大的记为max,最小的记为min,则该数列的极差定义为m=max-min。 -------------------------------------------------------------------------------- /Algorithm/src/chapter4/e21/README.txt: -------------------------------------------------------------------------------- 1 | 设计一个算法,把一个真分数表示为埃及分数之和的形式。所谓埃及分数,是指分子为1的分数。如7/8=1/2+1/3+1/24。 -------------------------------------------------------------------------------- /Algorithm/src/chapter4/e22/README.txt: -------------------------------------------------------------------------------- 1 | 币种统计问题。 2 | 某单位给每个职工发工资(精确到元)。为了保证不要临时兑换零钱,且取款的张叔最少,取工资前要统计出所有职工的工资所需各种币值(100,50,20,10,5,2,1元共7种)的张数。请编程完成。 -------------------------------------------------------------------------------- /Algorithm/src/chapter4/e23/README.txt: -------------------------------------------------------------------------------- 1 | 取数游戏。 2 | 有2个人轮流取2n个数中的n个数,所取数之和大者为胜者。请编写算法,让先取数者胜,模拟取数过程。 -------------------------------------------------------------------------------- /Algorithm/src/chapter4/e23/e23.kt: -------------------------------------------------------------------------------- 1 | package e23 2 | 3 | import java.util.* 4 | 5 | /** 6 | * Created by Yrh on 2015/12/12. 7 | */ 8 | fun main(args: Array) { 9 | val scanner = Scanner(System.`in`) 10 | 11 | print("Input n: ") 12 | val n = scanner.nextInt() 13 | 14 | var a = IntArray(2 * n) 15 | var oddSum = 0 ; 16 | var evenSum = 0; 17 | for (i in 0..2 * n - 1) { 18 | a[i] = scanner.nextInt() 19 | when (a[i] % 2) { 20 | 0 -> evenSum += a[i] 21 | 1 -> oddSum += a[i] 22 | } 23 | } 24 | 25 | when { 26 | evenSum > oddSum -> print("第一次取最后那个数") 27 | evenSum < oddSum -> print("第一次取第一个数") 28 | else -> print("随便取哪边的数都行") 29 | } 30 | } -------------------------------------------------------------------------------- /Algorithm/src/chapter4/e24/README.txt: -------------------------------------------------------------------------------- 1 | 数塔问题。 2 | 如下图所示的一个简单的数塔,从顶部出发,在每一节点可以选择向左走或是向右走,一直走到底层,要求找出一条路径,使路径上的数值和最大。 3 | 4 | 9 5 | 12 15 6 | 10 6 8 7 | 2 18 9 5 8 | 19 7 10 4 16 -------------------------------------------------------------------------------- /Algorithm/src/chapter4/e25/README.txt: -------------------------------------------------------------------------------- 1 | 资源分配问题。 2 | 设有资源n(n为整数),分配给m个项目,Gi(x)为第i个项目分得资源x(x为整数)所得到的利润。求总利润最大的资源分配方案。 3 | 例如:现有n=7万元投资到 A, B, C 3个项目,利润见下表,求总利润最大的资源分配方案。 4 | 5 | 投资利润表: 6 | 1 2 3 4 5 6 7 7 | A 0.11 0.13 0.15 0.21 0.24 0.30 0.35 8 | B 0.12 0.16 0.21 0.23 0.25 0.24 0.34 9 | C 0.08 0.12 0.20 0.24 0.26 0.30 0.35 -------------------------------------------------------------------------------- /Algorithm/src/chapter4/e26/README.txt: -------------------------------------------------------------------------------- 1 | n个矩阵连乘问题。 2 | -------------------------------------------------------------------------------- /Algorithm/src/chapter4/e27/README.txt: -------------------------------------------------------------------------------- 1 | 求两个字符序列的最长公共字符子序列(longest common substring) 2 | -------------------------------------------------------------------------------- /Algorithm/src/chapter4/e3/README.txt: -------------------------------------------------------------------------------- 1 | 猴子吃桃问题: 2 | 一只小猴子摘了若干桃子,每天吃现有桃的一半多一个,到第十天时就只有一个桃子了,求原来有多少个桃? -------------------------------------------------------------------------------- /Algorithm/src/chapter4/e3/e3.kt: -------------------------------------------------------------------------------- 1 | package e3 2 | 3 | /** 4 | * Created by Yrh on 2015/12/4. 5 | */ 6 | fun main(args: Array) { 7 | var num = 1 8 | for (i in 1..9) 9 | num = (num + 1) * 2 10 | print(num) 11 | } -------------------------------------------------------------------------------- /Algorithm/src/chapter4/e4/README.txt: -------------------------------------------------------------------------------- 1 | 输出如图所示的杨辉三角形(限定用一个一位数组完成)。 2 | 1 3 | 1 1 4 | 1 2 1 5 | 1 3 3 1 6 | 1 4 6 4 1 7 | ... 8 | -------------------------------------------------------------------------------- /Algorithm/src/chapter4/e5/README.txt: -------------------------------------------------------------------------------- 1 | 穿越沙漠问题: 2 | 一辆吉普车穿越1000千米的沙漠。吉普车的总装油量为500加仑,耗油率为1加仑/千米。由于沙漠中没有油库,必须先用这辆车在沙漠中建立临时油库。若吉普车用最少的耗油量穿越沙漠,应在哪些地方建立油库,以及各处存储的油量。 -------------------------------------------------------------------------------- /Algorithm/src/chapter4/e5/e5.kt: -------------------------------------------------------------------------------- 1 | package e5 2 | 3 | /** 4 | * Created by Yrh on 2015/12/4. 5 | */ 6 | fun main(args: Array) { 7 | var dis = 500 8 | var k = 1 9 | var oil = 500 10 | do { 11 | print("storepoint $k distance ${1000 - dis} oilquantity $oil\n") 12 | k++ 13 | dis += 500 / (2 * k - 1) 14 | oil = 500 * k 15 | } while (dis < 1000) 16 | oil = 500 * (k - 1) + (1000 - dis) * (2 * k - 1) 17 | print("storepoint $k distance 0 oilquantity $oil\n") 18 | } -------------------------------------------------------------------------------- /Algorithm/src/chapter4/e6/README.txt: -------------------------------------------------------------------------------- 1 | 用迭代法求方程组的根. 2 | 3 | 形式化代码如下: 4 | { 5 | for (i = 0; i < n; i++) 6 | x[i] = 初始近似根; 7 | do { 8 | k++; 9 | for (i = 0; i < n; i++) 10 | y[i] = x[i]; 11 | for (i = 0; i < n; i++) 12 | x[i] = gi(X); 13 | c = 0; 14 | for (i = 0; i < n; i++) 15 | c += fabs(y[i] - x[i]); 16 | } while(c > w && k < maxn); 17 | 18 | for (i = 0; i < n; i++) 19 | printf("%d 变量的近似根是 %d", i, x[i]); 20 | } -------------------------------------------------------------------------------- /Algorithm/src/chapter4/e7/README.txt: -------------------------------------------------------------------------------- 1 | 利用牛顿迭代法求形如 ax^3 + bx^2 + cx + d = 0 方程的根. 2 | 3 | 提示: 4 | 牛顿迭代法公式为: 5 | Xn+1 = Xn - f(Xn) / f'(Xn) 6 | 当 Xn 越接近0点时,得到的 Xn+1 也越接近Xn,因此只需判断 |Xn+1 - Xn| 的值即可,当其小于我们需要的精度时,我们就可以说已经找到了解 -------------------------------------------------------------------------------- /Algorithm/src/chapter4/e7/e7.kt: -------------------------------------------------------------------------------- 1 | package e7 2 | 3 | import java.util.* 4 | 5 | /** 6 | * Created by yangruihan on 15/12/5. 7 | */ 8 | 9 | fun f(a: Float, b: Float, c: Float, d: Float): Float { 10 | var x1 = 1.0f 11 | var x0: Float 12 | do { 13 | x0 = x1 14 | x1 = x0 - (((a * x0 + b) * x0 + c) * x0 + d) / ((3 * a * x0 + 2 * b) * x0 + c) 15 | } while (Math.abs(x1 - x0) >= 1e-4) 16 | return x1 17 | } 18 | 19 | fun main(args: Array) { 20 | val scanner = Scanner(System.`in`) 21 | print("Input a, b, c, d: ") 22 | val a = scanner.nextFloat() 23 | val b = scanner.nextFloat() 24 | val c = scanner.nextFloat() 25 | val d = scanner.nextFloat() 26 | print("The result is ${f(a, b, c, d)}\n") 27 | } -------------------------------------------------------------------------------- /Algorithm/src/chapter4/e8/README.txt: -------------------------------------------------------------------------------- 1 | 二分法求解方程 f(x) = 0 根. f(x) = x^3 / 2 + 2 * x^2 - 8. 2 | -------------------------------------------------------------------------------- /Algorithm/src/chapter4/e8/e8.kt: -------------------------------------------------------------------------------- 1 | package e8 2 | 3 | import java.util.* 4 | 5 | /** 6 | * Created by yangruihan on 15/12/5. 7 | */ 8 | 9 | fun main(args: Array) { 10 | val scanner = Scanner(System.`in`) 11 | print("Input x1, x2 (f(x1) * f(x2) < 0): ") 12 | var x1 = scanner.nextFloat() 13 | var x2 = scanner.nextFloat() 14 | var x: Float 15 | val f = { x: Float -> Math.pow(x * 1.0, 3.0) / 2 + 2 * Math.pow(x * 1.0, 2.0) - 8 } 16 | loop@ do { 17 | x = (x1 + x2) / 2 18 | when { 19 | f(x) == 0.0 -> break@loop 20 | f(x1) * f(x) > 0 -> x1 = x 21 | f(x2) * f(x) > 0 -> x2 = x 22 | } 23 | } while (Math.abs(f(x)) >= 1e-4) 24 | print("The result is $x") 25 | } -------------------------------------------------------------------------------- /Algorithm/src/chapter4/e9/README.txt: -------------------------------------------------------------------------------- 1 | 百钱百鸡问题:中国古代数学家张丘建在他的<算经>中提出了著名的"百钱百鸡问题":鸡翁一,值钱五;鸡母一,值钱三;鸡雏三,值钱一;百钱买百鸡,翁,母,雏各几何? -------------------------------------------------------------------------------- /Algorithm/src/chapter4/e9/e9.kt: -------------------------------------------------------------------------------- 1 | package e9 2 | 3 | /** 4 | * Created by yangruihan on 15/12/5. 5 | */ 6 | 7 | fun main(args: Array) { 8 | for (i in 1..20) 9 | for (j in 1..33) { 10 | val k = 100 - i - j 11 | if (k % 3 == 0 && 5 * i + 3 * j + k / 3 == 100) 12 | print(" The cock number is $i\n The hen number is $j\n The chick number is $k\n") 13 | } 14 | } -------------------------------------------------------------------------------- /Android/Android Service 通信/AndroidStudy_Service/.gitignore: -------------------------------------------------------------------------------- 1 | .gradle 2 | /local.properties 3 | /.idea/workspace.xml 4 | /.idea/libraries 5 | .DS_Store 6 | /build 7 | /captures 8 | -------------------------------------------------------------------------------- /Android/Android Service 通信/AndroidStudy_Service/.idea/.name: -------------------------------------------------------------------------------- 1 | AndroidStudy_Service -------------------------------------------------------------------------------- /Android/Android Service 通信/AndroidStudy_Service/.idea/copyright/profiles_settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /Android/Android Service 通信/AndroidStudy_Service/.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /Android/Android Service 通信/AndroidStudy_Service/.idea/runConfigurations.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 11 | 12 | -------------------------------------------------------------------------------- /Android/Android Service 通信/AndroidStudy_Service/.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /Android/Android Service 通信/AndroidStudy_Service/app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /Android/Android Service 通信/AndroidStudy_Service/app/src/androidTest/java/com/yangruihan/androidstudy_service/ApplicationTest.java: -------------------------------------------------------------------------------- 1 | package com.yangruihan.androidstudy_service; 2 | 3 | import android.app.Application; 4 | import android.test.ApplicationTestCase; 5 | 6 | /** 7 | * Testing Fundamentals 8 | */ 9 | public class ApplicationTest extends ApplicationTestCase { 10 | public ApplicationTest() { 11 | super(Application.class); 12 | } 13 | } -------------------------------------------------------------------------------- /Android/Android Service 通信/AndroidStudy_Service/app/src/main/res/menu/menu_main.xml: -------------------------------------------------------------------------------- 1 | 4 | 6 | 7 | -------------------------------------------------------------------------------- /Android/Android Service 通信/AndroidStudy_Service/app/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yangruihan/Notes/4e9855bf07f5ea772649b685995c9294eccfcdac/Android/Android Service 通信/AndroidStudy_Service/app/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /Android/Android Service 通信/AndroidStudy_Service/app/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yangruihan/Notes/4e9855bf07f5ea772649b685995c9294eccfcdac/Android/Android Service 通信/AndroidStudy_Service/app/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /Android/Android Service 通信/AndroidStudy_Service/app/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yangruihan/Notes/4e9855bf07f5ea772649b685995c9294eccfcdac/Android/Android Service 通信/AndroidStudy_Service/app/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /Android/Android Service 通信/AndroidStudy_Service/app/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yangruihan/Notes/4e9855bf07f5ea772649b685995c9294eccfcdac/Android/Android Service 通信/AndroidStudy_Service/app/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /Android/Android Service 通信/AndroidStudy_Service/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yangruihan/Notes/4e9855bf07f5ea772649b685995c9294eccfcdac/Android/Android Service 通信/AndroidStudy_Service/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /Android/Android Service 通信/AndroidStudy_Service/app/src/main/res/values-v21/styles.xml: -------------------------------------------------------------------------------- 1 | > 2 | 8 | 9 | -------------------------------------------------------------------------------- /Android/Android Service 通信/AndroidStudy_Service/app/src/main/res/values-w820dp/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 64dp 6 | 7 | -------------------------------------------------------------------------------- /Android/Android Service 通信/AndroidStudy_Service/app/src/main/res/values/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #3F51B5 4 | #303F9F 5 | #FF4081 6 | 7 | -------------------------------------------------------------------------------- /Android/Android Service 通信/AndroidStudy_Service/app/src/main/res/values/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 16dp 4 | 16dp 5 | 16dp 6 | 7 | -------------------------------------------------------------------------------- /Android/Android Service 通信/AndroidStudy_Service/app/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | AndroidStudy_Service 3 | Settings 4 | 5 | -------------------------------------------------------------------------------- /Android/Android Service 通信/AndroidStudy_Service/app/src/test/java/com/yangruihan/androidstudy_service/ExampleUnitTest.java: -------------------------------------------------------------------------------- 1 | package com.yangruihan.androidstudy_service; 2 | 3 | import org.junit.Test; 4 | 5 | import static org.junit.Assert.*; 6 | 7 | /** 8 | * To work on unit tests, switch the Test Artifact in the Build Variants view. 9 | */ 10 | public class ExampleUnitTest { 11 | @Test 12 | public void addition_isCorrect() throws Exception { 13 | assertEquals(4, 2 + 2); 14 | } 15 | } -------------------------------------------------------------------------------- /Android/Android Service 通信/AndroidStudy_Service/build.gradle: -------------------------------------------------------------------------------- 1 | // Top-level build file where you can add configuration options common to all sub-projects/modules. 2 | 3 | buildscript { 4 | repositories { 5 | jcenter() 6 | } 7 | dependencies { 8 | classpath 'com.android.tools.build:gradle:1.3.0' 9 | 10 | // NOTE: Do not place your application dependencies here; they belong 11 | // in the individual module build.gradle files 12 | } 13 | } 14 | 15 | allprojects { 16 | repositories { 17 | jcenter() 18 | } 19 | } 20 | 21 | task clean(type: Delete) { 22 | delete rootProject.buildDir 23 | } 24 | -------------------------------------------------------------------------------- /Android/Android Service 通信/AndroidStudy_Service/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yangruihan/Notes/4e9855bf07f5ea772649b685995c9294eccfcdac/Android/Android Service 通信/AndroidStudy_Service/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /Android/Android Service 通信/AndroidStudy_Service/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Fri Nov 06 14:57:14 CST 2015 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | distributionUrl=https\://services.gradle.org/distributions/gradle-2.4-all.zip 7 | -------------------------------------------------------------------------------- /Android/Android Service 通信/AndroidStudy_Service/settings.gradle: -------------------------------------------------------------------------------- 1 | include ':app' 2 | -------------------------------------------------------------------------------- /Backup/config/sougo_short.ini: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yangruihan/Notes/4e9855bf07f5ea772649b685995c9294eccfcdac/Backup/config/sougo_short.ini -------------------------------------------------------------------------------- /Blender/Blender快捷键.md: -------------------------------------------------------------------------------- 1 | # Blender 快捷键记录 2 | 3 | |快捷键|功能| 4 | |:---:|:---:| 5 | |`Shift` + `c`|cursor复原| 6 | |`z`|显示线框| 7 | |`Tab`|编辑模式和物体模式切换| 8 | |`a`|全选、取消全选| 9 | |`Shift` + `a`|添加| 10 | |`m`|将选中物体移动到某一层| 11 | |`b`|线框选择| 12 | |`Ctrl` + `左键`|自由选择| 13 | |`Ctrl` + `u`|保存启动文件| 14 | |`Ctrl` + `↑` 或 `Shift` + `Space`|最大化某一窗口| 15 | |`t`|展开、隐藏左侧工具列| 16 | |`n`|展开、隐藏右侧工具列| 17 | |`Ctrl` + `Tab`|切片点、线、面选择| 18 | |`e`|整体挤出| 19 | |`g`|移动| 20 | |`r`|旋转| 21 | |`s`|缩放| 22 | |`x`|删除| 23 | |`Ctrl` + `r`|环切并滑动| 24 | |`F12`|渲染场景| 25 | |`k`|刀片工具| 26 | |`f`|快速建立表面| 27 | -------------------------------------------------------------------------------- /Build/config.json: -------------------------------------------------------------------------------- 1 | { 2 | "target": "../", 3 | "ignore": [ 4 | ".git", 5 | "Build" 6 | ] 7 | } -------------------------------------------------------------------------------- /Build/template.txt: -------------------------------------------------------------------------------- 1 | # 个人笔记 2 | 3 | - 概要:用于记录在学习和编码过程中遇到的各种问题、学习笔记、心得体会以及优秀文章 4 | 5 | - 创建时间:2015/11/14 6 | 7 | - 创建人:C.y 8 | 9 | - 相关个人博客:https://github.com/yangruihan/blog 10 | 11 | ## 目录 12 | 13 | ${{content}} 14 | -------------------------------------------------------------------------------- /CEP/Clipboard.jsx: -------------------------------------------------------------------------------- 1 | var docRef = app.activeDocument; 2 | docRef.artLayers[0].copy(); 3 | 4 | var newDocRef = app.documents.add(8, 6, 72, "new doc"); 5 | newDocRef.paste(); 6 | 7 | -------------------------------------------------------------------------------- /CEP/HelloWorld.jsx: -------------------------------------------------------------------------------- 1 | // remember current unit settings and then set units to 2 | // the value expected by this script 3 | var originalUnit = preferences.rulerUnits; 4 | preferences.rulerUnits = Units.INCHES; 5 | 6 | // create a new 2x4 inch document and assign it to a variable 7 | var docRef = app.documents.add(2, 4); 8 | 9 | // create a new art layer containing text 10 | var artLayerRef = docRef.artLayers.add(); 11 | artLayerRef.kind = LayerKind.TEXT; 12 | 13 | // set the contents of the text layer 14 | var textItemRef = artLayerRef.textItem; 15 | textItemRef.contents = "Hello, World"; 16 | 17 | // release references 18 | docRef = null; 19 | artLayerRef = null; 20 | textItemRef = null; 21 | 22 | // restore original ruler unit setting 23 | app.preferences.rulerUnits = originalUnit; 24 | 25 | -------------------------------------------------------------------------------- /CEP/History.jsx: -------------------------------------------------------------------------------- 1 | var docRef = app.activeDocument; 2 | var savedState = docRef.activeHistoryState; 3 | docRef.artLayers[0].applyMotionBlur( 20, 20 ); 4 | docRef.activeHistoryState = savedState; 5 | 6 | // 清除历史记录 7 | // app.purge(PurgeTarget.HISTORYCACHES); 8 | 9 | -------------------------------------------------------------------------------- /CEP/LayerTest.jsx: -------------------------------------------------------------------------------- 1 | var docRef = app.documents.add(); 2 | docRef.artLayers.add(); 3 | 4 | var layerSetRef = docRef.layerSets.add(); 5 | var layerRef = docRef.artLayers[0].duplicate(layerSetRef, ElementPlacement.PLACEATEND); 6 | 7 | var textLayerRef = docRef.artLayers.add(); 8 | textLayerRef.name = "my text layer"; 9 | textLayerRef.kind = LayerKind.TEXT; 10 | 11 | var textItemRef = textLayerRef.textItem; 12 | textItemRef.contents = "Hello, Text Layer!"; 13 | textItemRef.justification = Justification.LEFT; 14 | 15 | -------------------------------------------------------------------------------- /CEP/Selection.jsx: -------------------------------------------------------------------------------- 1 | var docRef = app.documents.add(500, 500); 2 | docRef.artLayers.add(); 3 | 4 | var shapeRef = [ 5 | [0, 0], 6 | [0, 300], 7 | [300, 300], 8 | [300, 0] 9 | ] 10 | 11 | var strokeColor = new SolidColor(); 12 | strokeColor.cmyk.cyan = 20; 13 | strokeColor.cmyk.magenta = 50; 14 | strokeColor.cmyk.yellow = 30; 15 | strokeColor.cmyk.black = 20; 16 | 17 | docRef.selection.select(shapeRef); 18 | docRef.selection.stroke(strokeColor, 2, StrokeLocation.OUTSIDE, 19 | ColorBlendMode.VIVIDLIGHT, 75, false); 20 | 21 | var fillColor = new SolidColor(); 22 | fillColor.rgb.red = 255; 23 | fillColor.rgb.green = 200; 24 | fillColor.rgb.blue = 0; 25 | docRef.selection.fill(fillColor, ColorBlendMode.VIVIDLIGHT, 25, false); 26 | 27 | -------------------------------------------------------------------------------- /CEP/images/p1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yangruihan/Notes/4e9855bf07f5ea772649b685995c9294eccfcdac/CEP/images/p1.png -------------------------------------------------------------------------------- /CEP/images/p2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yangruihan/Notes/4e9855bf07f5ea772649b685995c9294eccfcdac/CEP/images/p2.png -------------------------------------------------------------------------------- /CEP/images/p3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yangruihan/Notes/4e9855bf07f5ea772649b685995c9294eccfcdac/CEP/images/p3.png -------------------------------------------------------------------------------- /CEP/images/p4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yangruihan/Notes/4e9855bf07f5ea772649b685995c9294eccfcdac/CEP/images/p4.png -------------------------------------------------------------------------------- /CMake/CMake CPP 模板.md: -------------------------------------------------------------------------------- 1 | # CMake C/CPP 模板 2 | 3 | https://github.com/yangruihan/cpp_cmake_proj_template -------------------------------------------------------------------------------- /CMake/CMake Link macos Framework.md: -------------------------------------------------------------------------------- 1 | # CMake Link macos Framework 2 | 3 | You can't link to a framework this way, you have to use find_library as it includes some special handling for frameworks on OSX. 4 | 5 | Also, don't use link_directories, CMake use full paths to libraries and it's not needed. 6 | 7 | Here's some simple example with AudioUnit: 8 | 9 | ```CMakeLists 10 | find_library(AUDIO_UNIT AudioUnit) 11 | if (NOT AUDIO_UNIT) 12 | message(FATAL_ERROR "AudioUnit not found") 13 | endif() 14 | 15 | add_executable(program ${program_SOURCES}) 16 | target_link_libraries(program ${AUDIO_UNIT}) 17 | ``` 18 | -------------------------------------------------------------------------------- /DataStruct/List/Python/list_test.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | # -*- coding:utf-8 -*- 3 | 4 | import unittest 5 | from list import MyList 6 | 7 | 8 | class TestMyList(unittest.TestCase): 9 | 10 | def test_insert(self): 11 | l = MyList() 12 | self.assertTrue(l.insert(1, 5)) 13 | self.assertFalse(l.insert(0, 100)) 14 | self.assertFalse(l.insert(100, 200)) 15 | 16 | if __name__ == '__main__': 17 | unittest.main() 18 | -------------------------------------------------------------------------------- /DesignPattern/src/com/yrh/pattern/abstract_factory_pattern/README.md: -------------------------------------------------------------------------------- 1 | # 抽象工厂模式 2 | 3 | 1. 抽象工厂模式(Abstract factory),提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。 4 | 5 | 2. 优点:好处便是易于交换产品系列,由于具体工厂类,在一个应用中只需要在初始化的时候出现一次,这就使得改变一个应用的具体工厂变得非常容易,它只需要改变具体工厂即可使用不同的产品配置。并且,它让具体的创建实例过程与客户端分离,客户端是通过它们的抽象接口操纵实例,产品的具体类名也被具体工厂的实现分离,不会出现在客户代码中。 6 | 7 | 3. 缺点:增加功能的时候,需要添加大量的类并且需要修改工厂方法才能实现。 -------------------------------------------------------------------------------- /DesignPattern/src/com/yrh/pattern/abstract_factory_pattern/src/Client.java: -------------------------------------------------------------------------------- 1 | package com.yrh.pattern.abstract_factory_pattern.src; 2 | 3 | /** 4 | * 客户端类 5 | * @author Yrh 6 | * 7 | */ 8 | public class Client { 9 | 10 | public static void main(String[] args) { 11 | Factory factory1 = new ConcreteFactory1(); 12 | ProductA a = factory1.getProductA(); 13 | ProductB b = factory1.getProductB(); 14 | 15 | a.method(); 16 | b.method(); 17 | 18 | factory1 = new ConcreteFactory2(); 19 | a = factory1.getProductA(); 20 | b = factory1.getProductB(); 21 | 22 | a.method(); 23 | b.method(); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /DesignPattern/src/com/yrh/pattern/abstract_factory_pattern/src/ConcreteFactory1.java: -------------------------------------------------------------------------------- 1 | package com.yrh.pattern.abstract_factory_pattern.src; 2 | 3 | /** 4 | * 具体工厂1 5 | * @author Yrh 6 | * 7 | */ 8 | public class ConcreteFactory1 extends Factory { 9 | 10 | @Override 11 | public ProductA getProductA() { 12 | return new ProductA1(); 13 | } 14 | 15 | @Override 16 | public ProductB getProductB() { 17 | return new ProductB1(); 18 | } 19 | 20 | } 21 | -------------------------------------------------------------------------------- /DesignPattern/src/com/yrh/pattern/abstract_factory_pattern/src/ConcreteFactory2.java: -------------------------------------------------------------------------------- 1 | package com.yrh.pattern.abstract_factory_pattern.src; 2 | 3 | /** 4 | * 具体工厂2 5 | * @author Yrh 6 | * 7 | */ 8 | public class ConcreteFactory2 extends Factory { 9 | 10 | @Override 11 | public ProductA getProductA() { 12 | return new ProductA2(); 13 | } 14 | 15 | @Override 16 | public ProductB getProductB() { 17 | return new ProductB2(); 18 | } 19 | 20 | } 21 | -------------------------------------------------------------------------------- /DesignPattern/src/com/yrh/pattern/abstract_factory_pattern/src/Factory.java: -------------------------------------------------------------------------------- 1 | package com.yrh.pattern.abstract_factory_pattern.src; 2 | 3 | /** 4 | * 抽象工厂类 5 | * @author Yrh 6 | * 7 | */ 8 | public abstract class Factory { 9 | public abstract ProductA getProductA(); 10 | public abstract ProductB getProductB(); 11 | } 12 | -------------------------------------------------------------------------------- /DesignPattern/src/com/yrh/pattern/abstract_factory_pattern/src/ProductA.java: -------------------------------------------------------------------------------- 1 | package com.yrh.pattern.abstract_factory_pattern.src; 2 | 3 | /** 4 | * A产品接口 5 | * @author Yrh 6 | * 7 | */ 8 | public interface ProductA { 9 | public void method(); 10 | } 11 | -------------------------------------------------------------------------------- /DesignPattern/src/com/yrh/pattern/abstract_factory_pattern/src/ProductA1.java: -------------------------------------------------------------------------------- 1 | package com.yrh.pattern.abstract_factory_pattern.src; 2 | 3 | /** 4 | * A1产品类 5 | * @author Yrh 6 | * 7 | */ 8 | public class ProductA1 implements ProductA { 9 | 10 | @Override 11 | public void method() { 12 | System.out.println("产商1 生产ProductA1"); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /DesignPattern/src/com/yrh/pattern/abstract_factory_pattern/src/ProductA2.java: -------------------------------------------------------------------------------- 1 | package com.yrh.pattern.abstract_factory_pattern.src; 2 | 3 | /** 4 | * A2产品类 5 | * @author Yrh 6 | * 7 | */ 8 | public class ProductA2 implements ProductA { 9 | 10 | @Override 11 | public void method() { 12 | System.out.println("产商2 生产ProductA2"); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /DesignPattern/src/com/yrh/pattern/abstract_factory_pattern/src/ProductB.java: -------------------------------------------------------------------------------- 1 | package com.yrh.pattern.abstract_factory_pattern.src; 2 | 3 | /** 4 | * B产品接口 5 | * @author Yrh 6 | * 7 | */ 8 | public interface ProductB { 9 | public void method(); 10 | } 11 | -------------------------------------------------------------------------------- /DesignPattern/src/com/yrh/pattern/abstract_factory_pattern/src/ProductB1.java: -------------------------------------------------------------------------------- 1 | package com.yrh.pattern.abstract_factory_pattern.src; 2 | 3 | /** 4 | * B1产品类 5 | * @author Yrh 6 | * 7 | */ 8 | public class ProductB1 implements ProductB { 9 | 10 | @Override 11 | public void method() { 12 | System.out.println("产商1 生产ProductB1"); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /DesignPattern/src/com/yrh/pattern/abstract_factory_pattern/src/ProductB2.java: -------------------------------------------------------------------------------- 1 | package com.yrh.pattern.abstract_factory_pattern.src; 2 | 3 | /** 4 | * B2产品类 5 | * @author Yrh 6 | * 7 | */ 8 | public class ProductB2 implements ProductB { 9 | 10 | @Override 11 | public void method() { 12 | System.out.println("产商2 生产ProductB2"); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /DesignPattern/src/com/yrh/pattern/adapter_pattern/README.md: -------------------------------------------------------------------------------- 1 | # 适配器模式 2 | 3 | 1. 适配器模式(Adapter),将一个类的接口转换成客户希望的另外一个接口。Adapter 模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。 4 | 5 | 2. 使用适配器模式的时机:想使用一个已经存在的类,但如果它的接口,也就是它的方法和你的要求不相同时,就应该考虑适配器模式。即两个类所做的事情相同或相似,但具有不同的接口时要使用它,这样客户端代码可以统一调用相同的接口,使其更简单、更直接、更紧凑。 -------------------------------------------------------------------------------- /DesignPattern/src/com/yrh/pattern/adapter_pattern/src/Adaptee.java: -------------------------------------------------------------------------------- 1 | package com.yrh.pattern.adapter_pattern.src; 2 | 3 | /** 4 | * 需要适配的类 5 | * @author Yrh 6 | * 7 | */ 8 | public class Adaptee { 9 | public void specificRequest() { 10 | System.out.println("特殊请求!"); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /DesignPattern/src/com/yrh/pattern/adapter_pattern/src/Adapter.java: -------------------------------------------------------------------------------- 1 | package com.yrh.pattern.adapter_pattern.src; 2 | 3 | /** 4 | * 适配器 5 | * @author Yrh 6 | * 7 | */ 8 | public class Adapter implements Target { 9 | 10 | private Adaptee adaptee = new Adaptee(); 11 | 12 | /** 13 | * 将特殊请求转换成普通请求,以供客户端调用 14 | */ 15 | @Override 16 | public void request() { 17 | adaptee.specificRequest(); 18 | } 19 | 20 | } 21 | -------------------------------------------------------------------------------- /DesignPattern/src/com/yrh/pattern/adapter_pattern/src/Client.java: -------------------------------------------------------------------------------- 1 | package com.yrh.pattern.adapter_pattern.src; 2 | 3 | /** 4 | * 客户端类 5 | * @author Yrh 6 | * 7 | */ 8 | public class Client { 9 | 10 | public static void main(String[] args) { 11 | Target target = new Adapter(); 12 | 13 | target.request(); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /DesignPattern/src/com/yrh/pattern/adapter_pattern/src/Target.java: -------------------------------------------------------------------------------- 1 | package com.yrh.pattern.adapter_pattern.src; 2 | 3 | /** 4 | * 客户所期待的接口 5 | * @author Yrh 6 | * 7 | */ 8 | public interface Target { 9 | void request(); 10 | } 11 | -------------------------------------------------------------------------------- /DesignPattern/src/com/yrh/pattern/bridge_pattern/README.md: -------------------------------------------------------------------------------- 1 | # 桥接模式 2 | 3 | 1. 桥接模式(Bridge),将抽象部分与它的实现部分分离,使它们都可以独立地变化。 4 | 5 | 2. 抽象与它的实现分离,并不是说,让抽象类与其派生类分离,因为这没有任何意义。实现指的是抽象类和它的派生类用来实现自己的对象。 6 | 7 | 3. 实现系统可能有多角度分类,每一种分类都有可能变化,那么就把这种多角度分离出来让它们独立变化,减少它们之间的耦合。 -------------------------------------------------------------------------------- /DesignPattern/src/com/yrh/pattern/bridge_pattern/src/Abstraction.java: -------------------------------------------------------------------------------- 1 | package com.yrh.pattern.bridge_pattern.src; 2 | 3 | /** 4 | * 抽象类 5 | * @author Yrh 6 | * 7 | */ 8 | public abstract class Abstraction { 9 | 10 | protected Implementor implementor; 11 | 12 | public void setImplementor(Implementor implementor) { 13 | this.implementor = implementor; 14 | } 15 | 16 | public abstract void operation(); 17 | } 18 | -------------------------------------------------------------------------------- /DesignPattern/src/com/yrh/pattern/bridge_pattern/src/Client.java: -------------------------------------------------------------------------------- 1 | package com.yrh.pattern.bridge_pattern.src; 2 | 3 | /** 4 | * 客户端类 5 | * @author Yrh 6 | * 7 | */ 8 | public class Client { 9 | 10 | public static void main(String[] args) { 11 | Abstraction ab = new RefinedAbstraction(); 12 | 13 | ab.setImplementor(new ConcreteImplementorA()); 14 | ab.operation(); 15 | 16 | ab.setImplementor(new ConcreteImplementorB()); 17 | ab.operation(); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /DesignPattern/src/com/yrh/pattern/bridge_pattern/src/ConcreteImplementorA.java: -------------------------------------------------------------------------------- 1 | package com.yrh.pattern.bridge_pattern.src; 2 | 3 | /** 4 | * 具体实现类A 5 | * @author Yrh 6 | * 7 | */ 8 | public class ConcreteImplementorA extends Implementor { 9 | 10 | @Override 11 | public void operation() { 12 | System.out.println("具体实现类A执行的操作"); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /DesignPattern/src/com/yrh/pattern/bridge_pattern/src/ConcreteImplementorB.java: -------------------------------------------------------------------------------- 1 | package com.yrh.pattern.bridge_pattern.src; 2 | 3 | /** 4 | * 具体实现类B 5 | * @author Yrh 6 | * 7 | */ 8 | public class ConcreteImplementorB extends Implementor { 9 | 10 | @Override 11 | public void operation() { 12 | System.out.println("具体实现类B执行的操作"); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /DesignPattern/src/com/yrh/pattern/bridge_pattern/src/Implementor.java: -------------------------------------------------------------------------------- 1 | package com.yrh.pattern.bridge_pattern.src; 2 | 3 | /** 4 | * 抽象实现类 5 | * @author Yrh 6 | * 7 | */ 8 | public abstract class Implementor { 9 | 10 | public abstract void operation(); 11 | } 12 | -------------------------------------------------------------------------------- /DesignPattern/src/com/yrh/pattern/bridge_pattern/src/RefinedAbstraction.java: -------------------------------------------------------------------------------- 1 | package com.yrh.pattern.bridge_pattern.src; 2 | 3 | /** 4 | * 被提炼的抽象类 5 | * @author Yrh 6 | * 7 | */ 8 | public class RefinedAbstraction extends Abstraction { 9 | 10 | @Override 11 | public void operation() { 12 | this.implementor.operation(); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /DesignPattern/src/com/yrh/pattern/builder_pattern/README.md: -------------------------------------------------------------------------------- 1 | # 建造者模式 2 | 3 | 1. 建造者模式(Builder pattern),将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。 4 | 5 | 2. 如果我们用了建造者模式,那么用户就只需指定需要建造的类型就可以得到它们,而具体建造的过程和细节就不需知道了。 6 | 7 | 3. 建造者模式是在当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时适用的模式。 -------------------------------------------------------------------------------- /DesignPattern/src/com/yrh/pattern/builder_pattern/src/Builder.java: -------------------------------------------------------------------------------- 1 | package com.yrh.pattern.builder_pattern.src; 2 | 3 | /** 4 | * 抽象建造者类 5 | * @author Yrh 6 | * 7 | */ 8 | public abstract class Builder { 9 | public abstract void buildPartA(); 10 | public abstract void buildPartB(); 11 | public abstract Product getResult(); 12 | } 13 | -------------------------------------------------------------------------------- /DesignPattern/src/com/yrh/pattern/builder_pattern/src/Client.java: -------------------------------------------------------------------------------- 1 | package com.yrh.pattern.builder_pattern.src; 2 | 3 | /** 4 | * 客户端类 5 | * @author Yrh 6 | * 7 | */ 8 | public class Client { 9 | 10 | public static void main(String[] args) { 11 | Director director = new Director(); 12 | Builder b1 = new ConcreteBuilder1(); 13 | Builder b2 = new ConcreteBuilder2(); 14 | 15 | director.construct(b1); 16 | Product product = b1.getResult(); 17 | product.show(); 18 | 19 | 20 | director.construct(b2); 21 | product = b2.getResult(); 22 | product.show(); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /DesignPattern/src/com/yrh/pattern/builder_pattern/src/ConcreteBuilder1.java: -------------------------------------------------------------------------------- 1 | package com.yrh.pattern.builder_pattern.src; 2 | 3 | 4 | public class ConcreteBuilder1 extends Builder { 5 | private Product product = new Product(); 6 | 7 | @Override 8 | public void buildPartA() { 9 | product.add("部件A"); 10 | } 11 | 12 | @Override 13 | public void buildPartB() { 14 | product.add("部件B"); 15 | } 16 | 17 | @Override 18 | public Product getResult() { 19 | return product; 20 | } 21 | 22 | } 23 | -------------------------------------------------------------------------------- /DesignPattern/src/com/yrh/pattern/builder_pattern/src/ConcreteBuilder2.java: -------------------------------------------------------------------------------- 1 | package com.yrh.pattern.builder_pattern.src; 2 | 3 | 4 | public class ConcreteBuilder2 extends Builder { 5 | private Product product = new Product(); 6 | 7 | @Override 8 | public void buildPartA() { 9 | product.add("部件X"); 10 | } 11 | 12 | @Override 13 | public void buildPartB() { 14 | product.add("部件Y"); 15 | } 16 | 17 | @Override 18 | public Product getResult() { 19 | return product; 20 | } 21 | 22 | } 23 | -------------------------------------------------------------------------------- /DesignPattern/src/com/yrh/pattern/builder_pattern/src/Director.java: -------------------------------------------------------------------------------- 1 | package com.yrh.pattern.builder_pattern.src; 2 | 3 | public class Director { 4 | 5 | public void construct(Builder builder) { 6 | builder.buildPartA(); 7 | builder.buildPartB(); 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /DesignPattern/src/com/yrh/pattern/builder_pattern/src/Product.java: -------------------------------------------------------------------------------- 1 | package com.yrh.pattern.builder_pattern.src; 2 | 3 | import java.util.ArrayList; 4 | import java.util.List; 5 | 6 | /** 7 | * 产品类 8 | * 9 | * @author Yrh 10 | * 11 | */ 12 | public class Product { 13 | 14 | List parts = new ArrayList(); 15 | 16 | public void add(String part) { 17 | parts.add(part); 18 | } 19 | 20 | public void show() { 21 | System.out.println("\n产品 创建 ----"); 22 | for (String s : parts) { 23 | System.out.println(s); 24 | } 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /DesignPattern/src/com/yrh/pattern/chain_of_responsibility_pattern/README.md: -------------------------------------------------------------------------------- 1 | # 职责链模式 2 | 3 | 1. 职责链模式(Chain of Responsibility):使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。 4 | 5 | 2. 接受者和发送者都没有对方的明确信息,且链中的对象自己也并不知道链的结构。结果是职责链可简化对象的相互连接,它们仅需保持一个指向其后继者的引用,而不需保持它所有的候选接受者的引用。 6 | 7 | 3. 可以随时增加或修改处理一个请求的结构。增强了给对象指派职责的灵活性。但是,一个请求极有可能到了链的末端都得不到处理,或者因为没有正确配置而得不到处理。 -------------------------------------------------------------------------------- /DesignPattern/src/com/yrh/pattern/chain_of_responsibility_pattern/src/Client.java: -------------------------------------------------------------------------------- 1 | package com.yrh.pattern.chain_of_responsibility_pattern.src; 2 | 3 | /** 4 | * 客户端类 5 | * 6 | * @author Yrh 7 | * 8 | */ 9 | public class Client { 10 | 11 | public static void main(String[] args) { 12 | Handler h1 = new ConcreteHandler1(); 13 | Handler h2 = new ConcreteHandler2(); 14 | Handler h3 = new ConcreteHandler3(); 15 | h1.setSuccessor(h2); 16 | h2.setSuccessor(h3); 17 | 18 | int[] requests = { 2, 5, 14, 22, 18, 3, 28, 20 }; 19 | 20 | for (int r : requests) { 21 | h1.handleRequest(r); 22 | } 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /DesignPattern/src/com/yrh/pattern/chain_of_responsibility_pattern/src/ConcreteHandler1.java: -------------------------------------------------------------------------------- 1 | package com.yrh.pattern.chain_of_responsibility_pattern.src; 2 | 3 | /** 4 | * 具体处理类1 5 | * @author Yrh 6 | * 7 | */ 8 | public class ConcreteHandler1 extends Handler { 9 | 10 | @Override 11 | public void handleRequest(int request) { 12 | if (request >= 0 && request < 10) { 13 | System.out.println(this.getClass().getName() + " 处理请求 " + request); 14 | } else if (successor != null) { 15 | successor.handleRequest(request); // 如果继任者不为空,则交由继任者处理 16 | } 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /DesignPattern/src/com/yrh/pattern/chain_of_responsibility_pattern/src/ConcreteHandler2.java: -------------------------------------------------------------------------------- 1 | package com.yrh.pattern.chain_of_responsibility_pattern.src; 2 | 3 | /** 4 | * 具体处理类2 5 | * @author Yrh 6 | * 7 | */ 8 | public class ConcreteHandler2 extends Handler { 9 | 10 | @Override 11 | public void handleRequest(int request) { 12 | if (request >= 10 && request < 20) { 13 | System.out.println(this.getClass().getName() + " 处理请求 " + request); 14 | } else if (successor != null) { 15 | successor.handleRequest(request); // 如果继任者不为空,则交由继任者处理 16 | } 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /DesignPattern/src/com/yrh/pattern/chain_of_responsibility_pattern/src/ConcreteHandler3.java: -------------------------------------------------------------------------------- 1 | package com.yrh.pattern.chain_of_responsibility_pattern.src; 2 | 3 | public class ConcreteHandler3 extends Handler { 4 | 5 | @Override 6 | public void handleRequest(int request) { 7 | if (request >= 20 && request < 30) { 8 | System.out.println(this.getClass().getName() + " 处理请求 " + request); 9 | } else if (successor != null) { 10 | successor.handleRequest(request); // 如果继任者不为空,则交由继任者处理 11 | } 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /DesignPattern/src/com/yrh/pattern/chain_of_responsibility_pattern/src/Handler.java: -------------------------------------------------------------------------------- 1 | package com.yrh.pattern.chain_of_responsibility_pattern.src; 2 | 3 | /** 4 | * 抽象处理类 5 | * @author Yrh 6 | * 7 | */ 8 | public abstract class Handler { 9 | protected Handler successor; // 继任者 10 | 11 | /** 12 | * 设置继任者 13 | * @param successor 继任者 14 | */ 15 | public void setSuccessor(Handler successor) { 16 | this.successor = successor; 17 | } 18 | 19 | /** 20 | * 处理请求的抽象方法 21 | * @param request 请求 22 | */ 23 | public abstract void handleRequest(int request); 24 | } 25 | -------------------------------------------------------------------------------- /DesignPattern/src/com/yrh/pattern/command_pattern/README.md: -------------------------------------------------------------------------------- 1 | # 命令模式 2 | 3 | 1. 命令模式(Command),将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。 -------------------------------------------------------------------------------- /DesignPattern/src/com/yrh/pattern/command_pattern/src/Client.java: -------------------------------------------------------------------------------- 1 | package com.yrh.pattern.command_pattern.src; 2 | 3 | /** 4 | * 客户端类 5 | * @author Yrh 6 | * 7 | */ 8 | public class Client { 9 | 10 | public static void main(String[] args) { 11 | Receiver r = new Receiver(); 12 | Command c = new ConcreteCommand(r); 13 | Invoker i = new Invoker(); 14 | 15 | i.setCommand(c); 16 | i.executeCommand(); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /DesignPattern/src/com/yrh/pattern/command_pattern/src/Command.java: -------------------------------------------------------------------------------- 1 | package com.yrh.pattern.command_pattern.src; 2 | 3 | /** 4 | * 抽象命令类 5 | * @author Yrh 6 | * 7 | */ 8 | public abstract class Command { 9 | protected Receiver receiver; 10 | 11 | public Command(Receiver receiver) { 12 | this.receiver = receiver; 13 | } 14 | 15 | public abstract void execute(); 16 | } 17 | -------------------------------------------------------------------------------- /DesignPattern/src/com/yrh/pattern/command_pattern/src/ConcreteCommand.java: -------------------------------------------------------------------------------- 1 | package com.yrh.pattern.command_pattern.src; 2 | 3 | /** 4 | * 具体命令类 5 | * @author Yrh 6 | * 7 | */ 8 | public class ConcreteCommand extends Command { 9 | 10 | public ConcreteCommand(Receiver receiver) { 11 | super(receiver); 12 | } 13 | 14 | @Override 15 | public void execute() { 16 | receiver.action(); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /DesignPattern/src/com/yrh/pattern/command_pattern/src/Invoker.java: -------------------------------------------------------------------------------- 1 | package com.yrh.pattern.command_pattern.src; 2 | 3 | /** 4 | * 要求命令执行类 5 | * @author Yrh 6 | * 7 | */ 8 | public class Invoker { 9 | private Command command; 10 | 11 | public void setCommand(Command command) { 12 | this.command = command; 13 | } 14 | 15 | public void executeCommand() { 16 | command.execute(); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /DesignPattern/src/com/yrh/pattern/command_pattern/src/Receiver.java: -------------------------------------------------------------------------------- 1 | package com.yrh.pattern.command_pattern.src; 2 | 3 | /** 4 | * 接受命令者类 5 | * 6 | * @author Yrh 7 | * 8 | */ 9 | public class Receiver { 10 | public void action() { 11 | System.out.println("执行请求!"); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /DesignPattern/src/com/yrh/pattern/composite_pattern/README.md: -------------------------------------------------------------------------------- 1 | # 组合模式 2 | 3 | 1. 组合模式(Composite),将对象组合成树形结构以表示‘部分-整体’的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。 4 | 5 | 2. 使用组合模式的时机:需求中是体现部分与整体层次的结构时,以及你希望用户可以忽略组合对象与单个对象的不同,统一地使用组合结构中的所有对象时,就应该考虑组合模式。 -------------------------------------------------------------------------------- /DesignPattern/src/com/yrh/pattern/composite_pattern/src/Component.java: -------------------------------------------------------------------------------- 1 | package com.yrh.pattern.composite_pattern.src; 2 | 3 | /** 4 | * 基本组件类 5 | * @author Yrh 6 | * 7 | */ 8 | public abstract class Component { 9 | protected String name; 10 | 11 | public Component(String name) { 12 | this.name = name; 13 | } 14 | 15 | public abstract void add(Component c); 16 | public abstract void remove(Component c); 17 | public abstract void display(int depth); 18 | } 19 | -------------------------------------------------------------------------------- /DesignPattern/src/com/yrh/pattern/composite_pattern/src/Leaf.java: -------------------------------------------------------------------------------- 1 | package com.yrh.pattern.composite_pattern.src; 2 | 3 | /** 4 | * 叶子组件类 5 | * @author Yrh 6 | * 7 | */ 8 | public class Leaf extends Component { 9 | 10 | public Leaf(String name) { 11 | super(name); 12 | } 13 | 14 | @Override 15 | public void add(Component c) { 16 | System.out.println("Cannot add to a leaf"); 17 | } 18 | 19 | @Override 20 | public void remove(Component c) { 21 | System.out.println("Cannot remove from a leaf"); 22 | } 23 | 24 | @Override 25 | public void display(int depth) { 26 | for (int i = 0; i < depth; i++) { 27 | System.out.print("-"); 28 | } 29 | 30 | System.out.println(name); 31 | } 32 | 33 | } 34 | -------------------------------------------------------------------------------- /DesignPattern/src/com/yrh/pattern/decorator_pattern/src/BoardShoes.java: -------------------------------------------------------------------------------- 1 | package com.yrh.pattern.decorator_pattern.src; 2 | 3 | /** 4 | * 板鞋类 5 | * @author Yrh 6 | * 7 | */ 8 | public class BoardShoes extends Finery { 9 | 10 | @Override 11 | public void show() { 12 | super.show(); 13 | System.out.println("板鞋"); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /DesignPattern/src/com/yrh/pattern/decorator_pattern/src/Client.java: -------------------------------------------------------------------------------- 1 | package com.yrh.pattern.decorator_pattern.src; 2 | 3 | /** 4 | * 客户端类 5 | * @author Yrh 6 | * 7 | */ 8 | public class Client { 9 | 10 | public static void main(String[] args) { 11 | 12 | Person p = new Person("小明"); 13 | 14 | TShirts tShirts = new TShirts(); 15 | Jeans jeans = new Jeans(); 16 | BoardShoes boardShoes = new BoardShoes(); 17 | 18 | tShirts.decorate(p); 19 | jeans.decorate(tShirts); 20 | boardShoes.decorate(jeans); 21 | 22 | boardShoes.show(); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /DesignPattern/src/com/yrh/pattern/decorator_pattern/src/Finery.java: -------------------------------------------------------------------------------- 1 | package com.yrh.pattern.decorator_pattern.src; 2 | 3 | /** 4 | * 服饰类 5 | * @author Yrh 6 | * 7 | */ 8 | public class Finery extends Person { 9 | 10 | protected Person component; 11 | 12 | /** 13 | * 打扮 14 | * @param component 15 | */ 16 | public void decorate(Person component) { 17 | this.component = component; 18 | } 19 | 20 | @Override 21 | public void show() { 22 | if (component != null) { 23 | component.show(); 24 | } 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /DesignPattern/src/com/yrh/pattern/decorator_pattern/src/Jeans.java: -------------------------------------------------------------------------------- 1 | package com.yrh.pattern.decorator_pattern.src; 2 | 3 | /** 4 | * 牛仔裤类 5 | * @author Yrh 6 | * 7 | */ 8 | public class Jeans extends Finery { 9 | 10 | @Override 11 | public void show() { 12 | super.show(); 13 | System.out.println("牛仔裤"); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /DesignPattern/src/com/yrh/pattern/decorator_pattern/src/Person.java: -------------------------------------------------------------------------------- 1 | package com.yrh.pattern.decorator_pattern.src; 2 | 3 | /** 4 | * 人类 5 | * @author Yrh 6 | * 7 | */ 8 | public class Person { 9 | 10 | public Person() { 11 | } 12 | 13 | private String name; 14 | 15 | public Person(String name) { 16 | super(); 17 | this.name = name; 18 | } 19 | 20 | public void show() { 21 | System.out.println("装扮的" + name); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /DesignPattern/src/com/yrh/pattern/decorator_pattern/src/TShirts.java: -------------------------------------------------------------------------------- 1 | package com.yrh.pattern.decorator_pattern.src; 2 | 3 | /** 4 | * TShirt 类 5 | * @author Yrh 6 | * 7 | */ 8 | public class TShirts extends Finery { 9 | 10 | @Override 11 | public void show() { 12 | super.show(); 13 | System.out.println("T血衫"); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /DesignPattern/src/com/yrh/pattern/facade_pattern/README.md: -------------------------------------------------------------------------------- 1 | # 外观模式 2 | 3 | 1. 外观模式(Facade pattern),为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。 4 | 5 | 2. 何时使用外观模式:首先,在设计初期阶段,应该要有意识的将不同的两个层分离;其次,在开发阶段,子系统往往因为不断的重构演化而变得越来越复杂,增加外观 Facade 可以提供一个简单的接口,减少它们之间的依赖;第三,在维护一个遗留的大型系统时,可能这个系统已经非常难以维护和扩展了,为新系统开发一个外观 Facade 类,来提供设计粗糙或高度复杂的遗留代码的比较清晰简单的接口,让新系统与 Facade 对象交互,Facade 与遗留代码交互所有复杂的工作。 -------------------------------------------------------------------------------- /DesignPattern/src/com/yrh/pattern/facade_pattern/src/Client.java: -------------------------------------------------------------------------------- 1 | package com.yrh.pattern.facade_pattern.src; 2 | 3 | /** 4 | * 客户端类 5 | * @author Yrh 6 | * 7 | */ 8 | public class Client { 9 | 10 | public static void main(String[] args) { 11 | Facade f = new Facade(); 12 | 13 | f.methodA(); 14 | System.out.println("-----------"); 15 | 16 | f.methodB(); 17 | System.out.println("-----------"); 18 | 19 | f.methodAll(); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /DesignPattern/src/com/yrh/pattern/facade_pattern/src/Facade.java: -------------------------------------------------------------------------------- 1 | package com.yrh.pattern.facade_pattern.src; 2 | 3 | /** 4 | * 外观类 5 | * @author Yrh 6 | * 7 | */ 8 | public class Facade { 9 | 10 | SubSystemOne one; 11 | SubSystemTwo two; 12 | SubSystemThree three; 13 | 14 | public Facade() { 15 | one = new SubSystemOne(); 16 | two = new SubSystemTwo(); 17 | three = new SubSystemThree(); 18 | } 19 | 20 | public void methodA() { 21 | one.methodA(); 22 | two.methodB(); 23 | } 24 | 25 | public void methodB() { 26 | one.methodA(); 27 | three.methodC(); 28 | } 29 | 30 | public void methodAll() { 31 | one.methodA(); 32 | two.methodB(); 33 | three.methodC(); 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /DesignPattern/src/com/yrh/pattern/facade_pattern/src/SubSystemOne.java: -------------------------------------------------------------------------------- 1 | package com.yrh.pattern.facade_pattern.src; 2 | 3 | /** 4 | * 子系统1 5 | * @author Yrh 6 | * 7 | */ 8 | public class SubSystemOne { 9 | 10 | public void methodA() { 11 | System.out.println("A"); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /DesignPattern/src/com/yrh/pattern/facade_pattern/src/SubSystemThree.java: -------------------------------------------------------------------------------- 1 | package com.yrh.pattern.facade_pattern.src; 2 | 3 | /** 4 | * 子系统3 5 | * @author Yrh 6 | * 7 | */ 8 | public class SubSystemThree { 9 | 10 | public void methodC() { 11 | System.out.println("C"); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /DesignPattern/src/com/yrh/pattern/facade_pattern/src/SubSystemTwo.java: -------------------------------------------------------------------------------- 1 | package com.yrh.pattern.facade_pattern.src; 2 | 3 | /** 4 | * 子系统2 5 | * @author Yrh 6 | * 7 | */ 8 | public class SubSystemTwo { 9 | 10 | public void methodB() { 11 | System.out.println("B"); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /DesignPattern/src/com/yrh/pattern/factory_method_pattern/README.md: -------------------------------------------------------------------------------- 1 | # 工厂方法模式 2 | 3 | 1. **简单工厂模式**和**工厂方法模式**的区别:**简单工厂模式**的最大优点是在于工厂类中包含了必要的逻辑判断,根据客户端的选择动态实例化相关的类,对于客户端来说,去除了与具体产品的依赖。而**工厂方法模式**是定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。 4 | 5 | 2. 工厂方法模式实现时,客户端需要决定实例化哪一个工厂来实现运算类,选择判断的问题还是存在的,也就是说,工厂方法把简单工厂的内部逻辑判断移到了客户端代码来进行。你想要加功能,本来是改造工厂类的,而现在是修改客户端! -------------------------------------------------------------------------------- /DesignPattern/src/com/yrh/pattern/factory_method_pattern/src/Client.java: -------------------------------------------------------------------------------- 1 | package com.yrh.pattern.factory_method_pattern.src; 2 | 3 | /** 4 | * 客户端 5 | * @author Yrh 6 | * 7 | */ 8 | public class Client { 9 | 10 | public static void main(String[] args) { 11 | Factory factory = new UndergraduateFactory(); 12 | Leifeng leifeng = factory.createLeiFeng(); 13 | 14 | leifeng.buyRice(); 15 | leifeng.sweep(); 16 | leifeng.wash(); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /DesignPattern/src/com/yrh/pattern/factory_method_pattern/src/Factory.java: -------------------------------------------------------------------------------- 1 | package com.yrh.pattern.factory_method_pattern.src; 2 | 3 | /** 4 | * 雷锋工厂 5 | * @author Yrh 6 | * 7 | */ 8 | public interface Factory { 9 | Leifeng createLeiFeng(); 10 | } 11 | -------------------------------------------------------------------------------- /DesignPattern/src/com/yrh/pattern/factory_method_pattern/src/Leifeng.java: -------------------------------------------------------------------------------- 1 | package com.yrh.pattern.factory_method_pattern.src; 2 | 3 | /** 4 | * 雷锋类 5 | * @author Yrh 6 | * 7 | */ 8 | public class Leifeng { 9 | 10 | public void sweep() { 11 | System.out.println("扫地"); 12 | } 13 | 14 | public void wash() { 15 | System.out.println("洗衣"); 16 | } 17 | 18 | public void buyRice() { 19 | System.out.println("买米"); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /DesignPattern/src/com/yrh/pattern/factory_method_pattern/src/Undergraduate.java: -------------------------------------------------------------------------------- 1 | package com.yrh.pattern.factory_method_pattern.src; 2 | 3 | /** 4 | * 学雷锋的大学生 5 | * @author Yrh 6 | * 7 | */ 8 | public class Undergraduate extends Leifeng { 9 | 10 | } 11 | -------------------------------------------------------------------------------- /DesignPattern/src/com/yrh/pattern/factory_method_pattern/src/UndergraduateFactory.java: -------------------------------------------------------------------------------- 1 | package com.yrh.pattern.factory_method_pattern.src; 2 | 3 | /** 4 | * 学雷锋的大学生工厂 5 | * @author Yrh 6 | * 7 | */ 8 | public class UndergraduateFactory implements Factory { 9 | 10 | @Override 11 | public Leifeng createLeiFeng() { 12 | return new Undergraduate(); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /DesignPattern/src/com/yrh/pattern/factory_method_pattern/src/Volunteer.java: -------------------------------------------------------------------------------- 1 | package com.yrh.pattern.factory_method_pattern.src; 2 | 3 | /** 4 | * 社区志愿者 5 | * @author Yrh 6 | * 7 | */ 8 | public class Volunteer extends Leifeng { 9 | 10 | } 11 | -------------------------------------------------------------------------------- /DesignPattern/src/com/yrh/pattern/factory_method_pattern/src/VolunteerFactory.java: -------------------------------------------------------------------------------- 1 | package com.yrh.pattern.factory_method_pattern.src; 2 | 3 | /** 4 | * 社区志愿者工厂 5 | * @author Yrh 6 | * 7 | */ 8 | public class VolunteerFactory implements Factory{ 9 | 10 | @Override 11 | public Leifeng createLeiFeng() { 12 | return new Volunteer(); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /DesignPattern/src/com/yrh/pattern/flyweight_pattern/README.md: -------------------------------------------------------------------------------- 1 | # 享元模式 2 | 3 | 1. 享元模式(Flyweight),运用共享技术有效地支持大量细粒度的对象。 4 | 5 | 2. 享元模式可以避免大量非常相似类的开销。在程序设计中,有时需要生成大量细粒度的类实例来表示数据。如果能发现这些实例除了几个参数外基本上都是相同的,有时就能够大幅度地减少需要实例化的类的数量。如果能把那些参数移到类实例的外面,在方法调用时将它们传递进来,就可以通过共享大幅度地较少单个实例的数目。 6 | 7 | 3. 如果一个应用程序使用了大量的对象,而大量的这些对象造成了很大的存储开销时就应该考虑使用;还有就是对象的大多数状态可以是外部状态,如果删除对象的外部状态,那么可以用相对较少的共享对象取代很多组对象,此时可以考虑使用享元模式。 -------------------------------------------------------------------------------- /DesignPattern/src/com/yrh/pattern/flyweight_pattern/src/Client.java: -------------------------------------------------------------------------------- 1 | package com.yrh.pattern.flyweight_pattern.src; 2 | 3 | /** 4 | * 客户端类 5 | * 6 | * @author Yrh 7 | * 8 | */ 9 | public class Client { 10 | 11 | public static void main(String[] args) { 12 | int e = 22; 13 | 14 | FlyweightFactory f = new FlyweightFactory(); 15 | 16 | Flyweight fx = f.getFlyweight("X"); 17 | fx.operation(--e); 18 | 19 | Flyweight fy = f.getFlyweight("Y"); 20 | fy.operation(--e); 21 | 22 | Flyweight fz = f.getFlyweight("Z"); 23 | fz.operation(--e); 24 | 25 | Flyweight uf = new UnsharedConcreteFlyweight(); 26 | uf.operation(--e);; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /DesignPattern/src/com/yrh/pattern/flyweight_pattern/src/ConcreteFlyweight.java: -------------------------------------------------------------------------------- 1 | package com.yrh.pattern.flyweight_pattern.src; 2 | 3 | /** 4 | * 具体享元类 5 | * @author Yrh 6 | * 7 | */ 8 | public class ConcreteFlyweight extends Flyweight { 9 | 10 | @Override 11 | public void operation(int extrinsicstate) { 12 | System.out.println("具体 Flyweight:" + extrinsicstate); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /DesignPattern/src/com/yrh/pattern/flyweight_pattern/src/Flyweight.java: -------------------------------------------------------------------------------- 1 | package com.yrh.pattern.flyweight_pattern.src; 2 | 3 | /** 4 | * 享元类 5 | * @author Yrh 6 | * 7 | */ 8 | public abstract class Flyweight { 9 | public abstract void operation(int extrinsicstate); 10 | } 11 | -------------------------------------------------------------------------------- /DesignPattern/src/com/yrh/pattern/flyweight_pattern/src/FlyweightFactory.java: -------------------------------------------------------------------------------- 1 | package com.yrh.pattern.flyweight_pattern.src; 2 | 3 | import java.util.Hashtable; 4 | 5 | /** 6 | * 享元工厂类 7 | * @author Yrh 8 | * 9 | */ 10 | public class FlyweightFactory { 11 | private Hashtable flyweights = new Hashtable<>(); 12 | 13 | public FlyweightFactory() { 14 | flyweights.put("X", new ConcreteFlyweight()); 15 | flyweights.put("Y", new ConcreteFlyweight()); 16 | flyweights.put("Z", new ConcreteFlyweight()); 17 | } 18 | 19 | public Flyweight getFlyweight(String key) { 20 | return flyweights.get(key); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /DesignPattern/src/com/yrh/pattern/flyweight_pattern/src/UnsharedConcreteFlyweight.java: -------------------------------------------------------------------------------- 1 | package com.yrh.pattern.flyweight_pattern.src; 2 | 3 | /** 4 | * 不需要共享的具体享元类 5 | * @author Yrh 6 | * 7 | */ 8 | public class UnsharedConcreteFlyweight extends Flyweight { 9 | 10 | @Override 11 | public void operation(int extrinsicstate) { 12 | System.out.println("不共享的具体 Flyweight:" + extrinsicstate); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /DesignPattern/src/com/yrh/pattern/interpreter_pattern/README.md: -------------------------------------------------------------------------------- 1 | # 解释器模式 2 | 3 | 1. 解释器模式(interpreter),给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。 4 | 5 | 2. 如果一种特定类型的问题发生的频率足够高,那么可能就值得将该问题的各个实例表述为一个简单语言中的句子。这样就可以构建一个解释器,该解释器通过解释这些句子来解决该问题。 6 | 7 | 3. 通常当有一个语言需要解释执行,并且你可将该语言中的句子表示为一个抽象语法树时,可使用解释器模式。 8 | 9 | 4. 解释器模式的好处:可以很容易地改变和扩展文法,因为该模式使用类来表示文法规则,可使用继承来改变或扩展该文法。也比较容易实现文法,因为定义抽象语法树中各个节点的类实现大体类似,这些类都易于直接编写。 10 | 11 | 5. 解释器模式的不足:解释器模式为文法中的每一条规则至少定义了一个类,因此包含许多规则的文法可能难以管理和维护。建议当文法非常复杂时,使用其他的技术如语法分析程序或编译器生成器来处理。 -------------------------------------------------------------------------------- /DesignPattern/src/com/yrh/pattern/interpreter_pattern/src/AbstractExpression.java: -------------------------------------------------------------------------------- 1 | package com.yrh.pattern.interpreter_pattern.src; 2 | 3 | /** 4 | * 抽象表达式类 5 | * @author Yrh 6 | * 7 | */ 8 | public abstract class AbstractExpression { 9 | public abstract void interpret(Context context); 10 | } 11 | -------------------------------------------------------------------------------- /DesignPattern/src/com/yrh/pattern/interpreter_pattern/src/Client.java: -------------------------------------------------------------------------------- 1 | package com.yrh.pattern.interpreter_pattern.src; 2 | 3 | import java.util.ArrayList; 4 | import java.util.List; 5 | 6 | /** 7 | * 客户端类 8 | * 9 | * @author Yrh 10 | * 11 | */ 12 | public class Client { 13 | 14 | public static void main(String[] args) { 15 | Context context = new Context(); 16 | 17 | List list = new ArrayList<>(); 18 | list.add(new TerminalExpression()); 19 | list.add(new NonterminalExpression()); 20 | list.add(new TerminalExpression()); 21 | list.add(new TerminalExpression()); 22 | 23 | for (AbstractExpression exp : list) { 24 | exp.interpret(context); 25 | } 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /DesignPattern/src/com/yrh/pattern/interpreter_pattern/src/Context.java: -------------------------------------------------------------------------------- 1 | package com.yrh.pattern.interpreter_pattern.src; 2 | 3 | /** 4 | * 上下文类 5 | * @author Yrh 6 | * 7 | */ 8 | public class Context { 9 | private String input; 10 | private String output; 11 | 12 | public String getInput() { 13 | return input; 14 | } 15 | public void setInput(String input) { 16 | this.input = input; 17 | } 18 | public String getOutput() { 19 | return output; 20 | } 21 | public void setOutput(String output) { 22 | this.output = output; 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /DesignPattern/src/com/yrh/pattern/interpreter_pattern/src/NonterminalExpression.java: -------------------------------------------------------------------------------- 1 | package com.yrh.pattern.interpreter_pattern.src; 2 | 3 | /** 4 | * 非终结符表达式类 5 | * @author Yrh 6 | * 7 | */ 8 | public class NonterminalExpression extends AbstractExpression { 9 | 10 | @Override 11 | public void interpret(Context context) { 12 | System.out.println("非终端解释器"); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /DesignPattern/src/com/yrh/pattern/interpreter_pattern/src/TerminalExpression.java: -------------------------------------------------------------------------------- 1 | package com.yrh.pattern.interpreter_pattern.src; 2 | 3 | /** 4 | * 终结符表达式类 5 | * @author Yrh 6 | * 7 | */ 8 | public class TerminalExpression extends AbstractExpression { 9 | 10 | @Override 11 | public void interpret(Context context) { 12 | System.out.println("终端解释器"); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /DesignPattern/src/com/yrh/pattern/iterator_pattern/README.md: -------------------------------------------------------------------------------- 1 | # 迭代器模式 2 | 3 | 1. 迭代器模式(Iterator),提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示。 4 | 5 | 2. 当需要访问一个聚集对象,而且不管这些对象是什么都需要遍历的时候,就应该考虑迭代器模式。 6 | 7 | 3. 为遍历不同的聚集结构提供如开始、下一个、是否结束、当前哪一项等统一的接口。 8 | 9 | 4. 迭代器(Iterator)模式就是分离了集合对象的遍历行为,抽象出一个迭代器类来负责,这样既可以做到不暴露集合的内部结构,又可以让外部代码透明地访问集合内部的数据。 -------------------------------------------------------------------------------- /DesignPattern/src/com/yrh/pattern/iterator_pattern/src/Aggregate.java: -------------------------------------------------------------------------------- 1 | package com.yrh.pattern.iterator_pattern.src; 2 | 3 | /** 4 | * 抽象聚集类 5 | * @author Yrh 6 | * 7 | */ 8 | public abstract class Aggregate { 9 | public abstract Iterator createIterator(); 10 | } 11 | -------------------------------------------------------------------------------- /DesignPattern/src/com/yrh/pattern/iterator_pattern/src/Client.java: -------------------------------------------------------------------------------- 1 | package com.yrh.pattern.iterator_pattern.src; 2 | 3 | /** 4 | * 客户端类 5 | * @author Yrh 6 | * 7 | */ 8 | public class Client { 9 | 10 | public static void main(String[] args) { 11 | ConcreteAggregate a = new ConcreteAggregate(); 12 | 13 | a.add(0, "A"); 14 | a.add(1, "B"); 15 | a.add(2, "C"); 16 | a.add(3, "D"); 17 | a.add(4, "E"); 18 | a.add(5, "F"); 19 | a.add(6, "G"); 20 | 21 | Iterator iter = a.createIterator(); 22 | 23 | while (!iter.isDone()) { 24 | System.out.println(iter.currentItem()); 25 | iter.next(); 26 | } 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /DesignPattern/src/com/yrh/pattern/iterator_pattern/src/ConcreteAggregate.java: -------------------------------------------------------------------------------- 1 | package com.yrh.pattern.iterator_pattern.src; 2 | 3 | import java.util.ArrayList; 4 | import java.util.List; 5 | 6 | /** 7 | * 具体聚集类 8 | * @author Yrh 9 | * 10 | */ 11 | public class ConcreteAggregate extends Aggregate { 12 | 13 | private List items = new ArrayList<>(); 14 | 15 | @Override 16 | public Iterator createIterator() { 17 | return new ConcreteIterator(this); 18 | } 19 | 20 | public int getCount() { 21 | return items.size(); 22 | } 23 | 24 | public Object get(int index) { 25 | return items.get(index); 26 | } 27 | 28 | public void add(int index, Object o) { 29 | items.add(index, o); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /DesignPattern/src/com/yrh/pattern/iterator_pattern/src/Iterator.java: -------------------------------------------------------------------------------- 1 | package com.yrh.pattern.iterator_pattern.src; 2 | 3 | /** 4 | * 迭代抽象类 5 | * @author Yrh 6 | * 7 | */ 8 | public abstract class Iterator { 9 | public abstract Object first(); 10 | public abstract Object next(); 11 | public abstract boolean isDone(); 12 | public abstract Object currentItem(); 13 | } 14 | -------------------------------------------------------------------------------- /DesignPattern/src/com/yrh/pattern/mediator_pattern/README.md: -------------------------------------------------------------------------------- 1 | # 中介者模式 2 | 3 | 1. 中介者模式(Mediator),用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。 4 | 5 | 2. 中介者模式很容易在系统中应用,也很容易在系统中误用。当系统出现了**多对多**交互复杂的对象群时,不要急于使用中介者模式,而要先反思你的系统在设计上是不是合理。 6 | 7 | 3. 中介者模式一般应用于一组对象以定义良好但是复杂的方式进行通信的场合,以及想定制一个分布在多个类中的行为,而又不想生成太多的子类的场合。 -------------------------------------------------------------------------------- /DesignPattern/src/com/yrh/pattern/mediator_pattern/src/Client.java: -------------------------------------------------------------------------------- 1 | package com.yrh.pattern.mediator_pattern.src; 2 | 3 | /** 4 | * 客户端类 5 | * @author Yrh 6 | * 7 | */ 8 | public class Client { 9 | 10 | public static void main(String[] args) { 11 | ConcreteMediator m = new ConcreteMediator(); 12 | 13 | ConcreteColleague1 c1 = new ConcreteColleague1(m); 14 | ConcreteColleague2 c2 = new ConcreteColleague2(m); 15 | 16 | m.setColleague1(c1); 17 | m.setColleague2(c2); 18 | 19 | c1.send("吃饭了吗?"); 20 | c2.send("没有"); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /DesignPattern/src/com/yrh/pattern/mediator_pattern/src/Colleague.java: -------------------------------------------------------------------------------- 1 | package com.yrh.pattern.mediator_pattern.src; 2 | 3 | /** 4 | * 抽象同事类 5 | * @author Yrh 6 | * 7 | */ 8 | public abstract class Colleague { 9 | protected Mediator mediator; 10 | 11 | public Colleague(Mediator mediator) { 12 | this.mediator = mediator; 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /DesignPattern/src/com/yrh/pattern/mediator_pattern/src/ConcreteColleague1.java: -------------------------------------------------------------------------------- 1 | package com.yrh.pattern.mediator_pattern.src; 2 | 3 | /** 4 | * 具体同事类1 5 | * @author Yrh 6 | * 7 | */ 8 | public class ConcreteColleague1 extends Colleague { 9 | 10 | public ConcreteColleague1(Mediator mediator) { 11 | super(mediator); 12 | } 13 | 14 | public void send(String message) { 15 | mediator.send(message, this); 16 | } 17 | 18 | public void notify(String message) { 19 | System.out.println("同事1得到消息:" + message); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /DesignPattern/src/com/yrh/pattern/mediator_pattern/src/ConcreteColleague2.java: -------------------------------------------------------------------------------- 1 | package com.yrh.pattern.mediator_pattern.src; 2 | 3 | /** 4 | * 具体同事类2 5 | * @author Yrh 6 | * 7 | */ 8 | public class ConcreteColleague2 extends Colleague { 9 | 10 | public ConcreteColleague2(Mediator mediator) { 11 | super(mediator); 12 | } 13 | 14 | public void send(String message) { 15 | mediator.send(message, this); 16 | } 17 | 18 | public void notify(String message) { 19 | System.out.println("同事2得到信息:" + message); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /DesignPattern/src/com/yrh/pattern/mediator_pattern/src/ConcreteMediator.java: -------------------------------------------------------------------------------- 1 | package com.yrh.pattern.mediator_pattern.src; 2 | 3 | /** 4 | * 具体中介者类 5 | * @author Yrh 6 | * 7 | */ 8 | public class ConcreteMediator extends Mediator { 9 | private ConcreteColleague1 colleague1; 10 | private ConcreteColleague2 colleague2; 11 | 12 | public void setColleague1(ConcreteColleague1 colleague1) { 13 | this.colleague1 = colleague1; 14 | } 15 | 16 | public void setColleague2(ConcreteColleague2 colleague2) { 17 | this.colleague2 = colleague2; 18 | } 19 | 20 | @Override 21 | public void send(String message, Colleague colleague) { 22 | if (colleague == colleague1) { 23 | colleague2.notify(message); 24 | } else { 25 | colleague1.notify(message); 26 | } 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /DesignPattern/src/com/yrh/pattern/mediator_pattern/src/Mediator.java: -------------------------------------------------------------------------------- 1 | package com.yrh.pattern.mediator_pattern.src; 2 | 3 | /** 4 | * 抽象同事类 5 | * @author Yrh 6 | * 7 | */ 8 | public abstract class Mediator { 9 | 10 | public abstract void send(String message, Colleague colleague); 11 | } 12 | -------------------------------------------------------------------------------- /DesignPattern/src/com/yrh/pattern/memento_pattern/README.md: -------------------------------------------------------------------------------- 1 | # 备忘录模式 2 | 3 | 1. 备忘录(Memento):在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。 4 | 5 | 2. 将要保存的细节封装在 Memento 中,之后需要更改保存的细节也不会影响客户端。 6 | 7 | 3. Memento 模式比较适用于功能比较复杂的,但需要维护或记录属性历史的类,或者需要保存的属性只是众多属性中的一小部分时,Originator 可以根据保存的 Memento 信息还原到前一状态。 -------------------------------------------------------------------------------- /DesignPattern/src/com/yrh/pattern/memento_pattern/src/Caretaker.java: -------------------------------------------------------------------------------- 1 | package com.yrh.pattern.memento_pattern.src; 2 | 3 | /** 4 | * 管理者类 5 | * @author Yrh 6 | * 7 | */ 8 | public class Caretaker { 9 | private Memento memento; 10 | 11 | public Memento getMemento() { 12 | return memento; 13 | } 14 | 15 | public void setMemento(Memento memento) { 16 | this.memento = memento; 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /DesignPattern/src/com/yrh/pattern/memento_pattern/src/Memento.java: -------------------------------------------------------------------------------- 1 | package com.yrh.pattern.memento_pattern.src; 2 | 3 | /** 4 | * 备忘录类 5 | * @author Yrh 6 | * 7 | */ 8 | public class Memento { 9 | private String state; // 状态 10 | 11 | public Memento(String state) { 12 | this.state = state; 13 | } 14 | 15 | public String getState() { 16 | return state; 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /DesignPattern/src/com/yrh/pattern/memento_pattern/src/Originator.java: -------------------------------------------------------------------------------- 1 | package com.yrh.pattern.memento_pattern.src; 2 | 3 | /** 4 | * 发起人类 5 | * @author Yrh 6 | * 7 | */ 8 | public class Originator { 9 | private String state; 10 | 11 | public Memento createMemento() { 12 | return new Memento(state); 13 | } 14 | 15 | public void setMemento(Memento memento) { 16 | state = memento.getState(); 17 | } 18 | 19 | public void show() { 20 | System.out.println("State = " + state); 21 | } 22 | 23 | public String getState() { 24 | return state; 25 | } 26 | 27 | public void setState(String state) { 28 | this.state = state; 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /DesignPattern/src/com/yrh/pattern/observer_pattern/README.md: -------------------------------------------------------------------------------- 1 | # 观察者模式(又叫发布-订阅 publish/subscribe 模式) 2 | 3 | 1. 观察者模式(Observer pattern)定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。 4 | 5 | 2. 观察者模式特点:将一个系统分割成一系列相互协作的类有一个很不好的副作用,那就是需要维护相关对象间的一致性。我们不希望为了维持一致性而使各类紧密耦合,这样会给维护、扩展和重用都带来不便。 6 | 7 | 3. 使用观察者模式的时机:当一个对象的改变需要同时改变其他对象,而且它不知道具体有多少对象有待改变时,应该考虑使用观察者模式。同时还有当一个抽象模型有两个方面,其中一方面依赖于另一方面,这时用观察者模式可以将这两者封装在独立的对象中使它们各自独立地改变和复用。 8 | 9 | 4. 观察者模式所做的工作其实就是在解除耦合。让耦合的双方都依赖于抽象,而不依赖于具体。 -------------------------------------------------------------------------------- /DesignPattern/src/com/yrh/pattern/observer_pattern/src/Client.java: -------------------------------------------------------------------------------- 1 | package com.yrh.pattern.observer_pattern.src; 2 | 3 | /** 4 | * 客户端类 5 | * @author Yrh 6 | * 7 | */ 8 | public class Client { 9 | 10 | public static void main(String[] args) { 11 | Subject girl = new ConcreteSubject(); 12 | 13 | Observer boy1 = new ConcreteObserver(); 14 | Observer boy2 = new ConcreteObserver(); 15 | Observer boy3 = new ConcreteObserver(); 16 | 17 | girl.addObserver(boy1); 18 | girl.addObserver(boy2); 19 | girl.addObserver(boy3); 20 | 21 | girl.notifyAll("开心"); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /DesignPattern/src/com/yrh/pattern/observer_pattern/src/ConcreteObserver.java: -------------------------------------------------------------------------------- 1 | package com.yrh.pattern.observer_pattern.src; 2 | 3 | /** 4 | * 具体观察者类 5 | * @author Yrh 6 | * 7 | */ 8 | public class ConcreteObserver implements Observer { 9 | 10 | /** 11 | * 当主题发布更新时,执行的操作 12 | */ 13 | @Override 14 | public void update(String str) { 15 | System.out.println("ConcreteObserver : update : " + str); 16 | } 17 | 18 | } 19 | -------------------------------------------------------------------------------- /DesignPattern/src/com/yrh/pattern/observer_pattern/src/Observer.java: -------------------------------------------------------------------------------- 1 | package com.yrh.pattern.observer_pattern.src; 2 | 3 | /** 4 | * 抽象观察者接口 5 | * @author Yrh 6 | * 7 | */ 8 | public interface Observer { 9 | 10 | /** 11 | * 更新函数 12 | * @param str 更新状态 13 | */ 14 | public void update(String str); 15 | } 16 | -------------------------------------------------------------------------------- /DesignPattern/src/com/yrh/pattern/observer_pattern/src/Subject.java: -------------------------------------------------------------------------------- 1 | package com.yrh.pattern.observer_pattern.src; 2 | 3 | /** 4 | * 抽象主题接口 5 | * @author Yrh 6 | * 7 | */ 8 | public interface Subject { 9 | 10 | /** 11 | * 添加观察者 12 | * @param observer 观察者 13 | */ 14 | public void addObserver(Observer observer); 15 | 16 | /** 17 | * 删除观察者 18 | * @param observer 观察者 19 | */ 20 | public void removeObserver(Observer observer); 21 | 22 | /** 23 | * 发起通知 24 | * @param str 通知状态 25 | */ 26 | public void notifyAll(String str); 27 | } 28 | -------------------------------------------------------------------------------- /DesignPattern/src/com/yrh/pattern/prototype_pattern/README.md: -------------------------------------------------------------------------------- 1 | # 原型模式 2 | 3 | 1. 原型模式(Prototype),用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。 4 | 5 | 2. 原型模式其实就是从一个对象再创建另外一个可定制的对象,而且不需要知道任何创建的细节。 6 | 7 | 3. 一般在初始化的信息不发生变化的情况下,克隆是最好的办法。既隐藏了对象创建的细节,又大大提高了性能。 8 | 9 | 4. 它不用重新初始化对象,而是动态地获得对象运行时的状态。 -------------------------------------------------------------------------------- /DesignPattern/src/com/yrh/pattern/prototype_pattern/src/Client.java: -------------------------------------------------------------------------------- 1 | package com.yrh.pattern.prototype_pattern.src; 2 | 3 | /** 4 | * 客户端类 5 | * @author Yrh 6 | * 7 | */ 8 | public class Client { 9 | public static void main(String[] args) { 10 | ConcretePrototype cp = new ConcretePrototype(); 11 | 12 | for (int i = 0; i < 10; i++) { 13 | ConcretePrototype clonecp = (ConcretePrototype)cp.clone(); 14 | clonecp.show(); 15 | } 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /DesignPattern/src/com/yrh/pattern/prototype_pattern/src/ConcretePrototype.java: -------------------------------------------------------------------------------- 1 | package com.yrh.pattern.prototype_pattern.src; 2 | 3 | /** 4 | * 具体类 5 | * @author Yrh 6 | * 7 | */ 8 | public class ConcretePrototype extends Prototype { 9 | public void show() { 10 | System.out.println("原型模式实现类"); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /DesignPattern/src/com/yrh/pattern/prototype_pattern/src/Prototype.java: -------------------------------------------------------------------------------- 1 | package com.yrh.pattern.prototype_pattern.src; 2 | 3 | /** 4 | * 原型类 5 | * @author Yrh 6 | * 7 | */ 8 | public class Prototype implements Cloneable { 9 | public Prototype clone() { 10 | Prototype prototype = null; 11 | try { 12 | prototype = (Prototype)super.clone(); 13 | } catch(CloneNotSupportedException e) { 14 | e.printStackTrace(); 15 | } 16 | return prototype; 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /DesignPattern/src/com/yrh/pattern/proxy_pattern/README.md: -------------------------------------------------------------------------------- 1 | # 代理模式 2 | 3 | 1. 代理模式(Proxy),为其他对象提供一种代理以控制对这个对象的访问。 4 | 5 | 2. 代理模式适用的场合: 6 | 7 | 1. **远程代理**,也就是为一个对象在不同的地址空间提供局部代表。这样可以隐藏一个对象存在于不同地址空间的事实。(WebService) 8 | 9 | 2. **虚拟代理**,是根据需要创建开销很大的对象。通过它来存放实例化需要很长时间的真是对象。(浏览器使用代理模式优化下载) 10 | 11 | 3. **安全代理**,用来控制真实对象访问时的权限。 12 | 13 | 4. **智能指引**,是指当调用真实的对象时,代理处理另外一些事。 -------------------------------------------------------------------------------- /DesignPattern/src/com/yrh/pattern/proxy_pattern/src/Client.java: -------------------------------------------------------------------------------- 1 | package com.yrh.pattern.proxy_pattern.src; 2 | 3 | /** 4 | * 客户端类 5 | * @author Yrh 6 | * 7 | */ 8 | public class Client { 9 | 10 | public static void main(String[] args) { 11 | Proxy proxy = new Proxy(); 12 | 13 | proxy.request(); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /DesignPattern/src/com/yrh/pattern/proxy_pattern/src/Proxy.java: -------------------------------------------------------------------------------- 1 | package com.yrh.pattern.proxy_pattern.src; 2 | 3 | /** 4 | * 代理类 5 | * @author Yrh 6 | * 7 | */ 8 | public class Proxy implements Subject { 9 | 10 | private RealSubject realSubject; // 持有真实实体的引用 11 | 12 | @Override 13 | public void request() { 14 | if (realSubject == null) { 15 | realSubject = new RealSubject(); 16 | } 17 | 18 | System.out.println("事务之前"); 19 | 20 | // 执行事务 21 | realSubject.request(); 22 | 23 | System.out.println("事务之后"); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /DesignPattern/src/com/yrh/pattern/proxy_pattern/src/RealSubject.java: -------------------------------------------------------------------------------- 1 | package com.yrh.pattern.proxy_pattern.src; 2 | 3 | /** 4 | * 真实实体类 5 | * @author Yrh 6 | * 7 | */ 8 | public class RealSubject implements Subject{ 9 | 10 | @Override 11 | public void request() { 12 | System.out.println("真实的请求"); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /DesignPattern/src/com/yrh/pattern/proxy_pattern/src/Subject.java: -------------------------------------------------------------------------------- 1 | package com.yrh.pattern.proxy_pattern.src; 2 | 3 | /** 4 | * 公用接口 5 | * @author Yrh 6 | * 7 | */ 8 | public interface Subject { 9 | 10 | public void request(); 11 | } 12 | -------------------------------------------------------------------------------- /DesignPattern/src/com/yrh/pattern/simple_factory_pattern/README.md: -------------------------------------------------------------------------------- 1 | # 简单工厂模式 -------------------------------------------------------------------------------- /DesignPattern/src/com/yrh/pattern/simple_factory_pattern/src/operation/Operation.java: -------------------------------------------------------------------------------- 1 | package com.yrh.pattern.simple_factory_pattern.src.operation; 2 | 3 | /** 4 | * 运算抽象类 5 | * @author Yrh 6 | * 7 | */ 8 | public abstract class Operation { 9 | private double numberA = 0; 10 | private double numberB = 0; 11 | 12 | public abstract double getResult(); 13 | 14 | /* get && set */ 15 | public double getNumberA() { 16 | return numberA; 17 | } 18 | public void setNumberA(double numberA) { 19 | this.numberA = numberA; 20 | } 21 | public double getNumberB() { 22 | return numberB; 23 | } 24 | public void setNumberB(double numberB) { 25 | this.numberB = numberB; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /DesignPattern/src/com/yrh/pattern/simple_factory_pattern/src/operation/OperationAdd.java: -------------------------------------------------------------------------------- 1 | package com.yrh.pattern.simple_factory_pattern.src.operation; 2 | 3 | /** 4 | * 加法运算类 5 | * @author Yrh 6 | * 7 | */ 8 | public class OperationAdd extends Operation { 9 | 10 | @Override 11 | public double getResult() { 12 | double result; 13 | result = getNumberA() + getNumberB(); 14 | return result; 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /DesignPattern/src/com/yrh/pattern/simple_factory_pattern/src/operation/OperationDiv.java: -------------------------------------------------------------------------------- 1 | package com.yrh.pattern.simple_factory_pattern.src.operation; 2 | 3 | /** 4 | * 除法运算类 5 | * @author Yrh 6 | * 7 | */ 8 | public class OperationDiv extends Operation { 9 | 10 | @Override 11 | public double getResult() { 12 | double result = 0; 13 | if (getNumberB() == 0) { 14 | throw new ArithmeticException("除数不能为0!"); 15 | } 16 | result = getNumberA() / getNumberB(); 17 | return result; 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /DesignPattern/src/com/yrh/pattern/simple_factory_pattern/src/operation/OperationMul.java: -------------------------------------------------------------------------------- 1 | package com.yrh.pattern.simple_factory_pattern.src.operation; 2 | 3 | /** 4 | * 乘法运算类 5 | * @author Yrh 6 | * 7 | */ 8 | public class OperationMul extends Operation { 9 | 10 | @Override 11 | public double getResult() { 12 | double result = 0; 13 | result = getNumberA() * getNumberB(); 14 | return result; 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /DesignPattern/src/com/yrh/pattern/simple_factory_pattern/src/operation/OperationPow.java: -------------------------------------------------------------------------------- 1 | package com.yrh.pattern.simple_factory_pattern.src.operation; 2 | 3 | /** 4 | * 次方运算类 5 | * @author Yrh 6 | * 7 | */ 8 | public class OperationPow extends Operation { 9 | 10 | @Override 11 | public double getResult() { 12 | double result; 13 | result = Math.pow(getNumberA(), getNumberB()); 14 | return result; 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /DesignPattern/src/com/yrh/pattern/simple_factory_pattern/src/operation/OperationSub.java: -------------------------------------------------------------------------------- 1 | package com.yrh.pattern.simple_factory_pattern.src.operation; 2 | 3 | /** 4 | * 减法运算类 5 | * @author Yrh 6 | * 7 | */ 8 | public class OperationSub extends Operation { 9 | 10 | @Override 11 | public double getResult() { 12 | double result = 0; 13 | result = getNumberA() - getNumberB(); 14 | return result; 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /DesignPattern/src/com/yrh/pattern/singleton_pattern/README.md: -------------------------------------------------------------------------------- 1 | # 单例模式 2 | 3 | 1. 单例模式(Singleton),保证一个类仅有一个实例,并提供一个访问它的全局访问点。 4 | 5 | 2. 通常我们可以让一个全局变量使得一个对象被访问,但它不能防止你实例化多个对象。一个最好的办法就是,让类自身负责保存它的唯一实例。这个类可以保证没有其他实例可以被创建,并且它可以提供一个访问该实例的方法。 6 | 7 | 3. 单例模式因为 Singleton 类封装它的唯一实例,这样它可以严格地控制客户怎样访问它以及何时访问它。简单地说就是对唯一实例的受控访问。 -------------------------------------------------------------------------------- /DesignPattern/src/com/yrh/pattern/singleton_pattern/src/Client.java: -------------------------------------------------------------------------------- 1 | package com.yrh.pattern.singleton_pattern.src; 2 | 3 | /** 4 | * 客户端类 5 | * @author Yrh 6 | * 7 | */ 8 | public class Client { 9 | 10 | public static void main(String[] args) { 11 | Singleton s1 = Singleton.getInstance(); 12 | Singleton s2 = Singleton.getInstance(); 13 | 14 | System.out.println("s1==s2? " + (s1 == s2)); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /DesignPattern/src/com/yrh/pattern/singleton_pattern/src/Singleton.java: -------------------------------------------------------------------------------- 1 | package com.yrh.pattern.singleton_pattern.src; 2 | 3 | /** 4 | * 单例类 5 | * @author Yrh 6 | * 7 | */ 8 | public class Singleton { 9 | 10 | private static Singleton instance; 11 | 12 | /** 13 | * 私有的构造方法 14 | */ 15 | private Singleton() { 16 | } 17 | 18 | public static Singleton getInstance() { 19 | if (instance == null) { 20 | instance = new Singleton(); 21 | } 22 | 23 | return instance; 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /DesignPattern/src/com/yrh/pattern/singleton_pattern/src/SingletonMultiProcess.java: -------------------------------------------------------------------------------- 1 | package com.yrh.pattern.singleton_pattern.src; 2 | 3 | /** 4 | * 多线程单例模式 5 | * @author Yrh 6 | * 7 | */ 8 | public class SingletonMultiProcess { 9 | 10 | private static SingletonMultiProcess instance; 11 | private static byte[] lock = new byte[1]; 12 | 13 | private SingletonMultiProcess() { 14 | } 15 | 16 | public static SingletonMultiProcess getInstance() { 17 | if (instance == null) { 18 | synchronized (lock) { 19 | if (instance == null) { 20 | instance = new SingletonMultiProcess(); 21 | } 22 | } 23 | } 24 | 25 | return instance; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /DesignPattern/src/com/yrh/pattern/state_pattern/README.md: -------------------------------------------------------------------------------- 1 | # 状态模式 2 | 3 | 1. 状态模式(State pattern),当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。 4 | 5 | 2. 状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况。把状态的判断逻辑转移到表示不同状态的一系列类当中,可以把复杂的判断逻辑简化。 6 | 7 | 3. 状态模式的好处是将与特定状态相关的行为局部化,并且将不同状态的行为分割开来。将特定的状态相关的行为都放入一个对象中,由于所有与状态相关的代码都存在于某个具体状态中,所以通过定义新的子类可以很容易地增加新的状态和转换。 8 | 9 | 4. 状态模式通过把各种状态转移逻辑分布到状态的子类之间,来减少相互间的依赖。 10 | 11 | 5. 使用状态模式的时机:当一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为时,就可以考虑使用状态模式了。 -------------------------------------------------------------------------------- /DesignPattern/src/com/yrh/pattern/state_pattern/src/Client.java: -------------------------------------------------------------------------------- 1 | package com.yrh.pattern.state_pattern.src; 2 | 3 | /** 4 | * 客户端类 5 | * @author Yrh 6 | * 7 | */ 8 | public class Client { 9 | 10 | public static void main(String[] args) { 11 | Context c = new Context(new ConcreteStateA()); 12 | 13 | c.request(); 14 | c.request(); 15 | c.request(); 16 | c.request(); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /DesignPattern/src/com/yrh/pattern/state_pattern/src/ConcreteStateA.java: -------------------------------------------------------------------------------- 1 | package com.yrh.pattern.state_pattern.src; 2 | 3 | /** 4 | * 具体状态类A 5 | * @author Yrh 6 | * 7 | */ 8 | public class ConcreteStateA extends State { 9 | 10 | @Override 11 | public void handler(Context context) { 12 | // 设置下一状态 13 | context.setState(new ConcreteStateB()); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /DesignPattern/src/com/yrh/pattern/state_pattern/src/ConcreteStateB.java: -------------------------------------------------------------------------------- 1 | package com.yrh.pattern.state_pattern.src; 2 | 3 | /** 4 | * 具体状态类B 5 | * @author Yrh 6 | * 7 | */ 8 | public class ConcreteStateB extends State { 9 | 10 | @Override 11 | public void handler(Context context) { 12 | // 设置下一状态 13 | context.setState(new ConcreteStateA()); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /DesignPattern/src/com/yrh/pattern/state_pattern/src/Context.java: -------------------------------------------------------------------------------- 1 | package com.yrh.pattern.state_pattern.src; 2 | 3 | /** 4 | * 上下文类 5 | * @author Yrh 6 | * 7 | */ 8 | public class Context { 9 | 10 | private State state; 11 | 12 | public Context(State state) { 13 | this.state = state; 14 | } 15 | 16 | public void request() { 17 | state.handler(this); 18 | } 19 | 20 | public State getState() { 21 | return state; 22 | } 23 | 24 | public void setState(State state) { 25 | this.state = state; 26 | System.out.println("当前状态为:" + state.getClass().getName()); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /DesignPattern/src/com/yrh/pattern/state_pattern/src/State.java: -------------------------------------------------------------------------------- 1 | package com.yrh.pattern.state_pattern.src; 2 | 3 | /** 4 | * 抽象状态类 5 | * @author Yrh 6 | * 7 | */ 8 | public abstract class State { 9 | public abstract void handler(Context context); 10 | } 11 | -------------------------------------------------------------------------------- /DesignPattern/src/com/yrh/pattern/strategy_pattern/README.md: -------------------------------------------------------------------------------- 1 | # 策略模式 2 | 3 | 1. **策略模式(Strategy)**:它定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的客户。 4 | 5 | 2. 策略模式是一种定义一系列算法的方法,从概念上来看,所有这些算法完成的都是相同的工作,只是实现不同,它可以以相同的方式调用所有的算法,减少了各种算法类与使用算法类之间的耦合。 6 | 7 | 3. 策略模式的 Strategy 类层次为 Context 定义了一系列的可供重用的算法或行为。继承有助于析取出这些算法中的公共功能。 8 | 9 | 4. 策略模式的优点是简化了单元测试,因为每个算法都有自己的类,可以通过自己的接口单独测试。 10 | 11 | 5. 当不同的行为堆砌在一个类时,就很难避免使用条件语句来选择合适的行为。将这些行为封装在一个个独立的 Strategy 类中,可以在使用这些行为的类中消除条件语句。 12 | 13 | 6. 策略模式就是用来封装算法的,但在实践中,我们发现可以用它来封装几乎任何类型的规则,只要在分析过程中听到需要在不同时间应用不同的业务规则,就可以考虑使用策略模式处理这种变化的可能性。 14 | 15 | 7. 在基本的策略模式中,选择所用具体实现的职责由客户端对象承担,并转给策略模式的 Context 对象。 -------------------------------------------------------------------------------- /DesignPattern/src/com/yrh/pattern/strategy_pattern/src/CashContext.java: -------------------------------------------------------------------------------- 1 | package com.yrh.pattern.strategy_pattern.src; 2 | 3 | /** 4 | * 收费上下文类 5 | * @author Yrh 6 | * 7 | */ 8 | public class CashContext { 9 | 10 | private CashSuper cashSuper; 11 | 12 | public CashContext(String type, double money) { 13 | switch (type) { 14 | case "正常收费": 15 | cashSuper = new CashNormal(money); 16 | break; 17 | 18 | case "满300反100": 19 | cashSuper = new CashReturn(money, 300, 100); 20 | break; 21 | 22 | case "打8折": 23 | cashSuper = new CashRebate(money, 0.8); 24 | break; 25 | 26 | default: 27 | break; 28 | } 29 | } 30 | 31 | public double getResult() { 32 | return cashSuper.acceptCash(); 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /DesignPattern/src/com/yrh/pattern/strategy_pattern/src/CashNormal.java: -------------------------------------------------------------------------------- 1 | package com.yrh.pattern.strategy_pattern.src; 2 | 3 | /** 4 | * 正常收费类 5 | * @author Yrh 6 | * 7 | */ 8 | public class CashNormal extends CashSuper { 9 | 10 | double money; 11 | 12 | public CashNormal(double money) { 13 | this.money = money; 14 | } 15 | 16 | @Override 17 | public double acceptCash() { 18 | return this.money; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /DesignPattern/src/com/yrh/pattern/strategy_pattern/src/CashRebate.java: -------------------------------------------------------------------------------- 1 | package com.yrh.pattern.strategy_pattern.src; 2 | 3 | /** 4 | * 打折收费 5 | * @author Yrh 6 | * 7 | */ 8 | public class CashRebate extends CashSuper { 9 | 10 | double rate; // 折扣率 11 | double money; 12 | 13 | public CashRebate(double money, double rate) { 14 | this.money = money; 15 | this.rate = rate; 16 | } 17 | 18 | @Override 19 | public double acceptCash() { 20 | return money * rate; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /DesignPattern/src/com/yrh/pattern/strategy_pattern/src/CashReturn.java: -------------------------------------------------------------------------------- 1 | package com.yrh.pattern.strategy_pattern.src; 2 | 3 | /** 4 | * 返利收费类 5 | * @author Yrh 6 | * 7 | */ 8 | public class CashReturn extends CashSuper { 9 | 10 | double moneyCondition; // 返现条件 11 | double moneyReturn; // 返现金额 12 | double money; 13 | 14 | public CashReturn(double money, double moneyCondition, double moneyReturn) { 15 | this.money = money; 16 | this.moneyCondition = moneyCondition; 17 | this.moneyReturn = moneyReturn; 18 | } 19 | 20 | @Override 21 | public double acceptCash() { 22 | return money - (int)(money / moneyCondition) * moneyReturn; 23 | } 24 | 25 | } 26 | -------------------------------------------------------------------------------- /DesignPattern/src/com/yrh/pattern/strategy_pattern/src/CashSuper.java: -------------------------------------------------------------------------------- 1 | package com.yrh.pattern.strategy_pattern.src; 2 | 3 | /** 4 | * 抽象金额类 5 | * @author Yrh 6 | * 7 | */ 8 | public abstract class CashSuper { 9 | 10 | public abstract double acceptCash(); 11 | } 12 | -------------------------------------------------------------------------------- /DesignPattern/src/com/yrh/pattern/strategy_pattern/src/Client.java: -------------------------------------------------------------------------------- 1 | package com.yrh.pattern.strategy_pattern.src; 2 | 3 | import java.util.Scanner; 4 | 5 | /** 6 | * 客户端类 7 | * @author Yrh 8 | * 9 | */ 10 | public class Client { 11 | 12 | public static void main(String[] args) { 13 | Scanner scan = new Scanner(System.in); 14 | 15 | System.out.println("请输入收费类型:"); 16 | String type = scan.next(); 17 | 18 | System.out.println("请输入单价:"); 19 | double price = scan.nextDouble(); 20 | 21 | System.out.println("请输入数量:"); 22 | double number = scan.nextDouble(); 23 | 24 | CashContext cashContext = new CashContext(type, price * number); 25 | 26 | System.out.println("应付金额为:" + cashContext.getResult()); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /DesignPattern/src/com/yrh/pattern/template_method_pattern/README.md: -------------------------------------------------------------------------------- 1 | # 模板方法模式 2 | 3 | 1. 模板方法模式(Template Method Pattern),定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 4 | 5 | 2. 既然用了继承,并且肯定这个继承有意义,就应该要成为子类的模板,所有重复的代码都应该要上升到父类去,而不是让每个子类都去重复。 6 | 7 | 3. 当我们要完成在某一细节层次一致的一个过程或一系列步骤,但其个别步骤在更详细的层次上的实现可能不同时,我们通常考虑用模板方法模式来处理。 8 | 9 | 4. 模板方法模式是通过把不变行为搬移到超类,去除子类中的重复代码来体现它的优势。 10 | 11 | 5. 模板方法模式就是提供了一个很好的代码复用平台。 12 | 13 | 6. 当不变的和可变的行为在方法的子类实现中混合在一起的时候,不变的行为就会在子类中重复出现。通过模板方法模式把这些行为搬移到单一的地方,这样就可以帮助子类拜托重复的不变行为的纠缠。 -------------------------------------------------------------------------------- /DesignPattern/src/com/yrh/pattern/template_method_pattern/src/AbstractClass.java: -------------------------------------------------------------------------------- 1 | package com.yrh.pattern.template_method_pattern.src; 2 | 3 | /** 4 | * 抽象类 5 | * @author Yrh 6 | * 7 | */ 8 | public abstract class AbstractClass { 9 | 10 | /** 11 | * 在父类中将不变的行为进行封装 12 | */ 13 | public void templateMethod() { 14 | System.out.println("Template Method Begin!"); 15 | 16 | // 调用可变的行为 17 | concreteMethodA(); 18 | concreteMethodB(); 19 | 20 | System.out.println("Template Method End!"); 21 | } 22 | 23 | /** 24 | * 留出方法来给子类对具体可变的行为进行修改和扩展 25 | */ 26 | protected abstract void concreteMethodA(); 27 | 28 | protected abstract void concreteMethodB(); 29 | } 30 | -------------------------------------------------------------------------------- /DesignPattern/src/com/yrh/pattern/template_method_pattern/src/Client.java: -------------------------------------------------------------------------------- 1 | package com.yrh.pattern.template_method_pattern.src; 2 | 3 | /** 4 | * 客户端类 5 | * @author Yrh 6 | * 7 | */ 8 | public class Client { 9 | 10 | public static void main(String[] args) { 11 | AbstractClass c; 12 | c = new ConcreteClassA(); 13 | c.templateMethod(); 14 | 15 | c = new ConcreteClassB(); 16 | c.templateMethod(); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /DesignPattern/src/com/yrh/pattern/template_method_pattern/src/ConcreteClassA.java: -------------------------------------------------------------------------------- 1 | package com.yrh.pattern.template_method_pattern.src; 2 | 3 | /** 4 | * 具体实现细节类A 5 | * @author Yrh 6 | * 7 | */ 8 | public class ConcreteClassA extends AbstractClass { 9 | 10 | @Override 11 | public void concreteMethodA() { 12 | System.out.println("ConcreteClassA : concreteMethodA"); 13 | } 14 | 15 | @Override 16 | public void concreteMethodB() { 17 | System.out.println("ConcreteClassA : concreteMethodB"); 18 | } 19 | 20 | } 21 | -------------------------------------------------------------------------------- /DesignPattern/src/com/yrh/pattern/template_method_pattern/src/ConcreteClassB.java: -------------------------------------------------------------------------------- 1 | package com.yrh.pattern.template_method_pattern.src; 2 | 3 | /** 4 | * 具体实现细节类B 5 | * @author Yrh 6 | * 7 | */ 8 | public class ConcreteClassB extends AbstractClass { 9 | 10 | @Override 11 | public void concreteMethodA() { 12 | System.out.println("ConcreteClassB : concreteMethodA"); 13 | } 14 | 15 | @Override 16 | public void concreteMethodB() { 17 | System.out.println("ConcreteClassB : concreteMethodB"); 18 | } 19 | 20 | } 21 | -------------------------------------------------------------------------------- /DesignPattern/src/com/yrh/pattern/visitor_pattern/README.md: -------------------------------------------------------------------------------- 1 | # 访问者模式 2 | 3 | 1. 访问者模式(Visitor),表示一个作用于某对象结构中的个元素的操作。它使你可以在不改变个元素的类的前提下定义作用于这些元素的新操作。 4 | 5 | 2. 访问者模式适用于**数据结构相对稳定的系统**。它把数据结构和作用于结构上的操作之间的耦合解脱开,使得操作集合可以相对自由地演化。 6 | 7 | 3. 访问者模式的目的是要把处理从数据结构中分离出来。如果系统有比较稳定的数据结构,又有易于变化的算法的话,使用访问者模式就是比较合适的,因为访问者模式使得算法操作的增加变得容易。 8 | 9 | 4. 访问者模式的优点就是增加新的操作很容易,因为增加新的操作就意味着增加一个新的访问者。访问者模式将有关的行为集中到一个访问者对象中。 10 | 11 | 5. 访问者模式的缺点就是使增加新的数据结构变得困难了。 -------------------------------------------------------------------------------- /DesignPattern/src/com/yrh/pattern/visitor_pattern/src/Client.java: -------------------------------------------------------------------------------- 1 | package com.yrh.pattern.visitor_pattern.src; 2 | 3 | /** 4 | * 客戶端类 5 | * @author Yrh 6 | * 7 | */ 8 | public class Client { 9 | 10 | public static void main(String[] args) { 11 | ObjectStructure o = new ObjectStructure(); 12 | o.attach(new ConcreteElementA()); 13 | o.attach(new ConcreteElementB()); 14 | 15 | ConcreteVisitor1 v1 = new ConcreteVisitor1(); 16 | ConcreteVisitor2 v2 = new ConcreteVisitor2(); 17 | 18 | o.accept(v1); 19 | o.accept(v2); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /DesignPattern/src/com/yrh/pattern/visitor_pattern/src/ConcreteElementA.java: -------------------------------------------------------------------------------- 1 | package com.yrh.pattern.visitor_pattern.src; 2 | 3 | /** 4 | * 具体元素类A 5 | * @author Yrh 6 | * 7 | */ 8 | public class ConcreteElementA extends Element { 9 | @Override 10 | public void accept(Visitor visitor) { 11 | visitor.visitConcreteElementA(this); 12 | } 13 | 14 | /** 15 | * 其他相关方法 16 | */ 17 | public void operationA() { 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /DesignPattern/src/com/yrh/pattern/visitor_pattern/src/ConcreteElementB.java: -------------------------------------------------------------------------------- 1 | package com.yrh.pattern.visitor_pattern.src; 2 | 3 | /** 4 | * 具体元素类B 5 | * @author Yrh 6 | * 7 | */ 8 | public class ConcreteElementB extends Element{ 9 | 10 | @Override 11 | public void accept(Visitor visitor) { 12 | visitor.visitConcreteElementB(this); 13 | } 14 | 15 | /** 16 | * 其他相关方法 17 | */ 18 | public void operationB() { 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /DesignPattern/src/com/yrh/pattern/visitor_pattern/src/ConcreteVisitor1.java: -------------------------------------------------------------------------------- 1 | package com.yrh.pattern.visitor_pattern.src; 2 | 3 | /** 4 | * 具体访问者类1 5 | * 6 | * @author Yrh 7 | * 8 | */ 9 | public class ConcreteVisitor1 extends Visitor { 10 | 11 | @Override 12 | public void visitConcreteElementA(ConcreteElementA concreteElementA) { 13 | System.out.println(concreteElementA.getClass().getName() + " 被 " + this.getClass().getName() + " 访问"); 14 | } 15 | 16 | @Override 17 | public void visitConcreteElementB(ConcreteElementB concreteElementB) { 18 | System.out.println(concreteElementB.getClass().getName() + " 被 " + this.getClass().getName() + " 访问"); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /DesignPattern/src/com/yrh/pattern/visitor_pattern/src/ConcreteVisitor2.java: -------------------------------------------------------------------------------- 1 | package com.yrh.pattern.visitor_pattern.src; 2 | 3 | /** 4 | * 具体访问者类2 5 | * 6 | * @author Yrh 7 | * 8 | */ 9 | public class ConcreteVisitor2 extends Visitor { 10 | 11 | @Override 12 | public void visitConcreteElementA(ConcreteElementA concreteElementA) { 13 | System.out.println(concreteElementA.getClass().getName() + " 被 " + this.getClass().getName() + " 访问"); 14 | } 15 | 16 | @Override 17 | public void visitConcreteElementB(ConcreteElementB concreteElementB) { 18 | System.out.println(concreteElementB.getClass().getName() + " 被 " + this.getClass().getName() + " 访问"); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /DesignPattern/src/com/yrh/pattern/visitor_pattern/src/Element.java: -------------------------------------------------------------------------------- 1 | package com.yrh.pattern.visitor_pattern.src; 2 | 3 | /** 4 | * 元素抽象类 5 | * @author Yrh 6 | * 7 | */ 8 | public abstract class Element { 9 | public abstract void accept(Visitor visitor); 10 | } 11 | -------------------------------------------------------------------------------- /DesignPattern/src/com/yrh/pattern/visitor_pattern/src/ObjectStructure.java: -------------------------------------------------------------------------------- 1 | package com.yrh.pattern.visitor_pattern.src; 2 | 3 | import java.util.ArrayList; 4 | import java.util.List; 5 | 6 | /** 7 | * 对象结构类 8 | * @author Yrh 9 | * 10 | */ 11 | public class ObjectStructure { 12 | private List elements = new ArrayList<>(); 13 | 14 | public void attach(Element e) { 15 | elements.add(e); 16 | } 17 | 18 | public void detach(Element e) { 19 | elements.remove(e); 20 | } 21 | 22 | public void accept(Visitor visitor) { 23 | for (Element e : elements){ 24 | e.accept(visitor); 25 | } 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /DesignPattern/src/com/yrh/pattern/visitor_pattern/src/Visitor.java: -------------------------------------------------------------------------------- 1 | package com.yrh.pattern.visitor_pattern.src; 2 | 3 | /** 4 | * 访问者抽象类 5 | * @author Yrh 6 | * 7 | */ 8 | public abstract class Visitor { 9 | public abstract void visitConcreteElementA(ConcreteElementA concreteElementA); 10 | 11 | public abstract void visitConcreteElementB(ConcreteElementB concreteElementB); 12 | } 13 | -------------------------------------------------------------------------------- /DesignPattern/src/com/yrh/principle/CARP/README.md: -------------------------------------------------------------------------------- 1 | # 合成/聚合复用原则 2 | 3 | 1. 合成/聚合复用原则(CARP),尽量使用合成/聚合,尽量不要使用类继承。 4 | 5 | 2. 合成(Composition,也有翻译成组合)和聚合(Aggregation)都是关联的特殊种类。**聚合**表示一种**弱的拥有**关系,体现的是 A 对象可以包含 B 对象,但 B 对象不是 A 对象的一部分;**合成**则是一种**强的拥有**关系,体现了严格的部分和整体的关系,部分和整体的生命周期一样。 6 | 7 | 3. 合成/聚合复用原则的好处:优先使用对象的合成/聚合将有助于你保持每个类被封装,并被集中在单个任务上。这样类和类继承层次会保持较小规模,并且不太可能增长为不可控制的庞然大物。 -------------------------------------------------------------------------------- /DesignPattern/src/com/yrh/principle/dependence_inversion_principle/README.md: -------------------------------------------------------------------------------- 1 | # 依赖倒置原则 2 | 3 | 1. 高层模块不应该依赖底层模块。两个都应该依赖抽象。 4 | 5 | 2. 抽象不应该依赖细节。细节应该依赖抽象。 6 | 7 | 3. 依赖倒转其实可以说是面向对象设计的标志,用哪种语言来编写程序不重要,如果编写时考虑的都是如何针对抽象编程而不是针对细节编程,即程序中所有的依赖关系都是终止于抽象类或者接口,那就是面向对象的设计,反之那就是过程化的设计了。 -------------------------------------------------------------------------------- /DesignPattern/src/com/yrh/principle/law_of_demeter_principle/README.md: -------------------------------------------------------------------------------- 1 | # 迪米特法则(也叫“最少知识原则”) 2 | 3 | 1. 如果两个类不必彼此直接通信,那么这两个类就不应当发生直接的相互作用。如果其中一个类需要调用另一个类的某一个方法的话,可以通过第三者转发这个调用。 4 | 5 | 2. 在类的结构设计上,每一个类都应当尽量降低成员的访问权限 6 | 7 | 3. 迪米特法则其根本思想,是强调类之间的松耦合。 8 | 9 | 4. 类之间的耦合越弱,越有利于复用,一个处在弱耦合的类被修改,不会对有关系的类造成波及。 -------------------------------------------------------------------------------- /DesignPattern/src/com/yrh/principle/liskov_substitution_principle/README.md: -------------------------------------------------------------------------------- 1 | # 里氏代换原则 2 | 3 | 1. 一个软件实体如果使用的是一个父类的话,那么一定适用于其子类,而且它察觉不出父类对象和子类对象的区别。也就是说,在软件里面,把父类都替换成它的子类,程序行为没有变化。 4 | 5 | 2. 子类型必须能够替换掉它们的父类型。 6 | 7 | 3. 只有当子类可以替换掉父类,软件单位的功能不受影响时,父类才能真正被复用,而子类也能够在父类的基础上增加新的行为。 8 | 9 | 4. 由于子类型的可替换性才使得使用父类类型的模块在无需修改的情况下就可以扩展。 -------------------------------------------------------------------------------- /DesignPattern/src/com/yrh/principle/open_closed_principle/About.md: -------------------------------------------------------------------------------- 1 | # 开放封闭原则 2 | 3 | 1. 对于扩展是开放的(Open for extension),对于更改是封闭的(Closed for modification)。 4 | 5 | 2. 无论模块是多么对的‘封闭’,都会存在一些无法对之封闭的变化。既然不可能完全封闭,设计人员必须对于他设计的模块应该对哪种变化封闭做出选择。他必须先猜测出最有可能发生的变化种类,然后构造抽象来隔离那些变化。 6 | 7 | 3. 等到变化发生时立即采取行动。 8 | 9 | 4. 在我们最初编写代码时,假设变化不会发生。当变化发生时,我们就创建抽象来隔离以后发生的同类变化。 10 | 11 | 5. 面对需求,对程序的改动是通过增加新代码进行的,而不是更改现有的代码。 12 | 13 | 6. 我们希望的是在开发工作展开不久就可以知道可能发生的变化。查明可能发生的变化所等待的时间越长,要创建正确的抽象就越困难。 14 | 15 | 7. 开放-封闭原则是面向对象设计的核心所在。遵循这个原则可以带来面向对象技术所声称的巨大好处,也就是可维护、可扩展、可复用、灵活性好。开发人员应该仅对程序中呈现出频繁变化的那些部分做出抽象,然而,对于应用程序中的每个部分都刻意地进行抽象同样不是一个好主意。拒绝不成熟的抽象和抽象本身一样重要。 -------------------------------------------------------------------------------- /DesignPattern/src/com/yrh/principle/open_closed_principle/README.md: -------------------------------------------------------------------------------- 1 | # 开放封闭原则 2 | 3 | 1. 对于扩展是开放的(Open for extension),对于更改是封闭的(Closed for modification)。 4 | 5 | 2. 无论模块是多么对的‘封闭’,都会存在一些无法对之封闭的变化。既然不可能完全封闭,设计人员必须对于他设计的模块应该对哪种变化封闭做出选择。他必须先猜测出最有可能发生的变化种类,然后构造抽象来隔离那些变化。 6 | 7 | 3. 等到变化发生时立即采取行动。 8 | 9 | 4. 在我们最初编写代码时,假设变化不会发生。当变化发生时,我们就创建抽象来隔离以后发生的同类变化。 10 | 11 | 5. 面对需求,对程序的改动是通过增加新代码进行的,而不是更改现有的代码。 12 | 13 | 6. 我们希望的是在开发工作展开不久就可以知道可能发生的变化。查明可能发生的变化所等待的时间越长,要创建正确的抽象就越困难。 14 | 15 | 7. 开放-封闭原则是面向对象设计的核心所在。遵循这个原则可以带来面向对象技术所声称的巨大好处,也就是可维护、可扩展、可复用、灵活性好。开发人员应该仅对程序中呈现出频繁变化的那些部分做出抽象,然而,对于应用程序中的每个部分都刻意地进行抽象同样不是一个好主意。拒绝不成熟的抽象和抽象本身一样重要。 -------------------------------------------------------------------------------- /DesignPattern/src/com/yrh/principle/single_responsibility_principle/About.md: -------------------------------------------------------------------------------- 1 | # 单一职责原则 2 | 3 | 1. 就一个类而言,应该仅有一个引起它变化的原因。 4 | 5 | 2. 如果一个类承担的职责过多,就等于把这些职责耦合在一起,一个职责的变化可能会削弱或者抑制这个类完成其他职责的能力。这种耦合会导致脆弱的设计,当变化发生时,设计会遭受到意想不到的破坏。 6 | 7 | 3. 软件设计真正要做的许多内容,就是发现职责并把那些职责相互分离。 8 | 9 | 4. 如果你能够想到多于一个的动机去改变一个类,那么这个类就具有多于一个的职责。 10 | 11 | -------------------------------------------------------------------------------- /DesignPattern/src/com/yrh/principle/single_responsibility_principle/README.md: -------------------------------------------------------------------------------- 1 | # 单一职责原则 2 | 3 | 1. 就一个类而言,应该仅有一个引起它变化的原因。 4 | 5 | 2. 如果一个类承担的职责过多,就等于把这些职责耦合在一起,一个职责的变化可能会削弱或者抑制这个类完成其他职责的能力。这种耦合会导致脆弱的设计,当变化发生时,设计会遭受到意想不到的破坏。 6 | 7 | 3. 软件设计真正要做的许多内容,就是发现职责并把那些职责相互分离。 8 | 9 | 4. 如果你能够想到多于一个的动机去改变一个类,那么这个类就具有多于一个的职责。 10 | 11 | -------------------------------------------------------------------------------- /Emacs/Emacs配置说明.md: -------------------------------------------------------------------------------- 1 | # Emacs配置说明 2 | 3 | ```shell 4 | cp _emacs ~/.emacs # 拷贝配置文件 5 | 6 | mkdir ~/.emacs.d # 创建配置文件目录 7 | 8 | cp init.el ~/.emacs.d/init.el # 拷贝核心配置文件 9 | ``` 10 | 11 | ## 插件列表 12 | 13 | *使用 `M-x package-install plugin-name` 安装插件* 14 | 15 | - [neotree](https://github.com/jaypei/emacs-neotree) 16 | - [multiple-cursors](https://github.com/magnars/multiple-cursors.el) 17 | - [projectile](https://github.com/bbatsov/projectile) 18 | -------------------------------------------------------------------------------- /GameDevelopment/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yangruihan/Notes/4e9855bf07f5ea772649b685995c9294eccfcdac/GameDevelopment/.DS_Store -------------------------------------------------------------------------------- /GameDevelopment/GameDesign/动态音频.md: -------------------------------------------------------------------------------- 1 | # 动态音频 2 | 3 | ## 一般实现 4 | 5 | 场景:和平 -> 战斗 -> 和平 6 | 7 | 音频:舒缓 -> 紧张 -> 舒缓 8 | 9 | ## 更有创意的方法,**交互式音频** 10 | 11 | 根据当前玩家进行的交互操作,更换成相符的音乐 12 | 13 | 比如,玩家行走的速度越快,音乐越急促,玩家在水下,音乐就变得低沉等 14 | 15 | ## 参考 16 | 17 | - [原地址](https://www.youtube.com/watch?v=b0gvM4q2hdI&list=PLc38fcMFcV_s7Lf6xbeRfWYRt7-Vmi_X9&index=71) 18 | 19 | - [中文字幕](https://www.bilibili.com/video/av10304893/) 20 | -------------------------------------------------------------------------------- /GameDevelopment/GameDesign/半条命中的隐形教程.md: -------------------------------------------------------------------------------- 1 | # 半条命中的隐形教程 2 | 3 | ## 经典场景 4 | 5 | 1. 教你如何拿起、放下物品:剧情中敌对 NPC 故意将易拉罐扔到地上,命令你捡起来,教程融入到了剧情之中 6 | 7 | 1. 藤壶怪的攻击模式:第一次见到该怪物的时候,会有一只鸟飞过,藤壶怪利用触手抓住鸟并吃掉 8 | 9 | ## 总结套路 10 | 11 | 1. 在**安全的区域**展示敌人及其弱点 12 | 13 | 2. 在相对简单的情境下让玩家练习 14 | 15 | 3. 举一反三 16 | 17 | ## 参考 18 | 19 | - [原地址](https://www.youtube.com/watch?v=MMggqenxuZc) 20 | 21 | - [中文字幕](https://www.bilibili.com/video/av10367737) 22 | -------------------------------------------------------------------------------- /GameDevelopment/GameDesign/如何分析游戏.md: -------------------------------------------------------------------------------- 1 | # 如何分析游戏 2 | 3 | ## 一、专注自己的感觉 4 | 5 | > 找到游戏带来的感受 6 | 7 | 1. 无压力体验游戏,总结游戏流程中带来的最直观的感受 8 | 9 | 2. 根据所得到的感受反推哪些设计在向你传递这些信息 10 | 11 | ## 二、分析机制 12 | 13 | > 理解是什么机制或设计导致我们产生如此感受 14 | 15 | 1. 分析上述找到的设计,总结出是哪些游戏机制在产生影响 16 | 17 | 2. 思考所有的游戏机制与你做的决策带来的体验是否**融洽** 18 | 19 | 3. 思考游戏的核心体验是否与游戏要表达的主体相符合 20 | 21 | ### 三、分析关卡 22 | 23 | > 找出是怎样的关卡设计使你有动力持续进行游戏 24 | 25 | 1. 多次游玩游戏时试图寻找贯穿整个关卡的重要线索 26 | 27 | 2. 记录在关卡进行过程中心流变化 28 | 29 | 3. 思考是否有单一元素或多个元素始终贯穿整个关卡 30 | -------------------------------------------------------------------------------- /GameDevelopment/GameDevelop/2D_images/2d_01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yangruihan/Notes/4e9855bf07f5ea772649b685995c9294eccfcdac/GameDevelopment/GameDevelop/2D_images/2d_01.png -------------------------------------------------------------------------------- /GameDevelopment/GameDevelop/2D_images/2d_02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yangruihan/Notes/4e9855bf07f5ea772649b685995c9294eccfcdac/GameDevelopment/GameDevelop/2D_images/2d_02.png -------------------------------------------------------------------------------- /GameDevelopment/GameDevelop/2D_images/2d_03.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yangruihan/Notes/4e9855bf07f5ea772649b685995c9294eccfcdac/GameDevelopment/GameDevelop/2D_images/2d_03.png -------------------------------------------------------------------------------- /GameDevelopment/GameDevelop/2D_images/2d_04.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yangruihan/Notes/4e9855bf07f5ea772649b685995c9294eccfcdac/GameDevelopment/GameDevelop/2D_images/2d_04.png -------------------------------------------------------------------------------- /GameDevelopment/GameDevelop/2D_images/2d_05.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yangruihan/Notes/4e9855bf07f5ea772649b685995c9294eccfcdac/GameDevelopment/GameDevelop/2D_images/2d_05.png -------------------------------------------------------------------------------- /GameDevelopment/GameDevelop/2D_images/2d_06.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yangruihan/Notes/4e9855bf07f5ea772649b685995c9294eccfcdac/GameDevelopment/GameDevelop/2D_images/2d_06.png -------------------------------------------------------------------------------- /GameDevelopment/GameDevelop/Unreal Engine/Images/1_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yangruihan/Notes/4e9855bf07f5ea772649b685995c9294eccfcdac/GameDevelopment/GameDevelop/Unreal Engine/Images/1_1.png -------------------------------------------------------------------------------- /GameDevelopment/GameDevelop/Unreal Engine/Images/1_10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yangruihan/Notes/4e9855bf07f5ea772649b685995c9294eccfcdac/GameDevelopment/GameDevelop/Unreal Engine/Images/1_10.png -------------------------------------------------------------------------------- /GameDevelopment/GameDevelop/Unreal Engine/Images/1_11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yangruihan/Notes/4e9855bf07f5ea772649b685995c9294eccfcdac/GameDevelopment/GameDevelop/Unreal Engine/Images/1_11.png -------------------------------------------------------------------------------- /GameDevelopment/GameDevelop/Unreal Engine/Images/1_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yangruihan/Notes/4e9855bf07f5ea772649b685995c9294eccfcdac/GameDevelopment/GameDevelop/Unreal Engine/Images/1_2.png -------------------------------------------------------------------------------- /GameDevelopment/GameDevelop/Unreal Engine/Images/1_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yangruihan/Notes/4e9855bf07f5ea772649b685995c9294eccfcdac/GameDevelopment/GameDevelop/Unreal Engine/Images/1_3.png -------------------------------------------------------------------------------- /GameDevelopment/GameDevelop/Unreal Engine/Images/1_4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yangruihan/Notes/4e9855bf07f5ea772649b685995c9294eccfcdac/GameDevelopment/GameDevelop/Unreal Engine/Images/1_4.png -------------------------------------------------------------------------------- /GameDevelopment/GameDevelop/Unreal Engine/Images/1_5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yangruihan/Notes/4e9855bf07f5ea772649b685995c9294eccfcdac/GameDevelopment/GameDevelop/Unreal Engine/Images/1_5.png -------------------------------------------------------------------------------- /GameDevelopment/GameDevelop/Unreal Engine/Images/1_6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yangruihan/Notes/4e9855bf07f5ea772649b685995c9294eccfcdac/GameDevelopment/GameDevelop/Unreal Engine/Images/1_6.png -------------------------------------------------------------------------------- /GameDevelopment/GameDevelop/Unreal Engine/Images/1_7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yangruihan/Notes/4e9855bf07f5ea772649b685995c9294eccfcdac/GameDevelopment/GameDevelop/Unreal Engine/Images/1_7.png -------------------------------------------------------------------------------- /GameDevelopment/GameDevelop/Unreal Engine/Images/1_8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yangruihan/Notes/4e9855bf07f5ea772649b685995c9294eccfcdac/GameDevelopment/GameDevelop/Unreal Engine/Images/1_8.png -------------------------------------------------------------------------------- /GameDevelopment/GameDevelop/Unreal Engine/Images/1_9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yangruihan/Notes/4e9855bf07f5ea772649b685995c9294eccfcdac/GameDevelopment/GameDevelop/Unreal Engine/Images/1_9.png -------------------------------------------------------------------------------- /GameDevelopment/Images/Ecs_001.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yangruihan/Notes/4e9855bf07f5ea772649b685995c9294eccfcdac/GameDevelopment/Images/Ecs_001.png -------------------------------------------------------------------------------- /GameDevelopment/Images/Ecs_002.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yangruihan/Notes/4e9855bf07f5ea772649b685995c9294eccfcdac/GameDevelopment/Images/Ecs_002.png -------------------------------------------------------------------------------- /GameDevelopment/Images/Ecs_003.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yangruihan/Notes/4e9855bf07f5ea772649b685995c9294eccfcdac/GameDevelopment/Images/Ecs_003.png -------------------------------------------------------------------------------- /GameDevelopment/Images/Ecs_004.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yangruihan/Notes/4e9855bf07f5ea772649b685995c9294eccfcdac/GameDevelopment/Images/Ecs_004.png -------------------------------------------------------------------------------- /GameDevelopment/Images/Ecs_arch.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yangruihan/Notes/4e9855bf07f5ea772649b685995c9294eccfcdac/GameDevelopment/Images/Ecs_arch.png -------------------------------------------------------------------------------- /GameDevelopment/Images/as_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yangruihan/Notes/4e9855bf07f5ea772649b685995c9294eccfcdac/GameDevelopment/Images/as_1.png -------------------------------------------------------------------------------- /GameDevelopment/Images/as_10_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yangruihan/Notes/4e9855bf07f5ea772649b685995c9294eccfcdac/GameDevelopment/Images/as_10_1.png -------------------------------------------------------------------------------- /GameDevelopment/Images/as_10_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yangruihan/Notes/4e9855bf07f5ea772649b685995c9294eccfcdac/GameDevelopment/Images/as_10_2.png -------------------------------------------------------------------------------- /GameDevelopment/Images/as_10_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yangruihan/Notes/4e9855bf07f5ea772649b685995c9294eccfcdac/GameDevelopment/Images/as_10_3.png -------------------------------------------------------------------------------- /GameDevelopment/Images/as_10_4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yangruihan/Notes/4e9855bf07f5ea772649b685995c9294eccfcdac/GameDevelopment/Images/as_10_4.png -------------------------------------------------------------------------------- /GameDevelopment/Images/as_11_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yangruihan/Notes/4e9855bf07f5ea772649b685995c9294eccfcdac/GameDevelopment/Images/as_11_1.png -------------------------------------------------------------------------------- /GameDevelopment/Images/as_11_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yangruihan/Notes/4e9855bf07f5ea772649b685995c9294eccfcdac/GameDevelopment/Images/as_11_2.png -------------------------------------------------------------------------------- /GameDevelopment/Images/as_11_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yangruihan/Notes/4e9855bf07f5ea772649b685995c9294eccfcdac/GameDevelopment/Images/as_11_3.png -------------------------------------------------------------------------------- /GameDevelopment/Images/as_11_4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yangruihan/Notes/4e9855bf07f5ea772649b685995c9294eccfcdac/GameDevelopment/Images/as_11_4.png -------------------------------------------------------------------------------- /GameDevelopment/Images/as_11_5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yangruihan/Notes/4e9855bf07f5ea772649b685995c9294eccfcdac/GameDevelopment/Images/as_11_5.png -------------------------------------------------------------------------------- /GameDevelopment/Images/as_11_6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yangruihan/Notes/4e9855bf07f5ea772649b685995c9294eccfcdac/GameDevelopment/Images/as_11_6.png -------------------------------------------------------------------------------- /GameDevelopment/Images/as_12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yangruihan/Notes/4e9855bf07f5ea772649b685995c9294eccfcdac/GameDevelopment/Images/as_12.png -------------------------------------------------------------------------------- /GameDevelopment/Images/as_13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yangruihan/Notes/4e9855bf07f5ea772649b685995c9294eccfcdac/GameDevelopment/Images/as_13.png -------------------------------------------------------------------------------- /GameDevelopment/Images/as_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yangruihan/Notes/4e9855bf07f5ea772649b685995c9294eccfcdac/GameDevelopment/Images/as_2.png -------------------------------------------------------------------------------- /GameDevelopment/Images/as_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yangruihan/Notes/4e9855bf07f5ea772649b685995c9294eccfcdac/GameDevelopment/Images/as_3.png -------------------------------------------------------------------------------- /GameDevelopment/Images/as_3_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yangruihan/Notes/4e9855bf07f5ea772649b685995c9294eccfcdac/GameDevelopment/Images/as_3_1.png -------------------------------------------------------------------------------- /GameDevelopment/Images/as_4_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yangruihan/Notes/4e9855bf07f5ea772649b685995c9294eccfcdac/GameDevelopment/Images/as_4_1.png -------------------------------------------------------------------------------- /GameDevelopment/Images/as_4_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yangruihan/Notes/4e9855bf07f5ea772649b685995c9294eccfcdac/GameDevelopment/Images/as_4_2.png -------------------------------------------------------------------------------- /GameDevelopment/Images/as_4_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yangruihan/Notes/4e9855bf07f5ea772649b685995c9294eccfcdac/GameDevelopment/Images/as_4_3.png -------------------------------------------------------------------------------- /GameDevelopment/Images/as_4_4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yangruihan/Notes/4e9855bf07f5ea772649b685995c9294eccfcdac/GameDevelopment/Images/as_4_4.png -------------------------------------------------------------------------------- /GameDevelopment/Images/as_5_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yangruihan/Notes/4e9855bf07f5ea772649b685995c9294eccfcdac/GameDevelopment/Images/as_5_1.png -------------------------------------------------------------------------------- /GameDevelopment/Images/as_5_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yangruihan/Notes/4e9855bf07f5ea772649b685995c9294eccfcdac/GameDevelopment/Images/as_5_2.png -------------------------------------------------------------------------------- /GameDevelopment/Images/as_5_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yangruihan/Notes/4e9855bf07f5ea772649b685995c9294eccfcdac/GameDevelopment/Images/as_5_3.png -------------------------------------------------------------------------------- /GameDevelopment/Images/as_5_4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yangruihan/Notes/4e9855bf07f5ea772649b685995c9294eccfcdac/GameDevelopment/Images/as_5_4.png -------------------------------------------------------------------------------- /GameDevelopment/Images/as_6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yangruihan/Notes/4e9855bf07f5ea772649b685995c9294eccfcdac/GameDevelopment/Images/as_6.png -------------------------------------------------------------------------------- /GameDevelopment/Images/as_7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yangruihan/Notes/4e9855bf07f5ea772649b685995c9294eccfcdac/GameDevelopment/Images/as_7.png -------------------------------------------------------------------------------- /GameDevelopment/Images/as_8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yangruihan/Notes/4e9855bf07f5ea772649b685995c9294eccfcdac/GameDevelopment/Images/as_8.png -------------------------------------------------------------------------------- /GameDevelopment/Images/as_9_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yangruihan/Notes/4e9855bf07f5ea772649b685995c9294eccfcdac/GameDevelopment/Images/as_9_1.png -------------------------------------------------------------------------------- /GameDevelopment/Images/as_9_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yangruihan/Notes/4e9855bf07f5ea772649b685995c9294eccfcdac/GameDevelopment/Images/as_9_2.png -------------------------------------------------------------------------------- /GameDevelopment/Images/as_9_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yangruihan/Notes/4e9855bf07f5ea772649b685995c9294eccfcdac/GameDevelopment/Images/as_9_3.png -------------------------------------------------------------------------------- /GameDevelopment/Images/as_9_4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yangruihan/Notes/4e9855bf07f5ea772649b685995c9294eccfcdac/GameDevelopment/Images/as_9_4.png -------------------------------------------------------------------------------- /GameDevelopment/Images/as_9_5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yangruihan/Notes/4e9855bf07f5ea772649b685995c9294eccfcdac/GameDevelopment/Images/as_9_5.png -------------------------------------------------------------------------------- /GameDevelopment/Images/as_code_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yangruihan/Notes/4e9855bf07f5ea772649b685995c9294eccfcdac/GameDevelopment/Images/as_code_1.png -------------------------------------------------------------------------------- /GameDevelopment/Images/as_code_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yangruihan/Notes/4e9855bf07f5ea772649b685995c9294eccfcdac/GameDevelopment/Images/as_code_2.png -------------------------------------------------------------------------------- /GameDevelopment/Images/as_code_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yangruihan/Notes/4e9855bf07f5ea772649b685995c9294eccfcdac/GameDevelopment/Images/as_code_3.png -------------------------------------------------------------------------------- /GameDevelopment/Images/as_code_4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yangruihan/Notes/4e9855bf07f5ea772649b685995c9294eccfcdac/GameDevelopment/Images/as_code_4.png -------------------------------------------------------------------------------- /GameDevelopment/Images/as_code_5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yangruihan/Notes/4e9855bf07f5ea772649b685995c9294eccfcdac/GameDevelopment/Images/as_code_5.png -------------------------------------------------------------------------------- /GameDevelopment/Images/as_code_6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yangruihan/Notes/4e9855bf07f5ea772649b685995c9294eccfcdac/GameDevelopment/Images/as_code_6.png -------------------------------------------------------------------------------- /GameDevelopment/Images/as_code_7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yangruihan/Notes/4e9855bf07f5ea772649b685995c9294eccfcdac/GameDevelopment/Images/as_code_7.png -------------------------------------------------------------------------------- /GameDevelopment/Images/as_code_8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yangruihan/Notes/4e9855bf07f5ea772649b685995c9294eccfcdac/GameDevelopment/Images/as_code_8.png -------------------------------------------------------------------------------- /GameDevelopment/Images/asi_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yangruihan/Notes/4e9855bf07f5ea772649b685995c9294eccfcdac/GameDevelopment/Images/asi_1.png -------------------------------------------------------------------------------- /GameDevelopment/README.md: -------------------------------------------------------------------------------- 1 | # 目录 2 | 3 | 1. [游戏设计](https://github.com/yangruihan/Notes/tree/master/GameDevelopment/GameDesign) 4 | 5 | 2. [游戏开发](https://github.com/yangruihan/Notes/tree/master/GameDevelopment/GameDevelop) -------------------------------------------------------------------------------- /Git/push到github时每次都要输入用户名和密码的问题.mdown: -------------------------------------------------------------------------------- 1 | # `git push` 到 `github` 时,每次都要输入用户名和密码的问题 2 | 3 | 原因是使用了`https`方式`push` 4 | 5 | 在`terminal`里边 输入`git remote -v` 6 | 7 | 可以看到形如以下的返回结果 8 | ``` 9 | origin https://github.com/yuquan0821/demo.git (fetch) 10 | origin https://github.com/yuquan0821/demo.git (push) 11 | ``` 12 | 13 | 下面把它换成`ssh`方式的: 14 | ``` 15 | git remote rm origin 16 | git remote add origin git@github.com:username/repository.git 17 | git push origin 18 | ``` 19 | 20 | 问题解决! -------------------------------------------------------------------------------- /Google Study jam/Android_study_1a.mdown: -------------------------------------------------------------------------------- 1 | # Google Study Jam -- Android Study 1A 笔记 2 | 3 | 1. View 对于应用的布局来说是基本的构成元素 4 | 5 | 2. `XML`以`<`开始,以`/>`结尾,或以``开始,以``结尾 6 | 7 | 3. IDE = Integrated Development Environment 8 | 9 | 4. DP = density-independent pixels 10 | 11 | 5. 当设计 APP 时,建议所有可接触目标,如按钮长和宽至少是48dps 12 | 13 | 6. SP = scale independent pixels 14 | 15 | 7. `TextView`中的`textAppearance`属性可以使字体自动匹配的sp值,使其在不断变化的 Android里,代码可以保持一致都获取到正确的数值 16 | 17 | # 补充 18 | 19 | 1. [Material design - Introduction](http://www.google.com/design/spec/material-design/introduction.html#) 20 | 21 | 2. [Android Developers](http://developer.android.com/index.html) -------------------------------------------------------------------------------- /Google Study jam/Android_study_2a.mdown: -------------------------------------------------------------------------------- 1 | # Google Study Jam -- 2A+-+GoG0GO 笔记 2 | 3 | 1. 每个 Activity 都专注于一个相对独立的功能 4 | 5 | 2. 遇到问题或遇到一个错误一般有以下几种解决方法: 6 | 7 | 1. 查看错误信息 8 | 9 | 2. 和之前能运行的代码进行对比 10 | 11 | 3. 撤销修改 12 | 13 | 4. 询求帮助 14 | 15 | 3. 伪代码(Pseudocode):用于解释我们的应用程序每一部都会做什么的一门高级描述语言。 16 | 17 | **学习感想:** 18 | 学习了2A课程,决定写一写目前观看视频的一些感想,因为我之前学习过 Android 的基础知识,也开发过几个 Android 小 app,这次学习抱着复习和看看 Google 教程有什么不同的态度来观看的,虽然视频内容大多数都以很熟练的运用,不过还是收获颇丰,给我最大的感触是,这套视频不仅仅是在机械的传输 Android 开发的基础知识,而是很生动形象地引导大家进入 Android 世界,进入编程世界。它更注重的是锻炼思想、培养能力,比如代码的规范、利用搜索引擎的能力、debug的能力、设计的能力等。这套视频目前给我的最大的收获是:让我重新审视了一下我之前开发应用的流程,之前很容易盲目地、还没想清楚就开始编写代码,导致代码问题很多,而在这套教程中,每一集视频都有一个明确的目标和任务,甚至有明确的步骤,这是非常值得我学习的,在今后的开发中,我也需要将这种习惯熟练运用,争取开发出质量更优的应用程序来! -------------------------------------------------------------------------------- /Google Study jam/Android_study_2b.mdown: -------------------------------------------------------------------------------- 1 | # Google Study Jam -- 2B - Happy 笔记 2 | 3 | 1. 嵌套的 ViewGroup 可以展现出更加丰富多彩的视图 4 | 5 | 2. Android 通过 View 层次或者叫 View 的树状结构来管理屏幕上的所有 View 6 | 7 | 3. 变量名最好具有代表性,才能描述出所保存的数据类型 -------------------------------------------------------------------------------- /Google Study jam/Android_study_3a.mdown: -------------------------------------------------------------------------------- 1 | # Google Study Jam -- 3A_Method 笔记 2 | 3 | 1. 方法签名(method signature)的组成(按顺序): 4 | 5 | 1. 存取修饰词 6 | 7 | 2. 返回类型 8 | 9 | 3. 方法名 10 | 11 | 4. 参数列表(类型,参数名) 12 | 13 | 2. 实参就是传递给方法的输入,形参就是方法定义时所声明需要的输入 -------------------------------------------------------------------------------- /Google Study jam/Android_study_3b.mdown: -------------------------------------------------------------------------------- 1 | # Google Study Jam -- 3B_Adding 笔记 2 | 3 | 1. Intent(**目的、意图**)的使用: 4 | 5 | ```java 6 | // 定义一个Intent 7 | Intent intent = new Intent(AActivity.this, BActivity.class); 8 | // 启动Activity 9 | startActivity(intent); 10 | ``` 11 | 12 | 2. string.xml: 13 | 14 | 专门用来存放 app 中字符串的文件,一般用来实现对多国语言的支持 15 | 16 | 3. style.xml: 17 | 18 | 专门用来存放主题样式的文件,可以继承,通过修改其内容来展示丰富多彩的样式 19 | 20 | 21 | -------------------------------------------------------------------------------- /Google Study jam/GoogleIntroduction/.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | /local.properties 4 | /.idea/workspace.xml 5 | /.idea/libraries 6 | .DS_Store 7 | /build 8 | /captures 9 | -------------------------------------------------------------------------------- /Google Study jam/GoogleIntroduction/.idea/.name: -------------------------------------------------------------------------------- 1 | Google Introduction -------------------------------------------------------------------------------- /Google Study jam/GoogleIntroduction/.idea/copyright/profiles_settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /Google Study jam/GoogleIntroduction/.idea/encodings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /Google Study jam/GoogleIntroduction/.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /Google Study jam/GoogleIntroduction/.idea/runConfigurations.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 11 | 12 | -------------------------------------------------------------------------------- /Google Study jam/GoogleIntroduction/app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /Google Study jam/GoogleIntroduction/app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # By default, the flags in this file are appended to flags specified 3 | # in D:\Android\sdk/tools/proguard/proguard-android.txt 4 | # You can edit the include path and order by changing the proguardFiles 5 | # directive in build.gradle. 6 | # 7 | # For more details, see 8 | # http://developer.android.com/guide/developing/tools/proguard.html 9 | 10 | # Add any project specific keep options here: 11 | 12 | # If your project uses WebView with JS, uncomment the following 13 | # and specify the fully qualified class name to the JavaScript interface 14 | # class: 15 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 16 | # public *; 17 | #} 18 | -------------------------------------------------------------------------------- /Google Study jam/GoogleIntroduction/app/src/androidTest/java/cn/studyjams/s1/sj23/yangruihan/ApplicationTest.java: -------------------------------------------------------------------------------- 1 | package cn.studyjams.s1.sj23.yangruihan; 2 | 3 | import android.app.Application; 4 | import android.test.ApplicationTestCase; 5 | 6 | /** 7 | * Testing Fundamentals 8 | */ 9 | public class ApplicationTest extends ApplicationTestCase { 10 | public ApplicationTest() { 11 | super(Application.class); 12 | } 13 | } -------------------------------------------------------------------------------- /Google Study jam/GoogleIntroduction/app/src/main/java/cn/studyjams/s1/sj23/yangruihan/IntroCultureActivity.java: -------------------------------------------------------------------------------- 1 | package cn.studyjams.s1.sj23.yangruihan; 2 | 3 | import android.support.v7.app.AppCompatActivity; 4 | import android.os.Bundle; 5 | 6 | public class IntroCultureActivity extends AppCompatActivity { 7 | 8 | @Override 9 | protected void onCreate(Bundle savedInstanceState) { 10 | super.onCreate(savedInstanceState); 11 | setContentView(R.layout.activity_intro_culture); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /Google Study jam/GoogleIntroduction/app/src/main/java/cn/studyjams/s1/sj23/yangruihan/IntroDisputeActivity.java: -------------------------------------------------------------------------------- 1 | package cn.studyjams.s1.sj23.yangruihan; 2 | 3 | import android.support.v7.app.AppCompatActivity; 4 | import android.os.Bundle; 5 | 6 | public class IntroDisputeActivity extends AppCompatActivity { 7 | 8 | @Override 9 | protected void onCreate(Bundle savedInstanceState) { 10 | super.onCreate(savedInstanceState); 11 | setContentView(R.layout.activity_intro_dispute); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /Google Study jam/GoogleIntroduction/app/src/main/java/cn/studyjams/s1/sj23/yangruihan/IntroFaultActivity.java: -------------------------------------------------------------------------------- 1 | package cn.studyjams.s1.sj23.yangruihan; 2 | 3 | import android.support.v7.app.AppCompatActivity; 4 | import android.os.Bundle; 5 | 6 | public class IntroFaultActivity extends AppCompatActivity { 7 | 8 | @Override 9 | protected void onCreate(Bundle savedInstanceState) { 10 | super.onCreate(savedInstanceState); 11 | setContentView(R.layout.activity_intro_fault); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /Google Study jam/GoogleIntroduction/app/src/main/java/cn/studyjams/s1/sj23/yangruihan/IntroHistoryActivity.java: -------------------------------------------------------------------------------- 1 | package cn.studyjams.s1.sj23.yangruihan; 2 | 3 | import android.support.v7.app.AppCompatActivity; 4 | import android.os.Bundle; 5 | 6 | public class IntroHistoryActivity extends AppCompatActivity { 7 | 8 | @Override 9 | protected void onCreate(Bundle savedInstanceState) { 10 | super.onCreate(savedInstanceState); 11 | setContentView(R.layout.activity_intro_history); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /Google Study jam/GoogleIntroduction/app/src/main/java/cn/studyjams/s1/sj23/yangruihan/IntroProductActivity.java: -------------------------------------------------------------------------------- 1 | package cn.studyjams.s1.sj23.yangruihan; 2 | 3 | import android.support.v7.app.AppCompatActivity; 4 | import android.os.Bundle; 5 | 6 | public class IntroProductActivity extends AppCompatActivity { 7 | 8 | @Override 9 | protected void onCreate(Bundle savedInstanceState) { 10 | super.onCreate(savedInstanceState); 11 | setContentView(R.layout.activity_intro_product); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /Google Study jam/GoogleIntroduction/app/src/main/res/drawable/google_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yangruihan/Notes/4e9855bf07f5ea772649b685995c9294eccfcdac/Google Study jam/GoogleIntroduction/app/src/main/res/drawable/google_logo.png -------------------------------------------------------------------------------- /Google Study jam/GoogleIntroduction/app/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yangruihan/Notes/4e9855bf07f5ea772649b685995c9294eccfcdac/Google Study jam/GoogleIntroduction/app/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /Google Study jam/GoogleIntroduction/app/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yangruihan/Notes/4e9855bf07f5ea772649b685995c9294eccfcdac/Google Study jam/GoogleIntroduction/app/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /Google Study jam/GoogleIntroduction/app/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yangruihan/Notes/4e9855bf07f5ea772649b685995c9294eccfcdac/Google Study jam/GoogleIntroduction/app/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /Google Study jam/GoogleIntroduction/app/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yangruihan/Notes/4e9855bf07f5ea772649b685995c9294eccfcdac/Google Study jam/GoogleIntroduction/app/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /Google Study jam/GoogleIntroduction/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yangruihan/Notes/4e9855bf07f5ea772649b685995c9294eccfcdac/Google Study jam/GoogleIntroduction/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /Google Study jam/GoogleIntroduction/app/src/main/res/values-w820dp/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 64dp 6 | 7 | -------------------------------------------------------------------------------- /Google Study jam/GoogleIntroduction/app/src/main/res/values/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #4285F4 4 | #303F9F 5 | #FF4081 6 | #FFFFFF 7 | 8 | -------------------------------------------------------------------------------- /Google Study jam/GoogleIntroduction/app/src/main/res/values/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 16dp 4 | 16dp 5 | 6 | -------------------------------------------------------------------------------- /Google Study jam/GoogleIntroduction/app/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /Google Study jam/GoogleIntroduction/app/src/test/java/cn/studyjams/s1/sj23/yangruihan/ExampleUnitTest.java: -------------------------------------------------------------------------------- 1 | package cn.studyjams.s1.sj23.yangruihan; 2 | 3 | import org.junit.Test; 4 | 5 | import static org.junit.Assert.*; 6 | 7 | /** 8 | * To work on unit tests, switch the Test Artifact in the Build Variants view. 9 | */ 10 | public class ExampleUnitTest { 11 | @Test 12 | public void addition_isCorrect() throws Exception { 13 | assertEquals(4, 2 + 2); 14 | } 15 | } -------------------------------------------------------------------------------- /Google Study jam/GoogleIntroduction/build.gradle: -------------------------------------------------------------------------------- 1 | // Top-level build file where you can add configuration options common to all sub-projects/modules. 2 | 3 | buildscript { 4 | repositories { 5 | jcenter() 6 | } 7 | dependencies { 8 | classpath 'com.android.tools.build:gradle:2.0.0' 9 | 10 | // NOTE: Do not place your application dependencies here; they belong 11 | // in the individual module build.gradle files 12 | } 13 | } 14 | 15 | allprojects { 16 | repositories { 17 | jcenter() 18 | } 19 | } 20 | 21 | task clean(type: Delete) { 22 | delete rootProject.buildDir 23 | } 24 | -------------------------------------------------------------------------------- /Google Study jam/GoogleIntroduction/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yangruihan/Notes/4e9855bf07f5ea772649b685995c9294eccfcdac/Google Study jam/GoogleIntroduction/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /Google Study jam/GoogleIntroduction/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Mon Dec 28 10:00:20 PST 2015 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip 7 | -------------------------------------------------------------------------------- /Google Study jam/GoogleIntroduction/settings.gradle: -------------------------------------------------------------------------------- 1 | include ':app' 2 | -------------------------------------------------------------------------------- /Google Study jam/PS1_PubLearn.mdown: -------------------------------------------------------------------------------- 1 | # Google Study Jam -- PS1_PubLearn 笔记 2 | 3 | 1. `Package name`必须是独一无二的 4 | 5 | 2. 创建一个应用的三个步骤: 6 | 7 | 1. 选择布局和正确的 View 8 | 9 | 2. 把这些 View 定位在屏幕上 10 | 11 | 3. 为这些 View 设计样式 12 | 13 | **附上项目图片:** 14 | 15 | ![](http://cdn.studyjamscn.com/forum/201603/31/223609d8ts55qftqfqqs8t.png) 16 | 17 | ![](http://cdn.studyjamscn.com/forum/201603/31/223611f8id48iiqnqt2dxd.png) -------------------------------------------------------------------------------- /Google Study jam/PS2.mdown: -------------------------------------------------------------------------------- 1 | # Google Study Jam -- PS2 笔记 2 | 3 | 1. 声明变量意味着创建新变量 4 | 5 | 2. 变量命名注意事项: 6 | 7 | 1. 变量命名不能与关键字同名 8 | 9 | 2. 变量名称不能混杂标点符号 10 | 11 | 3. 变量名不能用空格隔开 12 | 13 | 3. 变量分为全局变量和局部变量 -------------------------------------------------------------------------------- /Image/8种排序之间的关系.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yangruihan/Notes/4e9855bf07f5ea772649b685995c9294eccfcdac/Image/8种排序之间的关系.png -------------------------------------------------------------------------------- /Image/冒泡排序.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yangruihan/Notes/4e9855bf07f5ea772649b685995c9294eccfcdac/Image/冒泡排序.png -------------------------------------------------------------------------------- /Image/基数排序.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yangruihan/Notes/4e9855bf07f5ea772649b685995c9294eccfcdac/Image/基数排序.jpg -------------------------------------------------------------------------------- /Image/堆排序-交换.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yangruihan/Notes/4e9855bf07f5ea772649b685995c9294eccfcdac/Image/堆排序-交换.jpg -------------------------------------------------------------------------------- /Image/堆排序-交换2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yangruihan/Notes/4e9855bf07f5ea772649b685995c9294eccfcdac/Image/堆排序-交换2.jpg -------------------------------------------------------------------------------- /Image/堆排序-建堆.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yangruihan/Notes/4e9855bf07f5ea772649b685995c9294eccfcdac/Image/堆排序-建堆.jpg -------------------------------------------------------------------------------- /Image/希尔排序.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yangruihan/Notes/4e9855bf07f5ea772649b685995c9294eccfcdac/Image/希尔排序.png -------------------------------------------------------------------------------- /Image/归并排序.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yangruihan/Notes/4e9855bf07f5ea772649b685995c9294eccfcdac/Image/归并排序.jpg -------------------------------------------------------------------------------- /Image/快速排序.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yangruihan/Notes/4e9855bf07f5ea772649b685995c9294eccfcdac/Image/快速排序.jpg -------------------------------------------------------------------------------- /Image/数值类型之间的合法转换图.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yangruihan/Notes/4e9855bf07f5ea772649b685995c9294eccfcdac/Image/数值类型之间的合法转换图.png -------------------------------------------------------------------------------- /Image/直接插入排序实例.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yangruihan/Notes/4e9855bf07f5ea772649b685995c9294eccfcdac/Image/直接插入排序实例.png -------------------------------------------------------------------------------- /Image/简单选择排序.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yangruihan/Notes/4e9855bf07f5ea772649b685995c9294eccfcdac/Image/简单选择排序.png -------------------------------------------------------------------------------- /Interview/判断一个单链表是否有环及环的链接点.md: -------------------------------------------------------------------------------- 1 | #判断一个单链表是否有环及环的链接点 2 | 3 | ## 题目 4 | 给定一个单链表,只给出头指针 h: 5 | 6 | 1. 如何判断是否存在环? 7 | 8 | 2. 如何知道环的长度? 9 | 10 | 3. 如何找出环的连接点在哪里? 11 | 12 | 4. 带环链表的长度是多少? 13 | 14 | ## 解法 15 | 1. 对于问题1,使用追赶的方法,设定两个指针 slow、 fast,从头指针开始,每次分别前进 1 步、2 步。如存在环,则两者相遇;如不存在环,fast 遇到`NULL`退出。 16 | 17 | 2. 对于问题 2,记录下问题1的碰撞点p,slow、fast 从该点开始,再次碰撞所走过的操作数就是环的长度 s。 18 | 19 | 3. 对于问题3:有定理:`碰撞点p到连接点的距离=头指针到连接点的距离`,因此,分别从碰撞点、头指针开始走,相遇的那个点就是连接点 20 | 21 | 4. 题 3 中已经求出连接点距离头指针的长度,加上问题 2 中求出的环的长度,二者之和就是带环单链表的长度 22 | 23 | ## 参考资料 24 | [判断一个单链表是否有环及环的链接点(转)](http://blog.sina.com.cn/s/blog_725dd1010100tqwp.html) -------------------------------------------------------------------------------- /Java/Java 静态方法何时使用.md: -------------------------------------------------------------------------------- 1 | # 静态方法何时使用 2 | 3 | - 如果某些操作不依赖具体实例,那它就是静态的,反之如果某些操作依赖具体实例的(例如访问一个特定会员的名称),那它就应该是实例化的 4 | 5 | - 静态方法不用`new`对象可以直接调用 6 | 7 | - 1. 与类相关与对象无关 8 | 2. 不需要对象的“轻”方法 9 | 3. 工厂方法 -------------------------------------------------------------------------------- /Java/Java中需要注意的小细节.mdown: -------------------------------------------------------------------------------- 1 | # Java 中需要注意的小细节 2 | 3 | ## 1、调用静态常量不会引起初始化(即不会调用类初始化代码块),但是调用类的静态方法当然会初始化类了。 4 | ```[JAVA] 5 | public class Test { 6 | 7 | public static void main(String[] args) { 8 | System.out.println(A.str); 9 | A.staticMethod(); 10 | } 11 | } 12 | 13 | class A { 14 | static { 15 | System.out.println("static code block"); 16 | } 17 | 18 | public static final String str = "static constant variable"; 19 | 20 | public static void staticMethod() { 21 | System.out.println("static method"); 22 | } 23 | } 24 | 25 | // 输出结果为: 26 | // static constant variable 27 | // static code block 28 | // static method 29 | ``` 30 | -------------------------------------------------------------------------------- /Java/Java程序员常用的10大构建工具.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yangruihan/Notes/4e9855bf07f5ea772649b685995c9294eccfcdac/Java/Java程序员常用的10大构建工具.md -------------------------------------------------------------------------------- /Java/Java程序员必须掌握的8大排序算法/src/BubbleSort.java: -------------------------------------------------------------------------------- 1 | package Sort; 2 | 3 | public class BubbleSort { 4 | public static void main(String[] args) { 5 | int a[] = {49, 38, 65, 97, 76, 13, 27, 49, 78, 34, 12, 64, 5, 4, 62, 99, 98, 54, 56, 17, 18, 23, 34, 15, 35, 25, 53, 51}; 6 | int temp = 0; 7 | for (int i = 0; i < a.length - 1; i++) { 8 | for (int j = 0; j < a.length - 1 - i; j++) { 9 | if (a[j] > a[j + 1]) { 10 | temp = a[j]; 11 | a[j] = a[j + 1]; 12 | a[j + 1] = temp; 13 | } 14 | } 15 | } 16 | 17 | for (int i = 0; i < a.length; i++) { 18 | System.out.print(a[i] + " "); 19 | } 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /Java/Java程序员必须掌握的8大排序算法/src/InsertionSorting.java: -------------------------------------------------------------------------------- 1 | package Sort; 2 | 3 | public class InsertionSorting { 4 | 5 | public static void main(String[] args) { 6 | int a[] = { 49, 38, 65, 97, 76, 13, 27, 49, 78, 34, 12, 64, 5, 4, 62, 99, 98, 54, 56, 17, 18, 23, 34, 15, 35, 7 | 25, 53, 51 }; 8 | 9 | int temp = 0; 10 | for (int i = 1; i < a.length; i++) { 11 | int j; 12 | temp = a[i]; 13 | 14 | for (j = i - 1; j >= 0 && temp < a[j]; j--) 15 | a[j + 1] = a[j]; // ������temp��ֵ���������һ����λ 16 | 17 | a[j + 1] = temp; 18 | } 19 | 20 | for (int i = 0; i < a.length; i++) 21 | System.out.print(a[i] + " "); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /Java/Java程序员必须掌握的8大排序算法/src/SelectionSort.java: -------------------------------------------------------------------------------- 1 | package Sort; 2 | 3 | public class SelectionSort { 4 | 5 | public static void main(String[] args) { 6 | int a[] = { 1, 54, 6, 3, 78, 34, 12, 45 }; 7 | for (int i = 0; i < a.length; i++) { 8 | int min = a[i]; 9 | int t = i; 10 | for (int j = i + 1; j < a.length; j++) { 11 | if (min > a[j]) { 12 | min = a[j]; 13 | t = j; 14 | } 15 | } 16 | a[t] = a[i]; 17 | a[i] = min; 18 | } 19 | for (int i = 0; i < a.length; i++) 20 | System.out.print(a[i] + " "); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /Java/Java类的生命周期详解/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yangruihan/Notes/4e9855bf07f5ea772649b685995c9294eccfcdac/Java/Java类的生命周期详解/1.png -------------------------------------------------------------------------------- /Java/Java语法糖之foreach.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yangruihan/Notes/4e9855bf07f5ea772649b685995c9294eccfcdac/Java/Java语法糖之foreach.md -------------------------------------------------------------------------------- /Lisp/path-lib/packages.lisp: -------------------------------------------------------------------------------- 1 | (in-package :cl-user) 2 | 3 | (defpackage :com.gigamonkeys.pathnames 4 | (:use :common-lisp) 5 | (:export 6 | :list-directory 7 | :file-exists-p 8 | :directory-pathname-p 9 | :file-pathname-p 10 | :pathname-as-directory 11 | :pathname-as-file 12 | :walk-directory 13 | :directory-p 14 | :file-p)) 15 | -------------------------------------------------------------------------------- /Lua/Lua_Source_Internal/README.md: -------------------------------------------------------------------------------- 1 | # Lua 源码设计与实现 2 | 3 | ## 目录 4 | 5 | [Lua中的数据类型](doc/ch02-Lua%E4%B8%AD%E7%9A%84%E6%95%B0%E6%8D%AE%E7%B1%BB%E5%9E%8B.md) 6 | 7 | [Lua字符串](doc/ch02-Lua%E5%AD%97%E7%AC%A6%E4%B8%B2%E7%B1%BB%E5%9E%8B.md) 8 | -------------------------------------------------------------------------------- /Lua/Lua_Source_Internal/pic/ch02-1-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yangruihan/Notes/4e9855bf07f5ea772649b685995c9294eccfcdac/Lua/Lua_Source_Internal/pic/ch02-1-1.png -------------------------------------------------------------------------------- /Lua/Lua_Source_Internal/pic/ch02-1-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yangruihan/Notes/4e9855bf07f5ea772649b685995c9294eccfcdac/Lua/Lua_Source_Internal/pic/ch02-1-2.png -------------------------------------------------------------------------------- /Lua/Lua_Source_Internal/pic/ch02-2-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yangruihan/Notes/4e9855bf07f5ea772649b685995c9294eccfcdac/Lua/Lua_Source_Internal/pic/ch02-2-1.png -------------------------------------------------------------------------------- /Lua/Lua_Source_Internal/pic/ch02-2-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yangruihan/Notes/4e9855bf07f5ea772649b685995c9294eccfcdac/Lua/Lua_Source_Internal/pic/ch02-2-2.png -------------------------------------------------------------------------------- /Lua/Lua_Source_Internal/pic/ch02-2-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yangruihan/Notes/4e9855bf07f5ea772649b685995c9294eccfcdac/Lua/Lua_Source_Internal/pic/ch02-2-3.png -------------------------------------------------------------------------------- /Mac/Homebrew/brew install 失败.md: -------------------------------------------------------------------------------- 1 | # Can't install Brew formulae correctly (Permission denied in /usr/local/lib) 2 | [参考资料](http://superuser.com/questions/254843/cant-install-brew-formulae-correctly-permission-denied-in-usr-local-lib) -------------------------------------------------------------------------------- /Mac/Homebrew/brew update 失败.md: -------------------------------------------------------------------------------- 1 | # brew update 失败 Error: Error: Failure while executing: git pull -q origin refs/heads/master:refs/remotes/origin/master 2 | 3 | ``` 4 | $ cd /usr/local 5 | $ git remote add origin git://github.com/mxcl/homebrew.git 6 | fatal: remote origin already exists. 7 | $ git fetch origin 8 | $ sudo brew update 9 | Already up-to-date 10 | ``` 11 | 12 | 如果还不能解决,查看[参考资料](http://stackoverflow.com/questions/14113427/brew-update-failed) -------------------------------------------------------------------------------- /Mac/Tmux 速成教程:技巧和调整/image/1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yangruihan/Notes/4e9855bf07f5ea772649b685995c9294eccfcdac/Mac/Tmux 速成教程:技巧和调整/image/1.jpg -------------------------------------------------------------------------------- /Mac/Tmux 速成教程:技巧和调整/image/10.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yangruihan/Notes/4e9855bf07f5ea772649b685995c9294eccfcdac/Mac/Tmux 速成教程:技巧和调整/image/10.jpg -------------------------------------------------------------------------------- /Mac/Tmux 速成教程:技巧和调整/image/2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yangruihan/Notes/4e9855bf07f5ea772649b685995c9294eccfcdac/Mac/Tmux 速成教程:技巧和调整/image/2.jpg -------------------------------------------------------------------------------- /Mac/Tmux 速成教程:技巧和调整/image/3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yangruihan/Notes/4e9855bf07f5ea772649b685995c9294eccfcdac/Mac/Tmux 速成教程:技巧和调整/image/3.jpg -------------------------------------------------------------------------------- /Mac/Tmux 速成教程:技巧和调整/image/4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yangruihan/Notes/4e9855bf07f5ea772649b685995c9294eccfcdac/Mac/Tmux 速成教程:技巧和调整/image/4.jpg -------------------------------------------------------------------------------- /Mac/Tmux 速成教程:技巧和调整/image/5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yangruihan/Notes/4e9855bf07f5ea772649b685995c9294eccfcdac/Mac/Tmux 速成教程:技巧和调整/image/5.jpg -------------------------------------------------------------------------------- /Mac/Tmux 速成教程:技巧和调整/image/6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yangruihan/Notes/4e9855bf07f5ea772649b685995c9294eccfcdac/Mac/Tmux 速成教程:技巧和调整/image/6.jpg -------------------------------------------------------------------------------- /Mac/Tmux 速成教程:技巧和调整/image/7.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yangruihan/Notes/4e9855bf07f5ea772649b685995c9294eccfcdac/Mac/Tmux 速成教程:技巧和调整/image/7.jpg -------------------------------------------------------------------------------- /Mac/Tmux 速成教程:技巧和调整/image/8.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yangruihan/Notes/4e9855bf07f5ea772649b685995c9294eccfcdac/Mac/Tmux 速成教程:技巧和调整/image/8.jpg -------------------------------------------------------------------------------- /Mac/Tmux 速成教程:技巧和调整/image/9.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yangruihan/Notes/4e9855bf07f5ea772649b685995c9294eccfcdac/Mac/Tmux 速成教程:技巧和调整/image/9.jpg -------------------------------------------------------------------------------- /Network/HTTP Header详解.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yangruihan/Notes/4e9855bf07f5ea772649b685995c9294eccfcdac/Network/HTTP Header详解.md -------------------------------------------------------------------------------- /OpenGL/《计算机图形学》笔记/src/README.md: -------------------------------------------------------------------------------- 1 | # README 2 | Python 实现《计算机图形学》所有代码 3 | 4 | ## 环境 5 | - Mac OS X El Capitan (10.11.4) 6 | 7 | - Python(3.5.1) 8 | 9 | - PyOpenGL(3.1.0) 10 | 11 | 安装方法`pip install pyopengl` -------------------------------------------------------------------------------- /OpenGL/《计算机图形学》笔记/src/simple.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | # -*- coding:utf-8 -*- 3 | 4 | from OpenGL.GL import * 5 | from OpenGL.GLU import * 6 | from OpenGL.GLUT import * 7 | 8 | 9 | def display(): 10 | glClear(GL_COLOR_BUFFER_BIT) 11 | glBegin(GL_QUADS) 12 | glVertex2d(-0.5, -0.5) 13 | glVertex2d(-0.5, 0.5) 14 | glVertex2d(0.5, 0.5) 15 | glVertex2d(0.5, -0.5) 16 | glEnd() 17 | glFlush() 18 | 19 | 20 | def main(): 21 | glutInit() 22 | glutCreateWindow("simple") 23 | glutDisplayFunc(display) 24 | glutMainLoop() 25 | 26 | if __name__ == '__main__': 27 | main() 28 | -------------------------------------------------------------------------------- /OpenGL/《计算机图形学》笔记/src/simple_mouse_event.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | # -*- coding:utf-8 -*- 3 | 4 | from OpenGL.GL import * 5 | from OpenGL.GLU import * 6 | from OpenGL.GLUT import * 7 | 8 | 9 | def display(): 10 | glClear(GL_COLOR_BUFFER_BIT) 11 | glBegin(GL_QUADS) 12 | glVertex2d(-0.5, -0.5) 13 | glVertex2d(-0.5, 0.5) 14 | glVertex2d(0.5, 0.5) 15 | glVertex2d(0.5, -0.5) 16 | glEnd() 17 | glFlush() 18 | 19 | 20 | def mouse(btn, state, x, y): 21 | """鼠标事件回调函数""" 22 | if btn == GLUT_RIGHT_BUTTON and state == GLUT_DOWN: 23 | exit(0) 24 | 25 | 26 | def main(): 27 | glutInit() 28 | glutCreateWindow("simple") 29 | glutDisplayFunc(display) 30 | glutMouseFunc(mouse) 31 | glutMainLoop() 32 | 33 | if __name__ == '__main__': 34 | main() 35 | -------------------------------------------------------------------------------- /Others/ARM 嵌入式系统复习笔记.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yangruihan/Notes/4e9855bf07f5ea772649b685995c9294eccfcdac/Others/ARM 嵌入式系统复习笔记.md -------------------------------------------------------------------------------- /Others/编程字体下载.mdown: -------------------------------------------------------------------------------- 1 | # 好看的编程字体下载 2 | 3 | 点击[这里](http://pan.baidu.com/s/1MdAUy)下载 4 | 5 | 密码:iwi9 -------------------------------------------------------------------------------- /ProgrammingLanguage/book/cal_2/mycal: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yangruihan/Notes/4e9855bf07f5ea772649b685995c9294eccfcdac/ProgrammingLanguage/book/cal_2/mycal -------------------------------------------------------------------------------- /ProgrammingLanguage/book/cal_2/token.h: -------------------------------------------------------------------------------- 1 | #ifndef TOKEN_H_INCLUDED 2 | #define TOKEN_H_INCLUDED 3 | 4 | typedef enum 5 | { 6 | BAD_TOKEN, 7 | NUMBER_TOKEN, 8 | ADD_OPERATOR_TOKEN, 9 | SUB_OPERATOR_TOKEN, 10 | MUL_OPERATOR_TOKEN, 11 | DIV_OPERATOR_TOKEN, 12 | LEFT_PAREN_TOKEN, 13 | RIGHT_PAREN_TOKEN, 14 | END_OF_LINE_TOKEN, 15 | } TokenKind; 16 | 17 | #define MAX_TOKEN_SIZE (100) 18 | 19 | typedef struct 20 | { 21 | TokenKind kind; 22 | double value; 23 | char str[MAX_TOKEN_SIZE]; 24 | } Token; 25 | 26 | void set_line(char *line); 27 | void get_token(Token *token); 28 | 29 | #endif /* TOKEN_H_INCLUDED */ -------------------------------------------------------------------------------- /ProgrammingLanguage/book/calc/mycalc.l: -------------------------------------------------------------------------------- 1 | %{ 2 | #include 3 | #include "y.tab.h" 4 | 5 | int 6 | yywrap(void) 7 | { 8 | return 1; 9 | } 10 | %} 11 | %% 12 | "+" return ADD; 13 | "-" return SUB; 14 | "*" return MUL; 15 | "/" return DIV; 16 | "(" return LP; 17 | ")" return RP; 18 | "\n" return CR; 19 | ([1-9][0-9]*)|0|([0-9]+\.[0-9]+) { 20 | double temp; 21 | sscanf(yytext, "%lf", &temp); 22 | yylval.double_value = temp; 23 | return DOUBLE_LITERAL; 24 | } 25 | [ \t] ; 26 | . { 27 | fprintf(stderr, "lexical error.\n"); 28 | exit(1); 29 | } 30 | %% -------------------------------------------------------------------------------- /Python/Pythonista 容易忽略的python编程方式.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yangruihan/Notes/4e9855bf07f5ea772649b685995c9294eccfcdac/Python/Pythonista 容易忽略的python编程方式.md -------------------------------------------------------------------------------- /Python/一些实用的python小建议.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yangruihan/Notes/4e9855bf07f5ea772649b685995c9294eccfcdac/Python/一些实用的python小建议.md -------------------------------------------------------------------------------- /PythonUtils/py_progressbar/README.md: -------------------------------------------------------------------------------- 1 | # Python 命令行进度条 2 | 3 | 根据文章[Python·进度条](https://zhuanlan.zhihu.com/p/24617537?refer=carefree0910-pyml)开发 4 | 5 | 主要通过`print('\r' + 'xxx', end='')`可以把命令行中当前的输出行清除掉之后再输出'xxx'实现 -------------------------------------------------------------------------------- /PythonUtils/py_progressbar/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yangruihan/Notes/4e9855bf07f5ea772649b685995c9294eccfcdac/PythonUtils/py_progressbar/__init__.py -------------------------------------------------------------------------------- /RegularExpression/匹配字符串.md: -------------------------------------------------------------------------------- 1 | # 匹配字符串的正则表达式 2 | 3 | 先给结论:`"(?:\\.|[^\\"])*"` 4 | 5 | ## 普通匹配 6 | 7 | 只匹配双引号引起来的内容,如: 8 | 9 | ``` 10 | "123", "hello" 11 | ``` 12 | 13 | 对应正则表达式:`("[^"]*")` 14 | 15 | 其中,左右两边的`"`匹配字符串左右两边的引号,中间的`[^"]*`匹配零或多个非`"`内容 16 | 17 | 但是,这样的匹配有一个缺陷,如果字符串中包含转义字符,则无能为力,如: 18 | 19 | ``` 20 | "I say: \"hello\"" 21 | ``` 22 | 23 | 匹配出来的结果为:`"I say: \"`,很明显不是我们需要的 24 | 25 | ## 带转义字符的匹配 26 | 27 | 因此我们需要使用 `"(?:\\.|[^\\"])*"` 28 | 29 | 其中,左右两边的`"`依旧是匹配字符串左右两边的引号,中间`(?:...)`表示不捕获分组,后面结果不能引用它,剩下的内容含义是:`\\.`表示`\`转义字符后面跟上任意一个字符,`[^\\"]`表示所有非`\`和`"`字符,总结就是:任意非`"`和`\`字符或者`\`后面跟着任意一个字符 -------------------------------------------------------------------------------- /Rust/RustBook学习笔记.md: -------------------------------------------------------------------------------- 1 | # Rust Book 学习笔记 2 | 3 | https://github.com/yangruihan/rust_study-1 -------------------------------------------------------------------------------- /SVN/命令行配置全局忽略.md: -------------------------------------------------------------------------------- 1 | 根目录创建一个 .svnignore 文件,将需要忽略的文件添加到该文件中,也可以使用正则表达式,文件格式类似于 .gitignore 2 | 3 | 如 UE4 4 | 5 | ``` 6 | Binaries 7 | DerivedDataCache 8 | Intermediate 9 | Saved 10 | ``` 11 | 12 | 在根目录下执行下面的命令: 13 | 14 | ```sh 15 | svn propset svn:global-ignores -F .svnignore . 16 | ``` 17 | -------------------------------------------------------------------------------- /Scripts/auto_t.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | 3 | import os 4 | 5 | 6 | for root, dirs, files in os.walk('.'): 7 | for f in files: 8 | file = os.path.join(root, f) 9 | if file.endswith('.cs'): 10 | content = '' 11 | try: 12 | with open(file, 'rt', encoding='gb2312') as rf: 13 | content = rf.read() 14 | 15 | with open(file, 'wt', encoding='utf-8') as wf: 16 | wf.write(content) 17 | 18 | print(file) 19 | except: 20 | pass 21 | -------------------------------------------------------------------------------- /Scripts/clip.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | 3 | 4 | import os 5 | import sys 6 | 7 | 8 | FILE_PATH = os.path.join(os.path.expanduser('~'), '.emacs.d/.clip_temp_file') 9 | 10 | 11 | def print_to_stdout(*a): 12 | print(*a, file=sys.stdout) 13 | 14 | 15 | def main(): 16 | if os.path.exists(FILE_PATH): 17 | with open(FILE_PATH, 'r') as f: 18 | print_to_stdout(f"{f.read()}") 19 | else: 20 | print_to_stdout('') 21 | 22 | 23 | if __name__ == '__main__': 24 | main() 25 | -------------------------------------------------------------------------------- /Scripts/git_add_commit_push.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | if [ ! -n "$1" ] 4 | then 5 | echo "Error: You should write the commit info!" 6 | else 7 | git add . 8 | git commit -m "\"$1\"" 9 | git push 10 | fi -------------------------------------------------------------------------------- /Scripts/update.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | brew update && brew upgrade `brew outdated` 4 | -------------------------------------------------------------------------------- /Sublime Text/SublimeText3常用插件.md: -------------------------------------------------------------------------------- 1 | # Sublime Text3 常用插件 2 | 此文章记录本人在日常编码中使用到的 Sublime Text3 常用插件以便日后重装 3 | 4 | 1. Alignment 5 | 6 | 2. All Autocomplete 7 | 8 | 3. AutoFileName 9 | 10 | 4. BracketHighlighter 11 | 12 | 5. ColorPicker 13 | 14 | 6. CTags 15 | 16 | 7. Djaneiro 17 | 18 | 8. Emmet 19 | 20 | 9. GIt 21 | 22 | 10. GitGutter 23 | 24 | 11. Markdown Extended 25 | 26 | 12. Markdown Preview 27 | 28 | 13. Monokai Extended 29 | 30 | 14. Nodejs 31 | 32 | 15. Package Control 33 | 34 | 16. PyV8 35 | 36 | 17. SideBarEnhancements 37 | 38 | 18. SublimeREPL 39 | 40 | 19. Theme-Soda 41 | 42 | 20. TrailingSpaces 43 | 44 | 21. Web Inspector 45 | 46 | 22. Anaconda 47 | -------------------------------------------------------------------------------- /Tmux/conf: -------------------------------------------------------------------------------- 1 | set -g default-terminal "screen-256color" 2 | unbind C-b 3 | set -g prefix 'C-\' 4 | -------------------------------------------------------------------------------- /Unity3D/ECS/ECS.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yangruihan/Notes/4e9855bf07f5ea772649b685995c9294eccfcdac/Unity3D/ECS/ECS.md -------------------------------------------------------------------------------- /Unity3D/Understanding FixedUpdate, FixedTimeStep and Maximum Allowed Timestep in Unity.md: -------------------------------------------------------------------------------- 1 | > http://blog.lidia-martinez.com/fixedupdate-fixedtimestep-maximum-allowed-timestep-unity 2 | -------------------------------------------------------------------------------- /Unity3D/Unity 3D 快捷键.md: -------------------------------------------------------------------------------- 1 | # Unity 3D 快捷键 2 | - 在 Hierarchy 视图中选中任何游戏对象,`f`键可以选中该对象,`Shift + f`或者双击,都可以定位到该游戏对象 3 | 4 | - 按下`鼠标右键 + WASD`进行场景漫游 5 | 6 | - 按下`Alt + 鼠标左键`旋转视角(以可视区域为轴旋转) 7 | 8 | - 按下鼠标右键旋转视角(以自身为轴旋转) 9 | 10 | - `QWERT`分别是手形工具、平移工具、旋转工具、缩放工具和 2D 工具的快捷键 11 | 12 | - `Ctrl + Shift + f`将当前视角变成摄像机视角 13 | 14 | -------------------------------------------------------------------------------- /Unity3D/Unity 资源的优化管理.md: -------------------------------------------------------------------------------- 1 | # Unity 资源的优化管理.md 2 | ## 什么是 Asset 3 | Mesh、Material、Texture、Audio、etc... 4 | 5 | ## 资源管理方式 6 | - Assets 7 | 8 | - 只有被引用的资源会被打包 9 | 10 | - 适合存放静态资源 11 | 12 | - 不能动态加载 13 | 14 | - Resources 15 | 16 | - 支持动态加载 17 | 18 | - Resources.assets 文件(2G限制) 19 | 20 | - 随安装包完全下载、无法动态更新 21 | 22 | - StreamingAssets 23 | 24 | - 保持文件原始格式 25 | 26 | - 随安装包完全下载、无法动态更新 27 | 28 | - Application.streamingAssetsPath 29 | 30 | - AssetBundle 31 | 32 | - Asset 的集合 33 | 34 | - 压缩(缺省) 35 | 36 | - 动态加载 37 | 38 | - 动态更新 39 | 40 | *注:下面3个文件夹仍然放置在 Assets 文件夹中,这里的 Assets 指不包括下面3个文件夹的其他资源* -------------------------------------------------------------------------------- /Unity3D/Unity3D 动画介绍.md: -------------------------------------------------------------------------------- 1 | # Unity3D 动画介绍 2 | ## Mecanim 动画系统介绍 3 | - 内置动画状态机系统 4 | 5 | - 人物动画的重定向 6 | 7 | - 动画的分解与混合 8 | 9 | - 关节动画的 IK 逆向定位 10 | 11 | ## Animation View 窗口可以修改的类型 12 | - Float 13 | 14 | - Color 15 | 16 | - Vector2 17 | 18 | - Vector3 19 | 20 | - Vector4 21 | 22 | - Quaternion 23 | 24 | - Boolean -------------------------------------------------------------------------------- /Unity3D/image_res/animation_missing_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yangruihan/Notes/4e9855bf07f5ea772649b685995c9294eccfcdac/Unity3D/image_res/animation_missing_1.png -------------------------------------------------------------------------------- /Unity3D/image_res/animation_missing_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yangruihan/Notes/4e9855bf07f5ea772649b685995c9294eccfcdac/Unity3D/image_res/animation_missing_2.png -------------------------------------------------------------------------------- /Unity3D/image_res/animation_missing_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yangruihan/Notes/4e9855bf07f5ea772649b685995c9294eccfcdac/Unity3D/image_res/animation_missing_3.png -------------------------------------------------------------------------------- /Unity3D/image_res/animation_missing_4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yangruihan/Notes/4e9855bf07f5ea772649b685995c9294eccfcdac/Unity3D/image_res/animation_missing_4.png -------------------------------------------------------------------------------- /Unity3D/image_res/animation_missing_5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yangruihan/Notes/4e9855bf07f5ea772649b685995c9294eccfcdac/Unity3D/image_res/animation_missing_5.png -------------------------------------------------------------------------------- /Unity3D/image_res/animation_missing_6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yangruihan/Notes/4e9855bf07f5ea772649b685995c9294eccfcdac/Unity3D/image_res/animation_missing_6.png -------------------------------------------------------------------------------- /Unity3D/image_res/animation_missing_7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yangruihan/Notes/4e9855bf07f5ea772649b685995c9294eccfcdac/Unity3D/image_res/animation_missing_7.png -------------------------------------------------------------------------------- /Unity3D/image_res/u3d-1-1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yangruihan/Notes/4e9855bf07f5ea772649b685995c9294eccfcdac/Unity3D/image_res/u3d-1-1.jpg -------------------------------------------------------------------------------- /Unity3D/image_res/u3d-1-2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yangruihan/Notes/4e9855bf07f5ea772649b685995c9294eccfcdac/Unity3D/image_res/u3d-1-2.jpg -------------------------------------------------------------------------------- /Unity3D/image_res/u3d_tool_text_match_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yangruihan/Notes/4e9855bf07f5ea772649b685995c9294eccfcdac/Unity3D/image_res/u3d_tool_text_match_1.png -------------------------------------------------------------------------------- /Unity3D/image_res/u3d_tool_text_match_2.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yangruihan/Notes/4e9855bf07f5ea772649b685995c9294eccfcdac/Unity3D/image_res/u3d_tool_text_match_2.gif -------------------------------------------------------------------------------- /Unreal/UE 视频资源.md: -------------------------------------------------------------------------------- 1 | # UE 视频资源 2 | 3 | ## 基础 4 | 5 | ## 游戏性 6 | 7 | - [GAS插件介绍(入门篇)](https://www.bilibili.com/video/BV1X5411V7jh) 8 | -------------------------------------------------------------------------------- /Unreal/Unreal源代码阅读笔记.md: -------------------------------------------------------------------------------- 1 | # Unreal 源代码阅读笔记 2 | 3 | ## 整体结构 4 | 5 | ```[] 6 | Engine 7 | --(1..n)-> 8 | GameInstance 9 | --(1..1)-> 10 | WorldContext 11 | --(1..n)--> 12 | World 13 | --(1..n)--> 14 | Level 15 | --(1..n)--> 16 | Actor 17 | ``` -------------------------------------------------------------------------------- /VSCode/macOS问题汇总.md: -------------------------------------------------------------------------------- 1 | # Macos 出现更新报错 "Could not create temporary directory: 权限被拒绝" 如何解决? 2 | 3 | 解决方案 4 | ```sh 5 | sudo chown $USER ~/Library/Caches/com.microsoft.VSCode.ShipIt/ 6 | ``` 7 | 8 | 然后重启,即可解决问题。 9 | --------------------------------------------------------------------------------