Skip to content

Commit b6590d7

Browse files
committed
add Proxy Pattern
1 parent cfa917c commit b6590d7

11 files changed

Lines changed: 223 additions & 265 deletions

File tree

app/build.gradle

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,4 +34,7 @@ dependencies {
3434
//增加这二句
3535
implementation 'com.jakewharton:butterknife:8.8.1'
3636
annotationProcessor "com.jakewharton:butterknife-compiler:8.8.1"
37+
38+
implementation "com.github.youlookwhat:ByRecyclerView:1.0.15-support"
39+
implementation "com.android.support:recyclerview-v7:28.0.0"
3740
}
Lines changed: 43 additions & 94 deletions
Original file line numberDiff line numberDiff line change
@@ -1,128 +1,77 @@
11
package com.example.jingbin.designpattern;
22

33
import android.content.Intent;
4+
import android.databinding.DataBindingUtil;
45
import android.os.Bundle;
56
import android.support.v7.app.AppCompatActivity;
7+
import android.support.v7.widget.GridLayoutManager;
68
import android.view.View;
7-
import android.widget.Button;
89

910
import com.example.jingbin.designpattern.adapter.AdapterActivity;
1011
import com.example.jingbin.designpattern.builder.BuilderActivity;
1112
import com.example.jingbin.designpattern.command.CommandActivity;
13+
import com.example.jingbin.designpattern.databinding.ActivityMainBinding;
1214
import com.example.jingbin.designpattern.decorator.DecoratorActivity;
1315
import com.example.jingbin.designpattern.facade.FacadeActivity;
1416
import com.example.jingbin.designpattern.factory.FactoryActivity;
1517
import com.example.jingbin.designpattern.flyweight.FlyweightActivity;
1618
import com.example.jingbin.designpattern.observer.ObserverActivity;
1719
import com.example.jingbin.designpattern.prototype.PrototypeActivity;
20+
import com.example.jingbin.designpattern.proxy.ProxyActivity;
1821
import com.example.jingbin.designpattern.singleton.SingletonActivity;
1922
import com.example.jingbin.designpattern.state.StateActivity;
2023
import com.example.jingbin.designpattern.strategy.StrategyActivity;
2124
import com.example.jingbin.designpattern.templatemethod.TemplateMethodActivity;
2225

23-
import butterknife.BindView;
24-
import butterknife.ButterKnife;
26+
import java.util.Arrays;
27+
28+
import me.jingbin.library.ByRecyclerView;
29+
import me.jingbin.library.adapter.BaseByViewHolder;
30+
import me.jingbin.library.adapter.BaseRecyclerAdapter;
2531

