博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式学习之路-代理模式
阅读量:4166 次
发布时间:2019-05-26

本文共 2470 字,大约阅读时间需要 8 分钟。

学习了简单工厂模式,策略模式,装饰者模式。设计原则有单一职责原则,开放-封闭原则,依赖倒置原则,里氏代换原则。学会使用才是关键,在自己做项目时,拿到一个需求,先对其进行结构分析,选用合适的设计模式,在编程时注意设计原则,经常使用就能把这些设计原则铭记于心。

直接进入主题,代理模式。

代理模式(Proxy):为其他对象提供一种代理以控制对这个对象的访问。

看一下基本代码。

abstract class Subject{ public abstract void Request();}
class RealSubject extends Subject{ @Override public void Request(){  //真实的请求 }}
class Proxy extends Subject{ private RealSubject realSubject; @Override public void Request(){  if(realSubject == null){    realSubject = new RealSubject();  }  realSubject.Request(); }}

客户端代码

class MainActivity extends Activity{ public void onCreate(){  Proxy proxy = new Proxy();  proxy.Request(); }}
接下来举个例子,应用一下代理模式。比如A同学要给C同学送礼物,但是C同学不认识A同学,怎么办呢,那么B同学就出现了。B和A是好朋友,B和C也认识。那么A要给C送礼物,可以通过B来实现这个需求。

按照依赖倒置原则,针对接口编程。

package com.abings.proxymodel.Proxy;/** * Created by Shuwen on 2016/8/31. */public interface GiftSubject {    void giveFloors();    void giveDolls();    void giveLove();}
接着是开放封闭原则。真正有需求的对象

package com.abings.proxymodel.Proxy;import android.content.Context;import android.widget.Toast;/** * Created by Shuwen on 2016/8/31. */public class RealSubjectPersonA implements GiftSubject {    private String name;    private Context context;    public RealSubjectPersonA(String name,Context context){        this.name = name;        this.context = context;    }    @Override    public void giveFloors() {        Toast.makeText(context, "A先生送"+name+"小姐一束花。", Toast.LENGTH_SHORT).show();    }    @Override    public void giveDolls() {        Toast.makeText(context, "A先生送"+name+"小姐一个玩具熊。", Toast.LENGTH_SHORT).show();    }    @Override    public void giveLove() {        Toast.makeText(context, "A先生向"+name+"小姐表达爱意。", Toast.LENGTH_SHORT).show();    }}
接下来是代理对象

package com.abings.proxymodel.Proxy;import android.content.Context;/** * Created by Shuwen on 2016/8/31. */public class ProxyPersonB implements GiftSubject {    private RealSubjectPersonA realSubjectPersonA;    public ProxyPersonB(PersonC personC,Context context){        if (realSubjectPersonA == null){            realSubjectPersonA = new RealSubjectPersonA(personC.getName(),context);        }    }    @Override    public void giveFloors() {        realSubjectPersonA.giveFloors();    }    @Override    public void giveDolls() {        realSubjectPersonA.giveDolls();    }    @Override    public void giveLove() {        realSubjectPersonA.giveLove();    }}
这就是按照UML图设计出来的代码,简单易懂。(顺便告诉大家,追女孩子采用代理模式,最终的结果是代理那个人会成功追到手。苦不堪言的结局,面对爱情就是要用于表达,不然只有单身咯。不过,程序猿单身也是在正常不过的了。)
最后附上git地址:

你可能感兴趣的文章
oracle如何去除某个字段中两边的空格?
查看>>
plsql developer如何在窗口列表直接可以修改表格中的数据?
查看>>
java自定义注解有什么作用?
查看>>
ORACLE中通过SQL语句(alter table)来增加、删除、修改字段
查看>>
js的Object对象如何访问中间有 . 点号的属性(键),获得其值?
查看>>
@ManyToOne和@OneToMany 注解
查看>>
Java集合(1) - List集合源码解析
查看>>
Java集合(2) - Map与AbstractMap源码解析
查看>>
Java集合(3) - HashMap源码解析与常见问题(一)
查看>>
Java集合(4) - HashMap-put()源码解析与常见问题(二)
查看>>
Java集合(5) - HashMap查删源码解析与常见问题(三)
查看>>
Java集合(6) - LinkedHashMap源码解析
查看>>
Java集合(7) - TreeMap源码解析
查看>>
Java集合(8) - Set与AbstractSet源码解析
查看>>
Java多线程(2) - 多线程之线程安全详解(synchronized、Lock)
查看>>
OKR与CFR管理模式(二)-CFR与OKR的绩效管理
查看>>
Java多线程(3) - 多线程之死锁
查看>>
Java多线程(4) - 多线程之Volatile关键字、ThreadLocal、Atomic系列类、CAS
查看>>
Java多线程(5) - 多线程之线程通讯(一)(wait、notify、join、yield、sleep区别与应用)
查看>>
Java多线程(6) - 多线程之线程通讯(二)(wait与notify案例、守护线程)
查看>>