定义
为其他对象提供一种代理以控制对这个对象的访问。
结构图
image.png应用场合:
1、远程代理,也就是为一个对象在不同的地址空间提供局部代表。这样可以隐藏一个对象存在于不同地址空间的事实。(找代理,代理人)
2、虚拟代理,是根据需要创建开销很大的对象。通过他来存放实例化需要很长时间的真实对象。
3、安全代理,用来控制真实对象访问时的权限。
4、智能引导,是指当调用真实的对象时,代理处理另外一些事。
代理模式其实就是在访问对象时引入一定程度的间接性,借此附加多种功能。
追mm的例子
image.png- 接口IGiveGift: 定义代理是实际执行者共同的方法
interface IGiveGift {
void GiveDolls();
void GiveFlowers();
void GiveChocolate();
}
- 实际的执行类
class Pursuit implements IGiveGift {
SchoolGirl mm;
public String whatToDo;
public Pursuit(SchoolGirl mm) {
this.mm = mm;
}
@Override
public void GiveDolls() {
whatToDo = mm.Name + "======送你洋娃娃";
}
@Override
public void GiveFlowers() {
whatToDo = mm.Name + "======送你鲜花";
}
@Override
public void GiveChocolate() {
whatToDo = mm.Name + "======送你巧克力";
}
}
- 代理类,不自己做事,而是调用作为成员的实际执行类做事
class Proxy implements IGiveGift {
Pursuit pursuit;
public Proxy(SchoolGirl mm) {
pursuit = new Pursuit(mm);
}
@Override
public void GiveDolls() {
pursuit.GiveDolls();
}
@Override
public void GiveFlowers() {
pursuit.GiveFlowers();
}
@Override
public void GiveChocolate() {
pursuit.GiveChocolate();
}
public String GetResult() {
return pursuit.whatToDo;
}
}
- 客户端使用:直接用代理,但是事情其实是作为成员的执行者做的
public class ProxyActivity extends AppCompatActivity {
SchoolGirl mm;
Proxy proxy;
EditText editTextName;
TextView textViewWhatToDo;
public static void launch(Context context) {
if (null != context) {
Intent intent = new Intent();
intent.setClass(context, ProxyActivity.class);
if (!(context instanceof Activity)) {
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
}
context.startActivity(intent);
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_proxy);
setTitle("代理模式");
mm = new SchoolGirl();
proxy = new Proxy(mm);
editTextName = (EditText)findViewById(R.id.editTextName);
textViewWhatToDo = (TextView)findViewById(R.id.textViewWhatToDo);
}
public void onDollClick(View view) {
mm.Name = editTextName.getText().toString();
proxy.GiveDolls();
textViewWhatToDo.setText(proxy.GetResult());
}
public void onFlowerClick(View view) {
mm.Name = editTextName.getText().toString();
proxy.GiveFlowers();
textViewWhatToDo.setText(proxy.GetResult());
}
public void onChocolateClick(View view) {
mm.Name = editTextName.getText().toString();
proxy.GiveChocolate();
textViewWhatToDo.setText(proxy.GetResult());
}
}
- 界面
Demo地址
https://gitee.com/zhangxusong888/Android/tree/master/design_pattern
网友评论