├── .gitignore ├── .idea ├── compiler.xml ├── copyright │ └── profiles_settings.xml ├── gradle.xml ├── markdown-navigator │ └── profiles_settings.xml ├── misc.xml ├── modules.xml ├── runConfigurations.xml └── vcs.xml ├── README.md ├── app ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── net │ │ └── sxkeji │ │ └── shixindesignpattern │ │ └── ApplicationTest.java │ ├── main │ ├── AndroidManifest.xml │ ├── java │ │ └── net │ │ │ └── sxkeji │ │ │ └── shixindesignpattern │ │ │ ├── DesignPatternBeans.java │ │ │ ├── MainActivity.java │ │ │ ├── adapter │ │ │ ├── Chinese.java │ │ │ ├── ClassTranslator.java │ │ │ ├── SampleAdapter.java │ │ │ ├── Translator.java │ │ │ └── Ukrainian.java │ │ │ ├── dynamicproxy │ │ │ ├── Agent.java │ │ │ ├── IMovieStar.java │ │ │ ├── ISingerStar.java │ │ │ ├── ProxyHandler.java │ │ │ └── Star.java │ │ │ ├── factory │ │ │ ├── Intro.java │ │ │ ├── abstractfactory │ │ │ │ ├── AbstractFactory.java │ │ │ │ ├── BMWx3ActivityAFactory.java │ │ │ │ └── BMWx4ActivityBFactory.java │ │ │ ├── beans │ │ │ │ ├── BMW.java │ │ │ │ ├── BMWx3.java │ │ │ │ ├── BMWx4.java │ │ │ │ ├── CarActivity.java │ │ │ │ ├── CarActivityA.java │ │ │ │ └── CarActivityB.java │ │ │ ├── factory │ │ │ │ ├── BMWx3Factory.java │ │ │ │ ├── BMWx4Factory.java │ │ │ │ └── Factory.java │ │ │ └── simplefactory │ │ │ │ └── SimpleFactory.java │ │ │ ├── observer │ │ │ ├── AxeGangBoss.java │ │ │ └── AxeGangPeople.java │ │ │ ├── singleton │ │ │ └── StaticInnerSingleton.java │ │ │ ├── staticproxy │ │ │ ├── Agent.java │ │ │ ├── Environment.java │ │ │ ├── IStar.java │ │ │ └── Star.java │ │ │ └── strategy │ │ │ ├── StoryA.java │ │ │ ├── StoryB.java │ │ │ ├── Synopsis.java │ │ │ └── WriteNovel.java │ └── res │ │ ├── layout │ │ ├── activity_main.xml │ │ ├── item_sample.xml │ │ └── item_text.xml │ │ ├── mipmap-hdpi │ │ └── ic_launcher.png │ │ ├── mipmap-mdpi │ │ └── ic_launcher.png │ │ ├── mipmap-xhdpi │ │ ├── ic_launcher.png │ │ └── icon_ez.jpg │ │ ├── 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 │ └── net │ └── sxkeji │ └── shixindesignpattern │ ├── ExampleUnitTest.java │ ├── adapter │ └── TranslatorTest.java │ ├── dynamicproxy │ └── AgentTest.java │ ├── factory │ ├── AbstractFactoryTest.java │ ├── FactoryTest.java │ └── SimpleFactoryTest.java │ ├── observer │ └── ObserverTest.java │ ├── singleton │ └── SingletonTest.java │ ├── staticproxy │ └── StarTest.java │ ├── strategy │ └── WriteNovelTest.java │ └── test │ ├── MyInvocationHandlerTest.java │ └── TextUtilsTest.java ├── build.gradle ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat └── settings.gradle /.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | /local.properties 4 | /.idea/workspace.xml 5 | /.idea/libraries 6 | .DS_Store 7 | /build 8 | /captures 9 | -------------------------------------------------------------------------------- /.idea/compiler.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /.idea/copyright/profiles_settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /.idea/gradle.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 17 | 18 | -------------------------------------------------------------------------------- /.idea/markdown-navigator/profiles_settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 38 | 39 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 87 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | Abstraction issuesJava 107 | 108 | 109 | Android 110 | 111 | 112 | Android > Lint > Accessibility 113 | 114 | 115 | Android > Lint > Correctness 116 | 117 | 118 | Android > Lint > Correctness > Messages 119 | 120 | 121 | Android > Lint > Internationalization 122 | 123 | 124 | Android > Lint > Internationalization > Bidirectional Text 125 | 126 | 127 | Android > Lint > Performance 128 | 129 | 130 | Android > Lint > Security 131 | 132 | 133 | Android > Lint > Usability 134 | 135 | 136 | Android > Lint > Usability > Icons 137 | 138 | 139 | Android > Lint > Usability > Typography 140 | 141 | 142 | Android Lint for Kotlin 143 | 144 | 145 | Annotations verifyingGroovy 146 | 147 | 148 | Assignment issuesGroovy 149 | 150 | 151 | Assignment issuesJava 152 | 153 | 154 | Bitwise operation issuesJava 155 | 156 | 157 | C/C++ 158 | 159 | 160 | Class metricsJava 161 | 162 | 163 | Class structureJava 164 | 165 | 166 | Cloning issuesJava 167 | 168 | 169 | Code style issuesJava 170 | 171 | 172 | Concurrency annotation issuesJava 173 | 174 | 175 | Control FlowGroovy 176 | 177 | 178 | Control flow issuesJava 179 | 180 | 181 | Data flow issuesJava 182 | 183 | 184 | Declaration orderC/C++ 185 | 186 | 187 | Declaration redundancyGroovy 188 | 189 | 190 | Declaration redundancyJava 191 | 192 | 193 | DeclarationGroovy 194 | 195 | 196 | Dependency issuesJava 197 | 198 | 199 | Encapsulation issuesJava 200 | 201 | 202 | Error handlingJava 203 | 204 | 205 | Finalization issuesJava 206 | 207 | 208 | General 209 | 210 | 211 | GeneralJava 212 | 213 | 214 | Google Cloud Endpoints 215 | 216 | 217 | Groovy 218 | 219 | 220 | Ignore 221 | 222 | 223 | ImportsJava 224 | 225 | 226 | Inheritance issuesJava 227 | 228 | 229 | Initialization issuesJava 230 | 231 | 232 | Internationalization issuesJava 233 | 234 | 235 | J2ME issuesJava 236 | 237 | 238 | JSON 239 | 240 | 241 | JUnit issuesJava 242 | 243 | 244 | Java 245 | 246 | 247 | Java language level issuesJava 248 | 249 | 250 | Java language level migration aidsJava 251 | 252 | 253 | JavaBeans issuesJava 254 | 255 | 256 | Javadoc issuesJava 257 | 258 | 259 | Kotlin 260 | 261 | 262 | Language Injection 263 | 264 | 265 | Logging issuesJava 266 | 267 | 268 | Memory issuesJava 269 | 270 | 271 | Method metricsJava 272 | 273 | 274 | Modularization issuesJava 275 | 276 | 277 | Naming ConventionsGroovy 278 | 279 | 280 | Naming conventionsJava 281 | 282 | 283 | Numeric issuesJava 284 | 285 | 286 | Packaging issuesJava 287 | 288 | 289 | Performance issuesJava 290 | 291 | 292 | Portability issuesJava 293 | 294 | 295 | Potentially confusing code constructsGroovy 296 | 297 | 298 | Probable bugsGroovy 299 | 300 | 301 | Probable bugsJava 302 | 303 | 304 | Properties Files 305 | 306 | 307 | RELAX NG 308 | 309 | 310 | Security issuesJava 311 | 312 | 313 | Serialization issuesJava 314 | 315 | 316 | TestNGJava 317 | 318 | 319 | Threading issuesGroovy 320 | 321 | 322 | Threading issuesJava 323 | 324 | 325 | Type checksC/C++ 326 | 327 | 328 | Unused codeC/C++ 329 | 330 | 331 | Visibility issuesJava 332 | 333 | 334 | XML 335 | 336 | 337 | toString() issuesJava 338 | 339 | 340 | 341 | 342 | 343 | 344 | 345 | 346 | 347 | 348 | 349 | 350 | 351 | 352 | 353 | 354 | 355 | 356 | 357 | 359 | 360 | 361 | 362 | 363 | 364 | 369 | 370 | 371 | 372 | 373 | 374 | -------------------------------------------------------------------------------- /.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /.idea/runConfigurations.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 11 | 12 | -------------------------------------------------------------------------------- /.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # DesignPattern Learning Notes By shixinzhang 2 | 3 | ## 例子通俗易懂,代码简洁明了,虽是王婆卖瓜,说的却是实话 4 | 5 | ###各模式调用代码在 *app/src/test/* 下 6 | 7 | ## 相关博客 8 | 9 | ###[单一职责原则: 一个萝卜一个坑](http://blog.csdn.net/u011240877/article/details/52177033) 10 | 11 | ###[开放封闭原则: 一国两制](http://blog.csdn.net/u011240877/article/details/52187631) 12 | 13 | ###[里氏替换原则: 狸猫换太子](http://blog.csdn.net/u011240877/article/details/52187810) 14 | 15 | ###[依赖倒置原则: 老板是如何减轻负担的](http://blog.csdn.net/u011240877/article/details/52194373) 16 | 17 | ###[接口隔离原则: 辅导班的因材施教 ](http://blog.csdn.net/u011240877/article/details/52213659) 18 | 19 | ###[单例模式:茴字的几种写法](http://blog.csdn.net/u011240877/article/details/46988219) 20 | 21 | ###[代理模式:女朋友这么漂亮,你缺经纪人吗?](http://blog.csdn.net/u011240877/article/details/52264283) 22 | 23 | ###[动态代理:1 个经纪人如何代理 N 个明星](http://blog.csdn.net/u011240877/article/details/52334547) 24 | 25 | ###[策略模式:网络小说的固定套路](http://blog.csdn.net/u011240877/article/details/52346671) 26 | 27 | ###[ Android 中的那些策略模式](http://blog.csdn.net/u011240877/article/details/52493408) 28 | 29 | ###[适配器模式: 农村小伙娶乌克兰美女](http://blog.csdn.net/u011240877/article/details/52601040) 30 | 31 | ###[观察者模式: 一支穿云箭,千军万马来相见](http://blog.csdn.net/u011240877/article/details/52683558) 32 | 33 | ###[最熟悉的陌生人:ListView 中的观察者模式](http://blog.csdn.net/u011240877/article/details/52683711) -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /app/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.application' 2 | 3 | android { 4 | compileSdkVersion 23 5 | buildToolsVersion "23.0.1" 6 | 7 | defaultConfig { 8 | applicationId "net.sxkeji.shixindesignpattern" 9 | minSdkVersion 15 10 | targetSdkVersion 23 11 | versionCode 1 12 | versionName "1.0" 13 | } 14 | buildTypes { 15 | release { 16 | minifyEnabled false 17 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 18 | } 19 | } 20 | } 21 | 22 | dependencies { 23 | compile fileTree(dir: 'libs', include: ['*.jar']) 24 | testCompile 'junit:junit:4.12' 25 | compile 'com.android.support:appcompat-v7:23.1.1' 26 | } 27 | -------------------------------------------------------------------------------- /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 C:\zsx\AndroidSdk1/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 | -------------------------------------------------------------------------------- /app/src/androidTest/java/net/sxkeji/shixindesignpattern/ApplicationTest.java: -------------------------------------------------------------------------------- 1 | package net.sxkeji.shixindesignpattern; 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 | } -------------------------------------------------------------------------------- /app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /app/src/main/java/net/sxkeji/shixindesignpattern/DesignPatternBeans.java: -------------------------------------------------------------------------------- 1 | package net.sxkeji.shixindesignpattern; 2 | 3 | /** 4 | * description: 首页显示的设计模式实体类 5 | * 名称及URL 6 | *
7 | * author: shixinzhang 8 | *
9 | * data: 9/30/2016 10 | */ 11 | public class DesignPatternBeans { 12 | private String name; 13 | private String url; 14 | 15 | public String getName() { 16 | return name; 17 | } 18 | 19 | public void setName(String name) { 20 | this.name = name; 21 | } 22 | 23 | public String getUrl() { 24 | return url; 25 | } 26 | 27 | public void setUrl(String url) { 28 | this.url = url; 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /app/src/main/java/net/sxkeji/shixindesignpattern/MainActivity.java: -------------------------------------------------------------------------------- 1 | package net.sxkeji.shixindesignpattern; 2 | 3 | import android.os.Bundle; 4 | import android.support.v7.app.AppCompatActivity; 5 | import android.widget.ListView; 6 | 7 | import net.sxkeji.shixindesignpattern.adapter.SampleAdapter; 8 | 9 | import java.util.ArrayList; 10 | import java.util.List; 11 | 12 | public class MainActivity extends AppCompatActivity { 13 | private ListView mListView; 14 | private List mData = new ArrayList<>(); 15 | private String[] mNameArray = {"单一职责原则: 一个萝卜一个坑", "开放封闭原则: 一国两制 ", 16 | "里氏替换原则: 狸猫换太子", "依赖倒置原则: 老板是如何减轻负担的", 17 | "接口隔离原则: 辅导班的因材施教 ", "单例模式:茴字的几种写法", 18 | "代理模式:女朋友这么漂亮,你缺经纪人吗?", "动态代理:1 个经纪人如何代理 N 个明星", 19 | "策略模式:网络小说的固定套路", " Android 中的那些策略模式", 20 | "适配器模式 : 农村小伙娶乌克兰美女", "观察者模式 : 一支穿云箭,千军万马来相见", 21 | "最熟悉的陌生人:ListView 中的观察者模式" 22 | }; 23 | private String[] mLinksArray = {"http://blog.csdn.net/u011240877/article/details/52177033", "http://blog.csdn.net/u011240877/article/details/52187631", 24 | "http://blog.csdn.net/u011240877/article/details/52187810", "(http://blog.csdn.net/u011240877/article/details/52194373", 25 | "http://blog.csdn.net/u011240877/article/details/52213659", 26 | "http://blog.csdn.net/u011240877/article/details/46988219", "http://blog.csdn.net/u011240877/article/details/52264283", 27 | "http://blog.csdn.net/u011240877/article/details/52334547", "http://blog.csdn.net/u011240877/article/details/52346671", 28 | "http://blog.csdn.net/u011240877/article/details/52493408", "http://blog.csdn.net/u011240877/article/details/52601040", 29 | "http://blog.csdn.net/u011240877/article/details/52683558", "http://blog.csdn.net/u011240877/article/details/52683711"}; 30 | 31 | @Override 32 | protected void onCreate(Bundle savedInstanceState) { 33 | super.onCreate(savedInstanceState); 34 | setContentView(R.layout.activity_main); 35 | 36 | mListView = (ListView) findViewById(R.id.list_view); 37 | 38 | for (int i = 0; i < mNameArray.length; i++) { 39 | DesignPatternBeans designPatternBeans = new DesignPatternBeans(); 40 | designPatternBeans.setName(mNameArray[i]); 41 | designPatternBeans.setUrl(mLinksArray[i]); 42 | mData.add(designPatternBeans); 43 | } 44 | SampleAdapter adapter = new SampleAdapter(this, mData); 45 | 46 | mListView.setAdapter(adapter); 47 | 48 | } 49 | 50 | @Override 51 | public void onWindowFocusChanged(boolean hasFocus) { 52 | super.onWindowFocusChanged(hasFocus); 53 | //获取在屏幕的位置 54 | int[] xy = new int[2]; 55 | mListView.getLocationInWindow(xy); 56 | System.out.println("tvItem in window location x:" + xy[0] + " / y:" + xy[1]); 57 | mListView.getLocationOnScreen(xy); 58 | System.out.println("tvItem on screen location x:" + xy[0] + " / y:" + xy[1]); 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /app/src/main/java/net/sxkeji/shixindesignpattern/adapter/Chinese.java: -------------------------------------------------------------------------------- 1 | package net.sxkeji.shixindesignpattern.adapter; 2 | 3 | /** 4 | * description:实际情况:只会中文 5 | *
6 | * author: shixinzhang 7 | *
8 | * data: 9/18/2016 9 | */ 10 | public class Chinese { 11 | /** 12 | * 说中文,比如:刘奶奶找牛奶奶买榴莲牛奶 13 | * @param string 14 | */ 15 | void sayChinese(String string) { 16 | System.out.println("【中文版】 " + string); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /app/src/main/java/net/sxkeji/shixindesignpattern/adapter/ClassTranslator.java: -------------------------------------------------------------------------------- 1 | package net.sxkeji.shixindesignpattern.adapter; 2 | 3 | /** 4 | * description: 类适配器下的翻译中介 5 | *
6 | * author: shixinzhang 7 | *
8 | * data: 9/20/2016 9 | */ 10 | public class ClassTranslator extends Chinese implements Ukrainian { 11 | @Override 12 | public void sayUkrainian(String string) { 13 | sayChinese(string); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /app/src/main/java/net/sxkeji/shixindesignpattern/adapter/SampleAdapter.java: -------------------------------------------------------------------------------- 1 | package net.sxkeji.shixindesignpattern.adapter; 2 | 3 | import android.content.Context; 4 | import android.content.Intent; 5 | import android.net.Uri; 6 | import android.view.LayoutInflater; 7 | import android.view.View; 8 | import android.view.ViewGroup; 9 | import android.widget.BaseAdapter; 10 | import android.widget.TextView; 11 | 12 | import net.sxkeji.shixindesignpattern.DesignPatternBeans; 13 | import net.sxkeji.shixindesignpattern.R; 14 | 15 | import java.util.List; 16 | 17 | /** 18 | * description: 设计模式列表 adapter 19 | *
20 | * author: shixinzhang 21 | *
22 | * data: 9/20/2016 23 | */ 24 | public class SampleAdapter extends BaseAdapter { 25 | private List mData; 26 | private Context mContext; 27 | 28 | public SampleAdapter(Context context, List dataList) { 29 | mContext = context; 30 | mData = dataList; 31 | } 32 | 33 | public void addData(DesignPatternBeans data) { 34 | if (mData != null) { 35 | mData.add(data); 36 | notifyDataSetChanged(); 37 | } 38 | } 39 | 40 | @Override 41 | public int getCount() { 42 | return mData.size(); 43 | } 44 | 45 | @Override 46 | public Object getItem(int position) { 47 | return mData.get(position); 48 | } 49 | 50 | @Override 51 | public long getItemId(int position) { 52 | return position; 53 | } 54 | 55 | @Override 56 | public View getView(final int position, View convertView, ViewGroup parent) { 57 | if (convertView == null) { 58 | convertView = LayoutInflater.from(mContext).inflate(R.layout.item_sample, null); 59 | } 60 | TextView tvItem = (TextView) convertView.findViewById(R.id.tv_item); 61 | tvItem.setText(mData.get(position).getName()); 62 | // Linkify.addLinks(tvItem, Linkify.ALL); 63 | tvItem.setOnClickListener(new View.OnClickListener() { 64 | @Override 65 | public void onClick(View v) { 66 | Intent view = new Intent(); 67 | view.setAction(Intent.ACTION_VIEW); 68 | view.setData(Uri.parse(mData.get(position).getUrl())); 69 | mContext.startActivity(view); 70 | } 71 | }); 72 | return convertView; 73 | } 74 | } 75 | -------------------------------------------------------------------------------- /app/src/main/java/net/sxkeji/shixindesignpattern/adapter/Translator.java: -------------------------------------------------------------------------------- 1 | package net.sxkeji.shixindesignpattern.adapter; 2 | 3 | /** 4 | * description: 翻译 5 | *
6 | * author: shixinzhang 7 | *
8 | * data: 9/18/2016 9 | */ 10 | public class Translator implements Ukrainian { 11 | private Chinese mChinese; 12 | 13 | public Translator(Chinese chinese) { 14 | mChinese = chinese; 15 | } 16 | 17 | @Override 18 | public void sayUkrainian(String string) { 19 | mChinese.sayChinese(string); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /app/src/main/java/net/sxkeji/shixindesignpattern/adapter/Ukrainian.java: -------------------------------------------------------------------------------- 1 | package net.sxkeji.shixindesignpattern.adapter; 2 | 3 | /** 4 | * description:目标:说乌克兰语 5 | *
6 | * author: shixinzhang 7 | *
8 | * data: 9/18/2016 9 | */ 10 | public interface Ukrainian { 11 | /** 12 | * 说乌克兰语,比如:Я люблю тебя  13 | * @param string 14 | */ 15 | void sayUkrainian(String string); 16 | } 17 | -------------------------------------------------------------------------------- /app/src/main/java/net/sxkeji/shixindesignpattern/dynamicproxy/Agent.java: -------------------------------------------------------------------------------- 1 | package net.sxkeji.shixindesignpattern.dynamicproxy; 2 | 3 | /** 4 | * 经纪人,代理某个明星,有活动、广告、电影都是先找经纪人沟通 5 | * Created by zhangshixin on 8/25/2016. 6 | */ 7 | public class Agent implements IMovieStar { 8 | /** 9 | * 代理的明星 10 | */ 11 | Star mTarget; 12 | 13 | public Agent(Star target) { 14 | mTarget = target; 15 | } 16 | 17 | @Override 18 | public void movieShow(int money) { 19 | if (money < 30000000) { 20 | System.out.println(money + "块钱?!你雇 HuangZiTao 演电影去吧!"); 21 | return; 22 | } 23 | mTarget.movieShow(money); 24 | } 25 | 26 | @Override 27 | public void tvShow(int money) { 28 | if (money < 30000000) { 29 | System.out.println(money + "块钱?!你雇 HuangZiTao 演电视剧去吧!"); 30 | return; 31 | } 32 | mTarget.tvShow(money); 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /app/src/main/java/net/sxkeji/shixindesignpattern/dynamicproxy/IMovieStar.java: -------------------------------------------------------------------------------- 1 | package net.sxkeji.shixindesignpattern.dynamicproxy; 2 | 3 | /** 4 | * 影星接口,定义影星的基本行为 5 | * Created by zhangshixin on 8/25/2016. 6 | */ 7 | public interface IMovieStar { 8 | /** 9 | * 演电影 10 | * @param money 演电影的片酬,以 int 为单位就够了,除了我星爷,没听说谁的片酬能上亿 11 | */ 12 | void movieShow(int money); 13 | 14 | /** 15 | * 演电视剧 16 | * @param money 演电视剧的片酬 17 | */ 18 | void tvShow(int money); 19 | } 20 | -------------------------------------------------------------------------------- /app/src/main/java/net/sxkeji/shixindesignpattern/dynamicproxy/ISingerStar.java: -------------------------------------------------------------------------------- 1 | package net.sxkeji.shixindesignpattern.dynamicproxy; 2 | 3 | /** 4 | * 歌星,定义歌星的基本行为 5 | * Created by zhangshixin on 8/25/2016. 6 | * Update on ${DATA} 7 | */ 8 | public interface ISingerStar { 9 | /** 10 | * 唱歌 11 | * @param number 歌曲数 12 | */ 13 | void sing(int number); 14 | 15 | /** 16 | * 写专辑 17 | * @param number 专辑歌曲数 18 | */ 19 | void writeAlbum(int number); 20 | } 21 | -------------------------------------------------------------------------------- /app/src/main/java/net/sxkeji/shixindesignpattern/dynamicproxy/ProxyHandler.java: -------------------------------------------------------------------------------- 1 | package net.sxkeji.shixindesignpattern.dynamicproxy; 2 | 3 | import java.lang.reflect.InvocationHandler; 4 | import java.lang.reflect.Method; 5 | import java.lang.reflect.Proxy; 6 | 7 | /** 8 | * 自定义的动态代理处理器 9 | * Created by zhangshixin on 8/24/2016. 10 | * Update on ${DATA} 11 | */ 12 | public class ProxyHandler implements InvocationHandler { 13 | //被代理对象 14 | private Object mTarget; 15 | 16 | public ProxyHandler(Object target) { 17 | this.mTarget = target; 18 | } 19 | 20 | /** 21 | * 方法拦截,可以进行一些额外操作 22 | * @param proxy 23 | * @param method 24 | * @param args 25 | * @return 26 | * @throws Throwable 27 | */ 28 | @Override 29 | public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { 30 | String methodName = method.getName(); 31 | if (methodName.equals("movieShow") || methodName.equals("tvShow")) { 32 | if (args[0] instanceof Integer && ((int) args[0]) < 300000000) { 33 | System.out.println(((int) args[0]) + "块钱?!你雇 HuangZiTao 演去吧!"); 34 | return null; 35 | } 36 | } 37 | Object result = method.invoke(mTarget, args); 38 | 39 | return result; 40 | } 41 | 42 | /** 43 | * 获取代理 44 | * @return 45 | */ 46 | public Object getProxy() { 47 | return Proxy.newProxyInstance(mTarget.getClass().getClassLoader(), mTarget.getClass().getInterfaces(), this); 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /app/src/main/java/net/sxkeji/shixindesignpattern/dynamicproxy/Star.java: -------------------------------------------------------------------------------- 1 | package net.sxkeji.shixindesignpattern.dynamicproxy; 2 | 3 | /** 4 | * 明星,可能是影歌双栖 5 | * Created by zhangshixin on 8/25/2016. 6 | */ 7 | public class Star implements IMovieStar, ISingerStar { 8 | private String mName; 9 | 10 | public Star(String name) { 11 | mName = name; 12 | } 13 | 14 | @Override 15 | public void movieShow(int money) { 16 | System.out.println(mName + " 出演了部片酬 " + money + " 元的电影"); 17 | } 18 | 19 | @Override 20 | public void tvShow(int money) { 21 | System.out.println(mName + " 出演了部片酬 " + money + " 元的电视剧"); 22 | } 23 | 24 | /** 25 | * 黄渤早年其实是个歌手!唱歌一流 26 | * @param number 歌曲数 27 | */ 28 | @Override 29 | public void sing(int number) { 30 | System.out.println(mName + " 唱了 " + number + " 首歌"); 31 | } 32 | 33 | @Override 34 | public void writeAlbum(int number) { 35 | 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /app/src/main/java/net/sxkeji/shixindesignpattern/factory/Intro.java: -------------------------------------------------------------------------------- 1 | package net.sxkeji.shixindesignpattern.factory; 2 | 3 | /** 4 | * Description: 5 | *
工厂模式,将创建对象的部分封装到工厂中,只需特定参数即可创造出对应的对象,隐藏具体创建过程 6 | *

7 | * 主要分为三种: 8 | * 1.简单工厂 9 | * 2.工厂方法 10 | * 3.抽象工厂 11 | *

12 | * http://blog.csdn.net/hguisu/article/details/7505909 13 | *

14 | *
Created by shixinzhang on 17/9/2. 15 | *

16 | *
Email: shixinzhang2016@gmail.com 17 | *

18 | *
https://about.me/shixinzhang 19 | */ 20 | 21 | public class Intro { 22 | } 23 | -------------------------------------------------------------------------------- /app/src/main/java/net/sxkeji/shixindesignpattern/factory/abstractfactory/AbstractFactory.java: -------------------------------------------------------------------------------- 1 | package net.sxkeji.shixindesignpattern.factory.abstractfactory; 2 | 3 | import net.sxkeji.shixindesignpattern.factory.beans.BMW; 4 | import net.sxkeji.shixindesignpattern.factory.beans.CarActivity; 5 | 6 | /** 7 | * Description: 8 | *
抽象工厂 9 | * 抽象工厂模式和工厂方法模式的区别就在于需要创建对象的复杂程度上 10 | *

11 | * 使用抽象工厂模式还要满足一下条件: 12 | * 1)系统中有多个产品族,而系统一次只可能消费其中一族产品。 13 | * 2)同属于同一个产品族的产品以其使用。 14 | *

15 | * 假设不同汽车关联着不同的活动,那工厂出一个车的同时还要提供这个车的活动信息 16 | *

17 | * 其实就是将产品的多种组成(A + B)簇组合到一个工厂(生产 A 和 B),不同产品有不同工厂(生产不同的 A 和 B) 18 | *

19 | *

这样具体的创建实例过程与客户端分离 20 | *
Created by shixinzhang on 17/9/2. 21 | *

22 | *
Email: shixinzhang2016@gmail.com 23 | *

24 | *
https://about.me/shixinzhang 25 | */ 26 | 27 | public abstract class AbstractFactory { 28 | public abstract BMW getCar(); 29 | 30 | public abstract CarActivity getActivity(); 31 | } 32 | -------------------------------------------------------------------------------- /app/src/main/java/net/sxkeji/shixindesignpattern/factory/abstractfactory/BMWx3ActivityAFactory.java: -------------------------------------------------------------------------------- 1 | package net.sxkeji.shixindesignpattern.factory.abstractfactory; 2 | 3 | import net.sxkeji.shixindesignpattern.factory.beans.BMW; 4 | import net.sxkeji.shixindesignpattern.factory.beans.BMWx3; 5 | import net.sxkeji.shixindesignpattern.factory.beans.CarActivity; 6 | import net.sxkeji.shixindesignpattern.factory.beans.CarActivityA; 7 | 8 | /** 9 | * Description: 10 | *
11 | *

12 | *
Created by shixinzhang on 17/9/2. 13 | *

14 | *
Email: shixinzhang2016@gmail.com 15 | *

16 | *
https://about.me/shixinzhang 17 | */ 18 | 19 | public class BMWx3ActivityAFactory extends AbstractFactory{ 20 | @Override 21 | public BMW getCar() { 22 | return new BMWx3(); 23 | } 24 | 25 | @Override 26 | public CarActivity getActivity() { 27 | return new CarActivityA(); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /app/src/main/java/net/sxkeji/shixindesignpattern/factory/abstractfactory/BMWx4ActivityBFactory.java: -------------------------------------------------------------------------------- 1 | package net.sxkeji.shixindesignpattern.factory.abstractfactory; 2 | 3 | import net.sxkeji.shixindesignpattern.factory.beans.BMW; 4 | import net.sxkeji.shixindesignpattern.factory.beans.BMWx4; 5 | import net.sxkeji.shixindesignpattern.factory.beans.CarActivity; 6 | import net.sxkeji.shixindesignpattern.factory.beans.CarActivityB; 7 | 8 | /** 9 | * Description: 10 | *
11 | *

12 | *
Created by shixinzhang on 17/9/2. 13 | *

14 | *
Email: shixinzhang2016@gmail.com 15 | *

16 | *
https://about.me/shixinzhang 17 | */ 18 | 19 | public class BMWx4ActivityBFactory extends AbstractFactory { 20 | @Override 21 | public BMW getCar() { 22 | return new BMWx4(); 23 | } 24 | 25 | @Override 26 | public CarActivity getActivity() { 27 | return new CarActivityB(); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /app/src/main/java/net/sxkeji/shixindesignpattern/factory/beans/BMW.java: -------------------------------------------------------------------------------- 1 | package net.sxkeji.shixindesignpattern.factory.beans; 2 | 3 | /** 4 | * Description: 5 | *
要创建的产品父类 6 | *

7 | *
Created by shixinzhang on 17/9/2. 8 | *

9 | *
Email: shixinzhang2016@gmail.com 10 | *

11 | *
https://about.me/shixinzhang 12 | */ 13 | 14 | public class BMW { 15 | public BMW() { 16 | System.out.println("I'm BMW"); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /app/src/main/java/net/sxkeji/shixindesignpattern/factory/beans/BMWx3.java: -------------------------------------------------------------------------------- 1 | package net.sxkeji.shixindesignpattern.factory.beans; 2 | 3 | /** 4 | * Description: 5 | *
宝马 X3 6 | *

7 | *
Created by shixinzhang on 17/9/2. 8 | *

9 | *
Email: shixinzhang2016@gmail.com 10 | *

11 | *
https://about.me/shixinzhang 12 | */ 13 | 14 | public class BMWx3 extends BMW { 15 | 16 | public BMWx3() { 17 | System.out.println("I'm BMWx3"); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /app/src/main/java/net/sxkeji/shixindesignpattern/factory/beans/BMWx4.java: -------------------------------------------------------------------------------- 1 | package net.sxkeji.shixindesignpattern.factory.beans; 2 | 3 | /** 4 | * Description: 5 | *
宝马 X3 6 | *

7 | *
Created by shixinzhang on 17/9/2. 8 | *

9 | *
Email: shixinzhang2016@gmail.com 10 | *

11 | *
https://about.me/shixinzhang 12 | */ 13 | 14 | public class BMWx4 extends BMW { 15 | 16 | public BMWx4() { 17 | System.out.println("I'm BMWx4"); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /app/src/main/java/net/sxkeji/shixindesignpattern/factory/beans/CarActivity.java: -------------------------------------------------------------------------------- 1 | package net.sxkeji.shixindesignpattern.factory.beans; 2 | 3 | /** 4 | * Description: 5 | *
车关联的活动 6 | *

7 | *
Created by shixinzhang on 17/9/2. 8 | *

9 | *
Email: shixinzhang2016@gmail.com 10 | *

11 | *
https://about.me/shixinzhang 12 | */ 13 | 14 | public class CarActivity { 15 | public CarActivity() { 16 | System.out.println("购车活动"); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /app/src/main/java/net/sxkeji/shixindesignpattern/factory/beans/CarActivityA.java: -------------------------------------------------------------------------------- 1 | package net.sxkeji.shixindesignpattern.factory.beans; 2 | 3 | /** 4 | * Description: 5 | *
6 | *

7 | *
Created by shixinzhang on 17/9/2. 8 | *

9 | *
Email: shixinzhang2016@gmail.com 10 | *

11 | *
https://about.me/shixinzhang 12 | */ 13 | 14 | public class CarActivityA extends CarActivity { 15 | 16 | public CarActivityA() { 17 | System.out.println("购车活动 A"); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /app/src/main/java/net/sxkeji/shixindesignpattern/factory/beans/CarActivityB.java: -------------------------------------------------------------------------------- 1 | package net.sxkeji.shixindesignpattern.factory.beans; 2 | 3 | /** 4 | * Description: 5 | *
6 | *

7 | *
Created by shixinzhang on 17/9/2. 8 | *

9 | *
Email: shixinzhang2016@gmail.com 10 | *

11 | *
https://about.me/shixinzhang 12 | */ 13 | 14 | public class CarActivityB extends CarActivity { 15 | public CarActivityB() { 16 | System.out.println("购车活动 B"); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /app/src/main/java/net/sxkeji/shixindesignpattern/factory/factory/BMWx3Factory.java: -------------------------------------------------------------------------------- 1 | package net.sxkeji.shixindesignpattern.factory.factory; 2 | 3 | import net.sxkeji.shixindesignpattern.factory.beans.BMW; 4 | import net.sxkeji.shixindesignpattern.factory.beans.BMWx3; 5 | 6 | /** 7 | * Description: 8 | *
专门创建宝马 x3 的工厂 9 | *

10 | *
Created by shixinzhang on 17/9/2. 11 | *

12 | *
Email: shixinzhang2016@gmail.com 13 | *

14 | *
https://about.me/shixinzhang 15 | */ 16 | 17 | public class BMWx3Factory extends Factory { 18 | @Override 19 | public BMW createCar() { 20 | return new BMWx3(); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /app/src/main/java/net/sxkeji/shixindesignpattern/factory/factory/BMWx4Factory.java: -------------------------------------------------------------------------------- 1 | package net.sxkeji.shixindesignpattern.factory.factory; 2 | 3 | import net.sxkeji.shixindesignpattern.factory.beans.BMW; 4 | import net.sxkeji.shixindesignpattern.factory.beans.BMWx4; 5 | 6 | /** 7 | * Description: 8 | *
专门创建宝马 x4 的工厂 9 | *

10 | *
Created by shixinzhang on 17/9/2. 11 | *

12 | *
Email: shixinzhang2016@gmail.com 13 | *

14 | *
https://about.me/shixinzhang 15 | */ 16 | 17 | public class BMWx4Factory extends Factory { 18 | @Override 19 | public BMW createCar() { 20 | return new BMWx4(); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /app/src/main/java/net/sxkeji/shixindesignpattern/factory/factory/Factory.java: -------------------------------------------------------------------------------- 1 | package net.sxkeji.shixindesignpattern.factory.factory; 2 | 3 | import net.sxkeji.shixindesignpattern.factory.beans.BMW; 4 | 5 | /** 6 | * Description: 7 | *
工厂方法模式,解决简单工厂新增商品需要修改工厂类的问题,如果新增商品,就新增工厂,而不是修改已有工厂 8 | *

9 | * 为每一种产品单独提供一个工厂,好处是不必修改已有工厂,将密集在一个工厂的策略分开 10 | * 坏处是:使得对象的数量成倍增长。当产品种类非常多时,会出现大量的与之对应的工厂对象 11 | *
Created by shixinzhang on 17/9/2. 12 | *

13 | *
Email: shixinzhang2016@gmail.com 14 | *

15 | *
https://about.me/shixinzhang 16 | */ 17 | 18 | public abstract class Factory { 19 | public abstract BMW createCar(); 20 | } 21 | -------------------------------------------------------------------------------- /app/src/main/java/net/sxkeji/shixindesignpattern/factory/simplefactory/SimpleFactory.java: -------------------------------------------------------------------------------- 1 | package net.sxkeji.shixindesignpattern.factory.simplefactory; 2 | 3 | import net.sxkeji.shixindesignpattern.factory.beans.BMW; 4 | import net.sxkeji.shixindesignpattern.factory.beans.BMWx3; 5 | import net.sxkeji.shixindesignpattern.factory.beans.BMWx4; 6 | 7 | /** 8 | * Description: 9 | *
简单工厂,又称静态工厂方法模式,定义一个用于创建对象的接口。【只有一个工厂类】 10 | *

11 | * 对于新产品的加入,工厂类是很被动的,违背开闭原则 12 | *
Created by shixinzhang on 17/9/2. 13 | *

14 | *
Email: shixinzhang2016@gmail.com 15 | *

16 | *
https://about.me/shixinzhang 17 | */ 18 | 19 | public class SimpleFactory { 20 | public static BMW createCar(int type) { 21 | switch (type) { 22 | case 3: 23 | return new BMWx3(); 24 | case 4: 25 | return new BMWx4(); 26 | // case 5: 27 | // return new BMWx5(); //如果新增产品,就需要修改工厂类 28 | default: 29 | break; 30 | } 31 | return null; 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /app/src/main/java/net/sxkeji/shixindesignpattern/observer/AxeGangBoss.java: -------------------------------------------------------------------------------- 1 | package net.sxkeji.shixindesignpattern.observer; 2 | 3 | import java.util.Observable; 4 | 5 | /** 6 | * description: 斧头帮老大,消息发布者,继承 Observable 7 | *
8 | * author: shixinzhang 9 | *
10 | * data: 9/20/2016 11 | */ 12 | public class AxeGangBoss extends Observable { 13 | private String mName; 14 | 15 | public AxeGangBoss(String name) { 16 | mName = name; 17 | } 18 | 19 | /** 20 | * 在需要通知订阅者的时候调用 setChanged()方法,表明有更新 21 | * 然后提醒所有订阅者 22 | * @param msg 23 | */ 24 | public void sendMsg(String msg) { 25 | //表示有更新 26 | setChanged(); 27 | notifyObservers(msg); 28 | } 29 | 30 | public String getName() { 31 | return mName; 32 | } 33 | 34 | public void setName(String name) { 35 | mName = name; 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /app/src/main/java/net/sxkeji/shixindesignpattern/observer/AxeGangPeople.java: -------------------------------------------------------------------------------- 1 | package net.sxkeji.shixindesignpattern.observer; 2 | 3 | import java.util.Observable; 4 | import java.util.Observer; 5 | 6 | /** 7 | * description: 斧头帮小弟,订阅者,实现 Observer 接口 8 | *
9 | * author: shixinzhang 10 | *
11 | * data: 9/20/2016 12 | */ 13 | public class AxeGangPeople implements Observer { 14 | String mName; 15 | 16 | public AxeGangPeople(String name){ 17 | mName = name; 18 | } 19 | 20 | /** 21 | * 必须实现的方法,当消息发布者发出通知后,会调用这个方法 22 | * @param observable 23 | * @param data 24 | */ 25 | @Override 26 | public void update(Observable observable, Object data) { 27 | AxeGangBoss writer; 28 | if (observable instanceof AxeGangBoss) { 29 | writer = (AxeGangBoss) observable; 30 | System.out.println(getName() + " 收到来自 " + writer.getName() + " 的消息: " + data.toString()); 31 | } 32 | } 33 | 34 | public String getName() { 35 | return mName; 36 | } 37 | 38 | public void setName(String name) { 39 | mName = name; 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /app/src/main/java/net/sxkeji/shixindesignpattern/singleton/StaticInnerSingleton.java: -------------------------------------------------------------------------------- 1 | package net.sxkeji.shixindesignpattern.singleton; 2 | 3 | /** 4 | * Description: 5 | *
单例模式的静态内部类实现 6 | *

7 | * 好处: 8 | * 1.不会有重排序 9 | * 2.调用时才加载,懒加载 10 | * 3.静态内部类只会被加载一次之所以线程安全是因为类的加载过程是线程安全的 11 | *

12 | *
Created by shixinzhang on 17/9/3. 13 | *

14 | *
Email: shixinzhang2016@gmail.com 15 | *

16 | *
https://about.me/shixinzhang 17 | */ 18 | 19 | public class StaticInnerSingleton { 20 | private StaticInnerSingleton() { 21 | System.out.println("Singleton " + System.currentTimeMillis()); 22 | } 23 | 24 | private static class InstanceHolder { 25 | static StaticInnerSingleton mInstance = new StaticInnerSingleton(); 26 | } 27 | 28 | public static StaticInnerSingleton getInstance() { 29 | return InstanceHolder.mInstance; 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /app/src/main/java/net/sxkeji/shixindesignpattern/staticproxy/Agent.java: -------------------------------------------------------------------------------- 1 | package net.sxkeji.shixindesignpattern.staticproxy; 2 | 3 | /** 4 | * 经纪人 5 | * Created by zhangshixin on 8/19/2016. 6 | */ 7 | public class Agent implements IStar { 8 | /** 9 | * 经纪人可以代表一个明星做一些决定 10 | */ 11 | IStar mIStar; 12 | boolean mIsHappy; 13 | 14 | public Agent(IStar IStar) { 15 | mIStar = IStar; 16 | } 17 | 18 | /** 19 | * 代理可以在一定情况下拦截、修改被代理对象的行为,这里设置一个 “心情”的状态值 20 | * @param IStar 21 | * @param isHappy 22 | */ 23 | public Agent(IStar IStar, boolean isHappy) { 24 | mIStar = IStar; 25 | mIsHappy = isHappy; 26 | } 27 | 28 | @Override 29 | public void attendTheShow() { 30 | mIStar.attendTheShow(); 31 | 32 | } 33 | 34 | @Override 35 | public void loveWife() { 36 | if (mIsHappy) { 37 | mIStar.loveWife(); 38 | } else { 39 | //当经纪人心情不好时,就会干坏事 40 | System.out.print("经纪人 照顾妻子"); 41 | } 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /app/src/main/java/net/sxkeji/shixindesignpattern/staticproxy/Environment.java: -------------------------------------------------------------------------------- 1 | package net.sxkeji.shixindesignpattern.staticproxy; 2 | 3 | import java.lang.reflect.InvocationHandler; 4 | import java.lang.reflect.Method; 5 | import java.lang.reflect.Proxy; 6 | 7 | /** 8 | * 外界环境,一般都是通过经纪人来接触明星 9 | * Created by zhangshixin on 8/19/2016. 10 | */ 11 | public class Environment { 12 | 13 | public static void main(final String[] args) { 14 | //王宝强,一位可爱、淳朴的明星,最早看的是他的《天下无贼》和《盲井》 15 | final Star baoqiang = new Star("王宝强"); 16 | // //有个经纪人叫宋吉吉 17 | // Agent songJJ = new Agent(baoqiang, false); 18 | // songJJ.attendTheShow(); 19 | // songJJ.loveWife(); 20 | 21 | IStar star = (IStar) Proxy.newProxyInstance(baoqiang.getClass().getClassLoader(), new Class[]{IStar.class}, new InvocationHandler() { 22 | @Override 23 | public Object invoke(Object o, Method method, Object[] args) throws Throwable { 24 | if (method.getName().equals("loveWife")){ 25 | return method.invoke(new Agent(baoqiang,false),args); 26 | }else { 27 | return method.invoke(baoqiang, args); 28 | } 29 | } 30 | }); 31 | 32 | star.attendTheShow(); 33 | star.loveWife(); 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /app/src/main/java/net/sxkeji/shixindesignpattern/staticproxy/IStar.java: -------------------------------------------------------------------------------- 1 | package net.sxkeji.shixindesignpattern.staticproxy; 2 | 3 | /** 4 | * 明星接口,定义了一些明星的行为 5 | * Created by zhangshixin on 8/19/2016. 6 | */ 7 | public interface IStar { 8 | /** 9 | * 参加节目 10 | */ 11 | void attendTheShow(); 12 | 13 | /** 14 | * 照顾妻子 15 | */ 16 | void loveWife(); 17 | 18 | //... 19 | } 20 | -------------------------------------------------------------------------------- /app/src/main/java/net/sxkeji/shixindesignpattern/staticproxy/Star.java: -------------------------------------------------------------------------------- 1 | package net.sxkeji.shixindesignpattern.staticproxy; 2 | 3 | /** 4 | * 明星实体类 5 | * Created by zhangshixin on 8/19/2016. 6 | */ 7 | public class Star implements IStar { 8 | private String mName; 9 | 10 | public Star(String name) { 11 | mName = name; 12 | } 13 | 14 | @Override 15 | public void attendTheShow() { 16 | System.out.print( this.mName + " 参加演出 \n"); 17 | } 18 | 19 | @Override 20 | public void loveWife() { 21 | System.out.print(this.mName + " 照顾了妻子"); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /app/src/main/java/net/sxkeji/shixindesignpattern/strategy/StoryA.java: -------------------------------------------------------------------------------- 1 | package net.sxkeji.shixindesignpattern.strategy; 2 | 3 | /** 4 | * 故事 A ,跳舞的恶魔法则 5 | * Created by zhangshixin on 8/27/2016. 6 | */ 7 | public class StoryA implements Synopsis { 8 | private String mName; 9 | 10 | public StoryA(String name) { 11 | mName = name; 12 | } 13 | 14 | @Override 15 | public void badStart() { 16 | System.out.println(mName + " 无故穿越,因为没有魔法能力,成为将军家的废物,不受待见。"); 17 | } 18 | 19 | @Override 20 | public void adventure() { 21 | System.out.println(mName + " 因为意外来到恶魔岛,在恶魔岛上遇见了恶魔的仆人,获得了一直想要的使用魔法的能力"); 22 | } 23 | 24 | @Override 25 | public void winABattle() { 26 | System.out.println(mName + " 协助辰皇子夺得了帝国的权力,成为郁金香公爵"); 27 | } 28 | 29 | @Override 30 | public void growFast() { 31 | System.out.println(mName + " 先后在曾曾曾祖母、恶魔仆人、圣骑士、魔导师的帮助下飞速成长"); 32 | } 33 | 34 | @Override 35 | public void manyFights() { 36 | System.out.println(mName + " 建立魔法学院和魔法学会,与魔法工会分庭抗礼。坐拥西北十万雄兵,歼灭西北军团,打退草原人,带领人类全族击退北方的异族军队。"); 37 | } 38 | 39 | @Override 40 | public void succeed() { 41 | System.out.println(mName + " 娶了女皇为妻子,成为罗兰帝国的英雄。"); 42 | } 43 | 44 | @Override 45 | public void getContent() { 46 | badStart(); 47 | adventure(); 48 | winABattle(); 49 | growFast(); 50 | manyFights(); 51 | succeed(); 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /app/src/main/java/net/sxkeji/shixindesignpattern/strategy/StoryB.java: -------------------------------------------------------------------------------- 1 | package net.sxkeji.shixindesignpattern.strategy; 2 | 3 | /** 4 | * 故事 B ,诛仙 5 | * Created by zhangshixin on 8/27/2016. 6 | */ 7 | public class StoryB implements Synopsis { 8 | private String mName; 9 | 10 | public StoryB(String name) { 11 | mName = name; 12 | } 13 | 14 | @Override 15 | public void badStart() { 16 | System.out.println(mName + " 全村被屠,投入青云七脉中人数最少的大竹峰。"); 17 | } 18 | 19 | @Override 20 | public void adventure() { 21 | System.out.println(mName + " 在一次伐竹过程中,为追一只三眼灵猴,入青云山深处得到了烧火棍。"); 22 | } 23 | 24 | @Override 25 | public void winABattle() { 26 | System.out.println(mName + " 在七脉会武中侥幸进了前 4,和陆雪琪等人一起万蝠古窟历练。"); 27 | } 28 | 29 | 30 | @Override 31 | public void growFast() { 32 | System.out.println(mName + " 在魔教十年,深得鬼王器重和真传。"); 33 | } 34 | 35 | @Override 36 | public void manyFights() { 37 | System.out.println(mName + " 经历无数战斗,先是为鬼王卖命,后来与鬼王大战。"); 38 | } 39 | 40 | @Override 41 | public void succeed() { 42 | System.out.println("天地不仁,以万物为刍狗。 " + mName +" 最后成为最有资格拥有天书的人。"); 43 | } 44 | 45 | 46 | @Override 47 | public void getContent() { 48 | badStart(); 49 | adventure(); 50 | winABattle(); 51 | growFast(); 52 | manyFights(); 53 | succeed(); 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /app/src/main/java/net/sxkeji/shixindesignpattern/strategy/Synopsis.java: -------------------------------------------------------------------------------- 1 | package net.sxkeji.shixindesignpattern.strategy; 2 | 3 | /** 4 | * 网络玄幻小说的故事梗概接口 5 | * 固定的一些套路 6 | * Created by zhangshixin on 8/27/2016. 7 | */ 8 | public interface Synopsis { 9 | /** 10 | * 穷困潦倒的开始 11 | */ 12 | void badStart(); 13 | 14 | /** 15 | * 突然有天遇到神人/捡到神器,实力大涨 16 | */ 17 | void adventure(); 18 | 19 | /** 20 | * 在一场战斗中以弱胜强 21 | */ 22 | void winABattle(); 23 | 24 | /** 25 | * 从此飞速成长 26 | */ 27 | void growFast(); 28 | 29 | /** 30 | * 组团刷怪,经历九死一生(主角怎么也死不了) 31 | */ 32 | void manyFights(); 33 | 34 | /** 35 | * 最终功成名就,妻妾成群 36 | */ 37 | void succeed(); 38 | 39 | /** 40 | * 组合起来就是小说内容 41 | */ 42 | void getContent(); 43 | } 44 | -------------------------------------------------------------------------------- /app/src/main/java/net/sxkeji/shixindesignpattern/strategy/WriteNovel.java: -------------------------------------------------------------------------------- 1 | package net.sxkeji.shixindesignpattern.strategy; 2 | 3 | /** 4 | * 写小说 5 | * Created by zhangshixin on 8/28/2016. 6 | */ 7 | public class WriteNovel { 8 | private Synopsis mSynopsis; //故事梗概 9 | private String mMainActorName; //主角名称 10 | 11 | /** 12 | * 梗概、内容都差不多确定后,换个名称就是另一部小说 13 | * @param mainName 14 | */ 15 | public WriteNovel(String mainName){ 16 | switch (mainName){ 17 | case "张小凡": 18 | mSynopsis = new StoryB(mainName); 19 | break; 20 | case "杜维": 21 | mSynopsis = new StoryA(mainName); 22 | break; 23 | default: 24 | mSynopsis = new StoryB(mainName); 25 | break; 26 | } 27 | } 28 | 29 | /** 30 | * 获取小说内容 31 | */ 32 | public void getNovelDetail(){ 33 | mSynopsis.getContent(); 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_main.xml: -------------------------------------------------------------------------------- 1 | 2 | 12 | 13 | 21 | 22 | -------------------------------------------------------------------------------- /app/src/main/res/layout/item_sample.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/layout/item_text.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shixinzhang/ShixinDesignPattern/62da4724f129ee72fd1321b60b2d6dbe56937c99/app/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shixinzhang/ShixinDesignPattern/62da4724f129ee72fd1321b60b2d6dbe56937c99/app/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shixinzhang/ShixinDesignPattern/62da4724f129ee72fd1321b60b2d6dbe56937c99/app/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/icon_ez.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shixinzhang/ShixinDesignPattern/62da4724f129ee72fd1321b60b2d6dbe56937c99/app/src/main/res/mipmap-xhdpi/icon_ez.jpg -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shixinzhang/ShixinDesignPattern/62da4724f129ee72fd1321b60b2d6dbe56937c99/app/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shixinzhang/ShixinDesignPattern/62da4724f129ee72fd1321b60b2d6dbe56937c99/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/values-w820dp/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 64dp 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/values/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #3F51B5 4 | #303F9F 5 | #FF4081 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/values/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8dp 4 | 8dp 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | ShiXinDesignPattern 3 | 4 | -------------------------------------------------------------------------------- /app/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /app/src/test/java/net/sxkeji/shixindesignpattern/ExampleUnitTest.java: -------------------------------------------------------------------------------- 1 | package net.sxkeji.shixindesignpattern; 2 | 3 | import org.junit.Test; 4 | 5 | import java.io.ByteArrayOutputStream; 6 | import java.io.ObjectOutputStream; 7 | 8 | import static org.junit.Assert.assertEquals; 9 | 10 | /** 11 | * To work on unit tests, switch the Test Artifact in the Build Variants view. 12 | */ 13 | public class ExampleUnitTest { 14 | @Test 15 | public void addition_isCorrect() throws Exception { 16 | assertEquals(4, 2 + 2); 17 | } 18 | 19 | @Test 20 | public void testPrint2dArray(){ 21 | byte[][] array = new byte[][] { { 1, 2, 3 }, { 4, 5 ,6} }; 22 | try { 23 | log2dArray(array); 24 | } catch (Exception e) { 25 | e.printStackTrace(); 26 | } 27 | } 28 | 29 | public void log2dArray(byte[][] array) throws Exception { 30 | String result = null; 31 | ByteArrayOutputStream bos = new ByteArrayOutputStream(); 32 | ObjectOutputStream oos = new ObjectOutputStream(bos); 33 | oos.writeObject(array); 34 | oos.flush(); 35 | oos.close(); 36 | // byte[] b = bos.toByteArray(); 37 | result = bos.toString(); 38 | // Log.i("TEST", result ); 39 | System.out.println("log2dArray" + result); 40 | return; 41 | } 42 | } -------------------------------------------------------------------------------- /app/src/test/java/net/sxkeji/shixindesignpattern/adapter/TranslatorTest.java: -------------------------------------------------------------------------------- 1 | package net.sxkeji.shixindesignpattern.adapter; 2 | 3 | import org.junit.Test; 4 | 5 | /** 6 | * description: 7 | *
8 | * author: shixinzhang 9 | *
10 | * data: 9/20/2016 11 | */ 12 | public class TranslatorTest { 13 | 14 | @Test 15 | public void testAdapterPattern(){ 16 | Chinese me = new Chinese(); 17 | Ukrainian ukrainianMan = new Translator(me); 18 | ukrainianMan.sayUkrainian("我爱你"); 19 | } 20 | 21 | @Test 22 | public void testClassAdapterPattern(){ 23 | Ukrainian ukrainianMan = new ClassTranslator(); 24 | ukrainianMan.sayUkrainian("刘奶奶找牛奶奶买榴莲牛奶"); 25 | } 26 | } -------------------------------------------------------------------------------- /app/src/test/java/net/sxkeji/shixindesignpattern/dynamicproxy/AgentTest.java: -------------------------------------------------------------------------------- 1 | package net.sxkeji.shixindesignpattern.dynamicproxy; 2 | 3 | import org.junit.Test; 4 | 5 | /** 6 | * Created by zhangshixin on 8/25/2016. 7 | * Update on ${DATA} 8 | */ 9 | public class AgentTest { 10 | 11 | @Test 12 | public void testMovieShow() throws Exception { 13 | Star huangBo = new Star("HuangBo"); 14 | Agent agent = new Agent(huangBo); 15 | // 网上查到,2016年黄渤的片酬达到了 3000W ,我得敲多少年代码额呜呜 16 | agent.movieShow(1000000000); 17 | agent.tvShow(5); 18 | } 19 | 20 | @Test 21 | public void testTvShow() throws Exception { 22 | 23 | } 24 | } -------------------------------------------------------------------------------- /app/src/test/java/net/sxkeji/shixindesignpattern/factory/AbstractFactoryTest.java: -------------------------------------------------------------------------------- 1 | package net.sxkeji.shixindesignpattern.factory; 2 | 3 | import net.sxkeji.shixindesignpattern.factory.abstractfactory.AbstractFactory; 4 | import net.sxkeji.shixindesignpattern.factory.abstractfactory.BMWx3ActivityAFactory; 5 | import net.sxkeji.shixindesignpattern.factory.abstractfactory.BMWx4ActivityBFactory; 6 | import net.sxkeji.shixindesignpattern.factory.beans.BMW; 7 | import net.sxkeji.shixindesignpattern.factory.beans.CarActivity; 8 | 9 | import org.junit.Test; 10 | 11 | /** 12 | * Description: 13 | *
14 | *

15 | *
Created by shixinzhang on 17/9/2. 16 | *

17 | *
Email: shixinzhang2016@gmail.com 18 | *

19 | *
https://about.me/shixinzhang 20 | */ 21 | 22 | public class AbstractFactoryTest { 23 | 24 | @Test 25 | public void testAbstractFactory() { 26 | // AbstractFactory factory = new BMWx3ActivityAFactory(); 27 | AbstractFactory factory = new BMWx4ActivityBFactory(); 28 | BMW car = factory.getCar(); 29 | CarActivity activity = factory.getActivity(); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /app/src/test/java/net/sxkeji/shixindesignpattern/factory/FactoryTest.java: -------------------------------------------------------------------------------- 1 | package net.sxkeji.shixindesignpattern.factory; 2 | 3 | import net.sxkeji.shixindesignpattern.factory.factory.BMWx3Factory; 4 | import net.sxkeji.shixindesignpattern.factory.factory.BMWx4Factory; 5 | import net.sxkeji.shixindesignpattern.factory.factory.Factory; 6 | 7 | import org.junit.Test; 8 | 9 | /** 10 | * Description: 11 | *
工厂方法模式的测试 12 | *

13 | *
Created by shixinzhang on 17/9/2. 14 | *

15 | *
Email: shixinzhang2016@gmail.com 16 | *

17 | *
https://about.me/shixinzhang 18 | */ 19 | 20 | public class FactoryTest { 21 | @Test 22 | public void testFactory() { 23 | Factory bmwFactory = new BMWx3Factory(); 24 | bmwFactory.createCar(); 25 | 26 | bmwFactory = new BMWx4Factory(); 27 | bmwFactory.createCar(); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /app/src/test/java/net/sxkeji/shixindesignpattern/factory/SimpleFactoryTest.java: -------------------------------------------------------------------------------- 1 | package net.sxkeji.shixindesignpattern.factory; 2 | 3 | import net.sxkeji.shixindesignpattern.factory.beans.BMW; 4 | import net.sxkeji.shixindesignpattern.factory.simplefactory.SimpleFactory; 5 | 6 | import org.junit.Test; 7 | 8 | /** 9 | * Description: 10 | *
简单工厂的测试 11 | *

12 | *
Created by shixinzhang on 17/9/2. 13 | *

14 | *
Email: shixinzhang2016@gmail.com 15 | *

16 | *
https://about.me/shixinzhang 17 | */ 18 | 19 | public class SimpleFactoryTest { 20 | @Test 21 | public void testSimpleFactory(){ 22 | BMW car = SimpleFactory.createCar(3); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /app/src/test/java/net/sxkeji/shixindesignpattern/observer/ObserverTest.java: -------------------------------------------------------------------------------- 1 | package net.sxkeji.shixindesignpattern.observer; 2 | 3 | import org.junit.Test; 4 | 5 | /** 6 | * description: 7 | *
8 | * author: shixinzhang 9 | *
10 | * data: 9/20/2016 11 | */ 12 | public class ObserverTest { 13 | 14 | @Test 15 | public void testSendMsg() throws Exception { 16 | //创建一个斧头帮老大 17 | AxeGangBoss shixinzhang = new AxeGangBoss("张拭心"); 18 | //创建两个小弟 19 | AxeGangPeople niefeng = new AxeGangPeople("聂风"); 20 | AxeGangPeople bujingyun = new AxeGangPeople("步惊云"); 21 | //老大觉得可以,收入麾下 22 | shixinzhang.addObserver(niefeng); 23 | shixinzhang.addObserver(bujingyun); 24 | //老大出事了,赶紧射箭! 25 | shixinzhang.sendMsg("我有难了,快来救我!"); 26 | } 27 | } -------------------------------------------------------------------------------- /app/src/test/java/net/sxkeji/shixindesignpattern/singleton/SingletonTest.java: -------------------------------------------------------------------------------- 1 | package net.sxkeji.shixindesignpattern.singleton; 2 | 3 | import android.os.SystemClock; 4 | 5 | import org.junit.Test; 6 | 7 | /** 8 | * Description: 9 | *
10 | *

11 | *
Created by shixinzhang on 17/9/3. 12 | *

13 | *
Email: shixinzhang2016@gmail.com 14 | *

15 | *
https://about.me/shixinzhang 16 | */ 17 | 18 | public class SingletonTest { 19 | 20 | @Test 21 | public void testSingleton(){ 22 | // new StaticInnerSingleton(); 23 | 24 | StaticInnerSingleton instance = StaticInnerSingleton.getInstance(); 25 | System.out.println(instance); 26 | 27 | try { 28 | Thread.sleep(3_000); 29 | } catch (InterruptedException e) { 30 | e.printStackTrace(); 31 | } 32 | StaticInnerSingleton instance1 = StaticInnerSingleton.getInstance(); 33 | System.out.println(instance1); 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /app/src/test/java/net/sxkeji/shixindesignpattern/staticproxy/StarTest.java: -------------------------------------------------------------------------------- 1 | package net.sxkeji.shixindesignpattern.staticproxy; 2 | 3 | import org.junit.Test; 4 | 5 | /** 6 | * Created by zhangshixin on 8/24/2016. 7 | * Update on ${DATA} 8 | */ 9 | public class StarTest { 10 | 11 | @Test 12 | public void testAttendTheShow() throws Exception { 13 | 14 | } 15 | 16 | @Test 17 | public void testLoveWife() throws Exception { 18 | 19 | } 20 | } -------------------------------------------------------------------------------- /app/src/test/java/net/sxkeji/shixindesignpattern/strategy/WriteNovelTest.java: -------------------------------------------------------------------------------- 1 | package net.sxkeji.shixindesignpattern.strategy; 2 | 3 | import org.junit.Test; 4 | 5 | /** 6 | * 7 | * Created by zhangshixin on 8/28/2016. 8 | */ 9 | public class WriteNovelTest { 10 | 11 | @Test 12 | public void testGetNovelDetail() throws Exception { 13 | WriteNovel writeNovel = new WriteNovel("张拭心"); 14 | writeNovel.getNovelDetail(); 15 | } 16 | } -------------------------------------------------------------------------------- /app/src/test/java/net/sxkeji/shixindesignpattern/test/MyInvocationHandlerTest.java: -------------------------------------------------------------------------------- 1 | package net.sxkeji.shixindesignpattern.test; 2 | 3 | import net.sxkeji.shixindesignpattern.dynamicproxy.IMovieStar; 4 | import net.sxkeji.shixindesignpattern.dynamicproxy.ISingerStar; 5 | import net.sxkeji.shixindesignpattern.dynamicproxy.ProxyHandler; 6 | import net.sxkeji.shixindesignpattern.dynamicproxy.Star; 7 | 8 | import org.junit.Test; 9 | 10 | /** 11 | * 测试 12 | * Created by zhangshixin on 8/24/2016. 13 | */ 14 | public class MyInvocationHandlerTest { 15 | 16 | @Test 17 | public void testInvoke() throws Exception { 18 | Star huangBo = new Star("HuangBo"); 19 | ProxyHandler proxyHandler = new ProxyHandler(huangBo); 20 | IMovieStar agent = (IMovieStar) proxyHandler.getProxy(); 21 | agent.movieShow(1000000000); 22 | agent.tvShow(100); 23 | 24 | //黄渤早年其实是个歌手!唱歌不得志只好去演戏,成为影帝后人们才关注他的歌声,真是个“看脸、看名”的世界 25 | ISingerStar singerAgent = (ISingerStar) proxyHandler.getProxy(); 26 | singerAgent.sing(1024); 27 | 28 | } 29 | 30 | @Test 31 | public void testGetProxy() throws Exception { 32 | } 33 | } -------------------------------------------------------------------------------- /app/src/test/java/net/sxkeji/shixindesignpattern/test/TextUtilsTest.java: -------------------------------------------------------------------------------- 1 | package net.sxkeji.shixindesignpattern.test; 2 | 3 | import org.junit.Test; 4 | 5 | /** 6 | * Created by zhangshixin on 8/26/2016. 7 | * Update on ${DATA} 8 | */ 9 | public class TextUtilsTest { 10 | @Test 11 | void test(){ 12 | // TextUtils 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /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.1.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 | -------------------------------------------------------------------------------- /gradle.properties: -------------------------------------------------------------------------------- 1 | # Project-wide Gradle settings. 2 | 3 | # IDE (e.g. Android Studio) users: 4 | # Gradle settings configured through the IDE *will override* 5 | # any settings specified in this file. 6 | 7 | # For more details on how to configure your build environment visit 8 | # http://www.gradle.org/docs/current/userguide/build_environment.html 9 | 10 | # Specifies the JVM arguments used for the daemon process. 11 | # The setting is particularly useful for tweaking memory settings. 12 | # Default value: -Xmx10248m -XX:MaxPermSize=256m 13 | # org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 14 | 15 | # When configured, Gradle will run in incubating parallel mode. 16 | # This option should only be used with decoupled projects. More details, visit 17 | # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects 18 | # org.gradle.parallel=true -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shixinzhang/ShixinDesignPattern/62da4724f129ee72fd1321b60b2d6dbe56937c99/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /gradlew: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | ############################################################################## 4 | ## 5 | ## Gradle start up script for UN*X 6 | ## 7 | ############################################################################## 8 | 9 | # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 10 | DEFAULT_JVM_OPTS="" 11 | 12 | APP_NAME="Gradle" 13 | APP_BASE_NAME=`basename "$0"` 14 | 15 | # Use the maximum available, or set MAX_FD != -1 to use that value. 16 | MAX_FD="maximum" 17 | 18 | warn ( ) { 19 | echo "$*" 20 | } 21 | 22 | die ( ) { 23 | echo 24 | echo "$*" 25 | echo 26 | exit 1 27 | } 28 | 29 | # OS specific support (must be 'true' or 'false'). 30 | cygwin=false 31 | msys=false 32 | darwin=false 33 | case "`uname`" in 34 | CYGWIN* ) 35 | cygwin=true 36 | ;; 37 | Darwin* ) 38 | darwin=true 39 | ;; 40 | MINGW* ) 41 | msys=true 42 | ;; 43 | esac 44 | 45 | # Attempt to set APP_HOME 46 | # Resolve links: $0 may be a link 47 | PRG="$0" 48 | # Need this for relative symlinks. 49 | while [ -h "$PRG" ] ; do 50 | ls=`ls -ld "$PRG"` 51 | link=`expr "$ls" : '.*-> \(.*\)$'` 52 | if expr "$link" : '/.*' > /dev/null; then 53 | PRG="$link" 54 | else 55 | PRG=`dirname "$PRG"`"/$link" 56 | fi 57 | done 58 | SAVED="`pwd`" 59 | cd "`dirname \"$PRG\"`/" >/dev/null 60 | APP_HOME="`pwd -P`" 61 | cd "$SAVED" >/dev/null 62 | 63 | CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar 64 | 65 | # Determine the Java command to use to start the JVM. 66 | if [ -n "$JAVA_HOME" ] ; then 67 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then 68 | # IBM's JDK on AIX uses strange locations for the executables 69 | JAVACMD="$JAVA_HOME/jre/sh/java" 70 | else 71 | JAVACMD="$JAVA_HOME/bin/java" 72 | fi 73 | if [ ! -x "$JAVACMD" ] ; then 74 | die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME 75 | 76 | Please set the JAVA_HOME variable in your environment to match the 77 | location of your Java installation." 78 | fi 79 | else 80 | JAVACMD="java" 81 | which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 82 | 83 | Please set the JAVA_HOME variable in your environment to match the 84 | location of your Java installation." 85 | fi 86 | 87 | # Increase the maximum file descriptors if we can. 88 | if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then 89 | MAX_FD_LIMIT=`ulimit -H -n` 90 | if [ $? -eq 0 ] ; then 91 | if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then 92 | MAX_FD="$MAX_FD_LIMIT" 93 | fi 94 | ulimit -n $MAX_FD 95 | if [ $? -ne 0 ] ; then 96 | warn "Could not set maximum file descriptor limit: $MAX_FD" 97 | fi 98 | else 99 | warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" 100 | fi 101 | fi 102 | 103 | # For Darwin, add options to specify how the application appears in the dock 104 | if $darwin; then 105 | GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" 106 | fi 107 | 108 | # For Cygwin, switch paths to Windows format before running java 109 | if $cygwin ; then 110 | APP_HOME=`cygpath --path --mixed "$APP_HOME"` 111 | CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` 112 | JAVACMD=`cygpath --unix "$JAVACMD"` 113 | 114 | # We build the pattern for arguments to be converted via cygpath 115 | ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` 116 | SEP="" 117 | for dir in $ROOTDIRSRAW ; do 118 | ROOTDIRS="$ROOTDIRS$SEP$dir" 119 | SEP="|" 120 | done 121 | OURCYGPATTERN="(^($ROOTDIRS))" 122 | # Add a user-defined pattern to the cygpath arguments 123 | if [ "$GRADLE_CYGPATTERN" != "" ] ; then 124 | OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" 125 | fi 126 | # Now convert the arguments - kludge to limit ourselves to /bin/sh 127 | i=0 128 | for arg in "$@" ; do 129 | CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` 130 | CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option 131 | 132 | if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition 133 | eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` 134 | else 135 | eval `echo args$i`="\"$arg\"" 136 | fi 137 | i=$((i+1)) 138 | done 139 | case $i in 140 | (0) set -- ;; 141 | (1) set -- "$args0" ;; 142 | (2) set -- "$args0" "$args1" ;; 143 | (3) set -- "$args0" "$args1" "$args2" ;; 144 | (4) set -- "$args0" "$args1" "$args2" "$args3" ;; 145 | (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; 146 | (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; 147 | (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; 148 | (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; 149 | (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; 150 | esac 151 | fi 152 | 153 | # Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules 154 | function splitJvmOpts() { 155 | JVM_OPTS=("$@") 156 | } 157 | eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS 158 | JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" 159 | 160 | exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" 161 | -------------------------------------------------------------------------------- /gradlew.bat: -------------------------------------------------------------------------------- 1 | @if "%DEBUG%" == "" @echo off 2 | @rem ########################################################################## 3 | @rem 4 | @rem Gradle startup script for Windows 5 | @rem 6 | @rem ########################################################################## 7 | 8 | @rem Set local scope for the variables with windows NT shell 9 | if "%OS%"=="Windows_NT" setlocal 10 | 11 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 12 | set DEFAULT_JVM_OPTS= 13 | 14 | set DIRNAME=%~dp0 15 | if "%DIRNAME%" == "" set DIRNAME=. 16 | set APP_BASE_NAME=%~n0 17 | set APP_HOME=%DIRNAME% 18 | 19 | @rem Find java.exe 20 | if defined JAVA_HOME goto findJavaFromJavaHome 21 | 22 | set JAVA_EXE=java.exe 23 | %JAVA_EXE% -version >NUL 2>&1 24 | if "%ERRORLEVEL%" == "0" goto init 25 | 26 | echo. 27 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 28 | echo. 29 | echo Please set the JAVA_HOME variable in your environment to match the 30 | echo location of your Java installation. 31 | 32 | goto fail 33 | 34 | :findJavaFromJavaHome 35 | set JAVA_HOME=%JAVA_HOME:"=% 36 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe 37 | 38 | if exist "%JAVA_EXE%" goto init 39 | 40 | echo. 41 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 42 | echo. 43 | echo Please set the JAVA_HOME variable in your environment to match the 44 | echo location of your Java installation. 45 | 46 | goto fail 47 | 48 | :init 49 | @rem Get command-line arguments, handling Windowz variants 50 | 51 | if not "%OS%" == "Windows_NT" goto win9xME_args 52 | if "%@eval[2+2]" == "4" goto 4NT_args 53 | 54 | :win9xME_args 55 | @rem Slurp the command line arguments. 56 | set CMD_LINE_ARGS= 57 | set _SKIP=2 58 | 59 | :win9xME_args_slurp 60 | if "x%~1" == "x" goto execute 61 | 62 | set CMD_LINE_ARGS=%* 63 | goto execute 64 | 65 | :4NT_args 66 | @rem Get arguments from the 4NT Shell from JP Software 67 | set CMD_LINE_ARGS=%$ 68 | 69 | :execute 70 | @rem Setup the command line 71 | 72 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar 73 | 74 | @rem Execute Gradle 75 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% 76 | 77 | :end 78 | @rem End local scope for the variables with windows NT shell 79 | if "%ERRORLEVEL%"=="0" goto mainEnd 80 | 81 | :fail 82 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of 83 | rem the _cmd.exe /c_ return code! 84 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 85 | exit /b 1 86 | 87 | :mainEnd 88 | if "%OS%"=="Windows_NT" endlocal 89 | 90 | :omega 91 | -------------------------------------------------------------------------------- /settings.gradle: -------------------------------------------------------------------------------- 1 | include ':app' 2 | --------------------------------------------------------------------------------