美文网首页
大话设计模式-代理模式-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