Skip to content

Commit 0586f6d

Browse files
Merge pull request mercyblitz#14 from mercyblitz/master
Add Live Lesssons
2 parents 4221729 + 65c183d commit 0586f6d

File tree

2 files changed

+138
-0
lines changed

2 files changed

+138
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
package org.geekbang.live.lessions.design.patterns;
2+
3+
import java.util.Arrays;
4+
import java.util.List;
5+
import java.util.stream.Collectors;
6+
7+
public class CreationalPatternsDemo {
8+
9+
public static void main(String[] args) {
10+
// 抽象工厂
11+
// 工厂方法
12+
// 创造器模式
13+
// 原型
14+
// 单例
15+
16+
17+
// Builder 模式
18+
// 抽象工厂 CharSequence#toString()
19+
StringBuilder stringBuilder = new StringBuilder(); // 单例
20+
21+
CharSequence cs = stringBuilder;
22+
23+
// CharSequence 超接口 - String、StringBuilder、StringBuffer
24+
25+
// 方法是抽象的,java.lang.CharSequence 接口
26+
String value = cs.toString(); // 创建抽象工厂 -> 对象是原型
27+
28+
29+
// Builder -> Fluent API -> Stream
30+
List<String> values = Arrays.asList("1","2","3");
31+
32+
values.stream().map(String::toString).map(String::hashCode)
33+
.collect(Collectors.toList());
34+
//.reduce(Integer::sum); // Collection -> Integer
35+
36+
// 工厂模式状态性 :有状态( Cache )、无状态(对象创建是Prototype)
37+
// 有状态(可变、不可变)
38+
// 可变:StringBuilder
39+
// 不可变:Stream 每个方法尽管返回 Stream 对象,但是每个对象是不同的,并且对象状态是不变的
40+
// Immutable
41+
// 无状态
42+
// ThreadFactory ->
43+
// 静态的方法
44+
}
45+
46+
public static void echo(CharSequence value) {
47+
48+
}
49+
50+
// 工厂方法命名前缀
51+
// build
52+
// new
53+
// to
54+
// create
55+
56+
public static String toString(Object value){ // 工厂方法
57+
return value.toString();
58+
}
59+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
package org.geekbang.live.lessions.design.patterns;
2+
3+
import java.io.Closeable;
4+
import java.lang.reflect.InvocationHandler;
5+
import java.lang.reflect.Method;
6+
import java.lang.reflect.Proxy;
7+
import java.util.stream.IntStream;
8+
9+
public class ProxyPatternDemo {
10+
11+
public static void main(String[] args) {
12+
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
13+
14+
// 动态代理(CharSequence)没有具体实现类
15+
CharSequence cs= (CharSequence) Proxy.newProxyInstance(classLoader,
16+
new Class[]{CharSequence.class, Closeable.class},
17+
new InvocationHandler() {
18+
@Override
19+
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
20+
return null;
21+
}
22+
});
23+
24+
// JDK 内建的字节码提升(字节码生成)
25+
// newProxyInstance -> Dynamic Class( ClassLoader ) implements Interface1, Interface2, ... {
26+
//
27+
// }
28+
29+
// 静态(具体)代理
30+
// MyCharSequence is CharSequence
31+
// String is CharSequence
32+
33+
CharSequence cs1 = new MyCharSequence("Hello,World");
34+
35+
// 适配器
36+
// 适配对象和被适配对象之间的是没有类型关系
37+
}
38+
39+
static class MyCharSequence implements CharSequence { // 类似于装饰器模式
40+
41+
// 装饰器模式 implements + more
42+
43+
private final CharSequence cs;
44+
45+
MyCharSequence(CharSequence cs) {
46+
this.cs = cs;
47+
}
48+
49+
@Override
50+
public int length() {
51+
return cs.length();
52+
}
53+
54+
@Override
55+
public char charAt(int index) {
56+
return 0;
57+
}
58+
59+
@Override
60+
public CharSequence subSequence(int start, int end) {
61+
return null;
62+
}
63+
64+
@Override
65+
public String toString() {
66+
return cs.toString();
67+
}
68+
69+
@Override
70+
public IntStream chars() {
71+
return cs.chars();
72+
}
73+
74+
@Override
75+
public IntStream codePoints() {
76+
return cs.codePoints();
77+
}
78+
}
79+
}

0 commit comments

Comments
 (0)