美文网首页
大话设计模式-代理模式-2020-09-23

大话设计模式-代理模式-2020-09-23

作者: 松哥888 | 来源:发表于2020-09-23 17:53 被阅读0次

定义

为其他对象提供一种代理以控制对这个对象的访问。

结构图

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());
    }
}
  • 界面
image.png

Demo地址

https://gitee.com/zhangxusong888/Android/tree/master/design_pattern

相关文章

网友评论

      本文标题:大话设计模式-代理模式-2020-09-23

      本文链接:https://www.haomeiwen.com/subject/xcpoyktx.html