代理模式也是平时比较常用的设计模式之一。所谓代理模式就是在进行交互的时候,不和原本的对象直接交互,而是通过代理的方式,用代理来代替真正的对象进行交互,这样做的好处是降低了耦合性。 代理模式其实就是提供了一个新的对象,实现了对真实对象的操作,或成为真实对象的替身。在日常生活中也是很常见的。例如A要租房,为了省麻烦A会去找中介,中介会替代A去筛选房子,A坐享中介筛选的结果,并且交房租也是交给中介,这就是一个典型的日常生活中代理模式的应用。平时打开网页,最先开到的一般都是文字,而图片等一些大的资源都会延迟加载,这里也是使用了代理模式。
代理模式经常使用方式大约有三种: 1、普通代理 所谓普通代理,就是创建一个和真实对象相同的类,将真实的对象当作参数传入到代理中,当外界通过代理进行操作的时候,代理中的真实对象也会进行相应的操作。 步骤很简单: ①创建接口,定义共同方法。 ②创建真实类,实现接口 ③创建代理类,实现接口,但是增加一步,在构造方法中将真实对象的引用当作参数,拿到真实对象。 ④得到代理对象,通过对代理对象操作,实现对真实对象的相应操作 举例如下: //定义接口 public interface IHouse { void getHouseInfo(); void signContract(); void payFees(); }
//接下来定义真实主题,并实现IHouse接口。 增加房屋名称和价格两个属性,填充接口方法,在获取房屋信息的时候就把房屋名称和价格log出来;签合同的时候log出签合同的时间,付租金的时候log出价格。 public class House implements IHouse{ private String name; private double price;
public House(String name, double price){ this.name = name; this.price = price; }
@Override public void getHouseInfo() { Log.i(TAG, “House Info- name:” + name + " ¥:" + price); }
@Override public void signContract() { Log.i(TAG, “Contract:” + name + " signed at" + new SimpleDateFormat(“HH:mm:ss”).format(SystemClock.uptimeMillis())); }
@Override public void payFees() { Log.i(TAG, “Bill: name-” + name + " $-" + price); } }
//定义房屋代理,同样需要实现IHouse接口,并持有House的引用。 可以看到代理类其实就像又封装了House,提供了一些附加操作,例如客户要看房子的时候代理会先检索自己库存的房屋信息,签合同之前要准备合同之类的。 public class ProxyHouse implements IHouse{ private IHouse house; public ProxyHouse(IHouse house){ this.house = house; } @Override public void getHouseInfo() { Log.i(TAG, “searching”); house.getHouseInfo(); Log.i(TAG, “search finished”); }
@Override public void signContract() { Log.i(TAG, “prepare contract”); house.signContract(); }
@Override public void payFees() { house.payFees(); } }
对于客户来说,完全不用跟House进行直接交互,这里先定义一个房子叫唐顿庄园,租金5k,建立一个房屋代理,把唐顿庄园委托给代理.客户要找房子,签合同,付租金直接找代理就行了. IHouse house = new House(“Downton Abbey”, 5000); IHouse proxyHouse = new ProxyHouse(house); Log.i(TAG, “looking for a perfect house”); proxyHouse.getHouseInfo(); Log.i(TAG, “thinking”); proxyHouse.signContract(); proxyHouse.payFees(); Log.i(TAG, “so easy”);
|