2632
/**
2733
* Created by jingbin on 2016/10/21.
2834
*/
29-
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
35+
public class MainActivity extends AppCompatActivity {
36+
37+
private ActivityMainBinding binding;
38+
private String[] patterns = {
39+
"观察者模式", "工厂模式", "单例设计模式",
40+
"策略模式", "适配器模式", "命令模式",
41+
"装饰者模式", "外观模式", "模板方法模式",
42+
"状态模式", "建造者模式", "原型模式",
43+
"享元模式", "代理模式"
44+
};
45+
private Class[] classes = {
46+
ObserverActivity.class, FactoryActivity.class, SingletonActivity.class,
47+
StrategyActivity.class, AdapterActivity.class, CommandActivity.class,
48+
DecoratorActivity.class, FacadeActivity.class, TemplateMethodActivity.class,
49+
StateActivity.class, BuilderActivity.class, PrototypeActivity.class,
50+
FlyweightActivity.class, ProxyActivity.class
51+
};
3052

31-
@BindView(R.id.bt_observer)
32-
Button btObserver;
33-
@BindView(R.id.bt_factory)
34-
Button btFactory;
35-
@BindView(R.id.bt_singleton)
36-
Button btSingleton;
37-
@BindView(R.id.bt_strategy)
38-
Button btStrategy;
39-
@BindView(R.id.bt_adapter)
40-
Button btAdapter;
41-
@BindView(R.id.bt_command)
42-
Button btCommand;
43-
@BindView(R.id.bt_decorator)
44-
Button btDecorator;
45-
@BindView(R.id.bt_facade)
46-
Button btFacade;
47-
@BindView(R.id.bt_template_method)
48-
Button btTemplateMethod;
49-
@BindView(R.id.bt_state)
50-
Button btState;
51-
@BindView(R.id.bt_builder)
52-
Button btBuilder;
53-
@BindView(R.id.bt_prototype)
54-
Button btPrototype;
55-
@BindView(R.id.bt_flyweight)
56-
Button btFlyweight;
5753

5854
@Override
5955
protected void onCreate(Bundle savedInstanceState) {
6056
super.onCreate(savedInstanceState);
61-
setContentView(R.layout.activity_main);
62-
ButterKnife.bind(this);
63-
initListener();
57+
binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
58+
initView();
6459
}
6560

66-
private void initListener() {
67-
btObserver.setOnClickListener(this);
68-
btFactory.setOnClickListener(this);
69-
btSingleton.setOnClickListener(this);
70-
btStrategy.setOnClickListener(this);
71-
btAdapter.setOnClickListener(this);
72-
btCommand.setOnClickListener(this);
73-
btDecorator.setOnClickListener(this);
74-
btFacade.setOnClickListener(this);
75-
btTemplateMethod.setOnClickListener(this);
76-
btState.setOnClickListener(this);
77-
btBuilder.setOnClickListener(this);
78-
btPrototype.setOnClickListener(this);
79-
btFlyweight.setOnClickListener(this);
80-
}
81-
82-
@Override
83-
public void onClick(View v) {
84-
switch (v.getId()) {
85-
case R.id.bt_observer:// 观察者模式
86-
startActivity(new Intent(this, ObserverActivity.class));
87-
break;
88-
case R.id.bt_factory:// 工厂模式
89-
startActivity(new Intent(this, FactoryActivity.class));
90-
break;
91-
case R.id.bt_singleton:// 单例设计模式
92-
startActivity(new Intent(this, SingletonActivity.class));
93-
break;
94-
case R.id.bt_strategy:// 策略模式
95-
startActivity(new Intent(this, StrategyActivity.class));
96-
break;
97-
case R.id.bt_adapter:// 适配器模式
98-
startActivity(new Intent(this, AdapterActivity.class));
99-
break;
100-
case R.id.bt_command:// 命令模式
101-
startActivity(new Intent(this, CommandActivity.class));
102-
break;
103-
case R.id.bt_decorator:// 装饰者模式
104-
startActivity(new Intent(this, DecoratorActivity.class));
105-
break;
106-
case R.id.bt_facade:// 外观模式
107-
startActivity(new Intent(this, FacadeActivity.class));
108-
break;
109-
case R.id.bt_template_method:// 模板方法模式
110-
startActivity(new Intent(this, TemplateMethodActivity.class));
111-
break;
112-
case R.id.bt_state:// 状态模式
113-
startActivity(new Intent(this, StateActivity.class));
114-
break;
115-
case R.id.bt_builder:// 建造者模式
116-
startActivity(new Intent(this, BuilderActivity.class));
117-
break;
118-
case R.id.bt_prototype:// 原型模式
119-
startActivity(new Intent(this, PrototypeActivity.class));
120-
break;
121-
case R.id.bt_flyweight:// 享元模式
122-
startActivity(new Intent(this, FlyweightActivity.class));
123-
break;
124-
default:
125-
break;
126-
}
61+
private void initView() {
62+
GridLayoutManager gridLayoutManager = new GridLayoutManager(this, 2);
63+
binding.recyclerView.setLayoutManager(gridLayoutManager);
64+
binding.recyclerView.setAdapter(new BaseRecyclerAdapter<String>(R.layout.item_main, Arrays.asList(patterns)) {
65+
@Override
66+
protected void bindView(BaseByViewHolder holder, String title, int position) {
67+
holder.setText(R.id.bt_button, title);
68+
}
69+
});
70+
binding.recyclerView.setOnItemClickListener(new ByRecyclerView.OnItemClickListener() {
71+
@Override
72+
public void onClick(View v, int position) {
73+
startActivity(new Intent(v.getContext(), classes[position]));
74+
}
75+
});
12776
}
12877
}

app/src/main/java/com/example/jingbin/designpattern/app/AppConstant.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ public class AppConstant {
1717
public final static String BUILDER_DEFINE = "<em>建造者模式(Builder Pattern)</em>建造模式是对象的创建模式。建造模式可以将一个产品的内部表象(internal representation)与产品的生产过程分割开来,从而可以使一个建造过程生成具有不同的内部表象的产品对象。";
1818
public final static String PROTOTYPE_DEFINE = "<em>原型模式(Prototype Pattern)</em>定义:是用于创建重复的对象,同时又能保证性能。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。";
1919
public final static String FLYWEIGHT_DEFINE = "<em>享元模式(Flyweight Pattern)</em>主要用于减少创建对象的数量,以减少内存占用和提高性能。这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结构的方式。";
20+
public final static String PROXY_DEFINE = "<em>代理模式(Proxy Pattern)</em>一个类代表另一个类的功能。在代理模式中,我们创建具有现有对象的对象,以便向外界提供功能接口。";
2021
public final static String JDGC_FACTORY_DEFINE = "<em>简单工厂模式</em>定义:通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。";
2122
public final static String GCFF_FACTORY_DEFINE = "<em>工厂方法模式</em>定义:定义一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法模式把类实例化的过程推迟到子类。";
2223
public final static String CXGC_FACTORY_DEFINE = "<em>抽象工厂模式</em>定义:提供一个接口,用于创建相关的或依赖对象的家族,而不需要明确指定具体类。";
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package com.example.jingbin.designpattern.proxy;
2+
3+
/**
4+
* Created by jingbin on 2020-02-01.
5+
* 1. 创建一个接口。
6+
*/
7+
public interface Image {
8+
void display();
9+
}
Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,52 @@
11
package com.example.jingbin.designpattern.proxy;
22

3+
import android.databinding.DataBindingUtil;
34
import android.os.Bundle;
45
import android.support.v7.app.AppCompatActivity;
6+
import android.view.View;
57

68
import com.example.jingbin.designpattern.R;
9+
import com.example.jingbin.designpattern.app.AppConstant;
10+
import com.example.jingbin.designpattern.app.EMTagHandler;
11+
import com.example.jingbin.designpattern.databinding.ActivityProxyBinding;
712

813
/**
914
* @author jingbin
15+
* 在代理模式(Proxy Pattern)中,一个类代表另一个类的功能。这种类型的设计模式属于结构型模式。
16+
* <p>
17+
* 在代理模式中,我们创建具有现有对象的对象,以便向外界提供功能接口。
18+
* 意图:为其他对象提供一种代理以控制对这个对象的访问。
19+
* <p>
20+
* 主要解决:在直接访问对象时带来的问题,
21+
* 比如说:要访问的对象在远程的机器上。
22+
* 在面向对象系统中,有些对象由于某些原因(比如对象创建开销很大,或者某些操作需要安全控制,或者需要进程外的访问),
23+
* 直接访问会给使用者或者系统结构带来很多麻烦,我们可以在访问此对象时加上一个对此对象的访问层。
1024
*/
1125
public class ProxyActivity extends AppCompatActivity {
1226

1327
@Override
1428
protected void onCreate(Bundle savedInstanceState) {
1529
super.onCreate(savedInstanceState);
16-
setContentView(R.layout.activity_proxy);
30+
ActivityProxyBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_proxy);
31+
32+
setTitle("代理模式");
33+
binding.tvDefine.setText(EMTagHandler.fromHtml(AppConstant.PROXY_DEFINE));
34+
35+
// 3. 当被请求时,使用 ProxyImage 来获取 RealImage 类的对象。
36+
final Image image = new ProxyImage("test_10mb.png");
37+
binding.btDisk.setOnClickListener(new View.OnClickListener() {
38+
@Override
39+
public void onClick(View v) {
40+
// 第一次是new的,图像从磁盘加载
41+
image.display();
42+
}
43+
});
44+
binding.btNoDisk.setOnClickListener(new View.OnClickListener() {
45+
@Override
46+
public void onClick(View v) {
47+
// 第二次取缓存,图像不需要从磁盘加载
48+
image.display();
49+
}
50+
});
1751
}
1852
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package com.example.jingbin.designpattern.proxy;
2+
3+
/**
4+
* Created by jingbin on 2020-02-01.
5+
* 2. 创建实现接口的实体类。
6+
*/
7+
public class ProxyImage implements Image {
8+
9+
private String fileName;
10+
private RealImage realImage;
11+
12+
public ProxyImage(String fileName) {
13+
this.fileName = fileName;
14+
}
15+
16+
@Override
17+
public void display() {
18+
if (realImage == null) {
19+
realImage = new RealImage(fileName);
20+
}
21+
realImage.display();
22+
}
23+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package com.example.jingbin.designpattern.proxy;
2+
3+
import android.util.Log;
4+
5+
/**
6+
* Created by jingbin on 2020-02-01.
7+
* 2. 创建实现接口的实体类。
8+
*/
9+
public class RealImage implements Image {
10+
11+
private String fileName;
12+
13+
public RealImage(String fileName) {
14+
this.fileName = fileName;
15+
loadFromDisk(fileName);
16+
}
17+
18+
private void loadFromDisk(String fileName) {
19+
Log.e("RealImage", "loading " + fileName);
20+
}
21+
22+
@Override
23+
public void display() {
24+
Log.e("RealImage", "Displaying " + fileName);
25+
}
26+
}

0 commit comments

Comments
 (0)