您的位置:首页 > 其它

设计模式之代理模式

2016-09-09 09:54 344 查看

设计模式--代理模式

     设计模式应该很重要在软件设计中,不管在Java还是android中,之前自己一直没有涉及到这一块,现在自己也来凑凑热闹,别见笑了,各位。

    代理模式proxy,说白了,代理二字吗。要有一个真正的生产者realSubject,然后才有代理商将产品卖给众多的消费者手中,这一过程就叫代理模式。所以很理解,那么用代码怎么去提现出来呢?(注意:代理模式也可以有众多 的代理商,不一定只有一个)

代理模式的三个组成部分:

       Abstract Subject:抽象主题-声明真实主题和代理主题共同的接口

       Real Subject:真实主题-真实的对象,需要被代理主题引用

       Proxy Subject:代理主题-因为ProxySubject引用了RealSubject,并且实现了跟RealSubject一样的接口,所以ProxySubject可以操作RealSubject,还可以提供一些附加操作

    借用了一个别人的例子吧,拿买房子来说。

    1. 抽象的部分接口或者是抽象类

     

public interface IHouse{
void getHouseInfo();
void signContract();
void payFees();
}

  这个接口部分就是连接Real 和Proxy的 桥梁所在,好好去体会,会什么要这个东西?

 2. 创建RealSubject ,某一个具体的房

public class House implements IHouse{
private final String TAG = House.class.getSimpleName();
private String name;
private double price;

public House(String name, double price){
this.name = name;
this.price = price;
}

@Override
public void getHouseInfo() {
System.out.print( "House Info- name:" + name + "  ¥:" + price);
}

@Override
public void signContract() {        <pre name="code" class="html"><pre name="code" class="html"><pre name="code" class="html"><pre name="code" class="html">System.out.print


(TAG, "Contract:" + name + " signed at" + new SimpleDateFormat("HH:mm:ss").format(SystemClock.uptimeMilli


} @Override public void payFees() { System.out.print(TAG, "Bill: name-" + name + " $-" + price); } }

它就是第一个抽象部分的实现者,然后接着我们需要去创建一个代理类,当然了由于代理不是真正实体类,所以代理类在构造方法中用了RealSubject,所以这才实现了代理的功能,这就是代理 的关键,我理解的。

3 代理类创建

public class ProxyHouse implements IHouse{
private final String TAG = ProxyHouse.class.getSimpleName();
private IHouse house;
public ProxyHouse(IHouse house){
this.house = house;
}
@Override
public void getHouseInfo() {
house.getHouseInfo();

}

@Override
public void signContract() {
house.signContract();
}

@Override
public void payFees() {
house.payFees();
}
}

4   运用——体现出代理思想

  
IHouse house = new House("Downton Abbey", 5000);
IHouse proxyHouse = new ProxyHouse(house);
System.out.print( "looking for a perfect house");
proxyHouse.getHouseInfo();
System.out.print( "thinking");
proxyHouse.signContract();
proxyHouse.payFees();
System.out.print("so easy");


IHouse 的两个实现都是用子类实现父类,但是你仔细观察两个构造方法也是不一样的,这是非常重要的,所以关键点来了。RealSubject 是一个中规中矩的实体类,构造方法也是一样的,但是Proxy就不一样了,
public ProxyHouse(IHouse house){
this.house = house;
}
它是直接用抽象的部分(接口类,为什么我说这个接口就是两者的连接点)来作为构造方法的参数,这样就联系起来了。达到了操作RealSubject 的目的。好好体会,其实不难,还有好多其他模式的代理,先就不说了,以后有体会了自己再来聊一聊

坚持一个好的习惯,慢慢的,你会发现它已经让你受益颇多。

   
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: