设计模式之代理模式--静态代理

定义:给目标对象提供一个代理对象,并由代理对象控制对目标对象的引用

这样说你可能不知道什么意思,代理这个词还是比较好理解的,现在代购盛行,一个TF口红在日韩买可能便宜很多,但是你又不方便过去买,那么就要找代购,于是在你和要买的TF之间就存在一个代购,由代购负责买家是谁,和这个买家要买什么,这就是代购代理,再比如你要租一个房子,但是你不知道去哪里租哪里找房东,这时候就需要中介牵线,再比如古代男婚女嫁,父母之命媒妁之言,在媒婆两家上门说媒之前,两家都是基本没有见面相谈。

优点:避免直接访问对象造成的复杂性

这样买家和买TF口红就减小了耦合性,减少耦合性的好处是什么,从代购模式你就知道,不用跑到当地买啦,简单方便,缺点就是代购的价钱比你直接买贵点,(复杂度请求速度变慢)所以真的有人跑到国外去买哦,这当然是仁者见仁智者见智了,实际上如果是大部分人都跑到当地去买,会导致当地游客膨胀,中国人嘛,抢购高手,增加了混乱度,所以大部分人还是选择代购模式,适合多物品购买的模式。

静态代理

代码实现:

首先定义一个接口事件,事件是要买一个TF口红

public interface Event {

    public void buyTF();

}

然后就是客户我,需要实现这个接口,我要买一个TF口红。

public class Client implements Event {
    @Override
    public void buyTF() {
        System.out.println("I want a TF lipstick");
    }
}

代理:在代理里面引用实际实例,顺便替我打包快递

public class Proxy implements Event {
    @Override
    public void buyTF() {
        //引用创建真实实例
        Client me=new Client();
        //调用真实用例方法
        me.buyTF();
        //代理商快递回来
        express();
    }

    public void express(){

        System.out.println("快递回来");
    }
}

代理模式:相当于管代理人的公司,这里面任务单独分给专门的代理,不会暴漏客户对象。

运行结果为:

 

如果我想在买之前添加一个日志代理类和权限代理类呢:那么代码现在更改为

买东西的接口

package StaticProxy;

public interface BuyInterface {

    public void buyTF();

}

买TF的客户

package StaticProxy;

public class TFClient implements BuyInterface {
    @Override
    public void buyTF() {
        System.out.println("I want a TF lipstick");
    }
}

 

 权限代理

package StaticProxy;

public class ClientAuthProxy implements BuyInterface {
    private BuyInterface buyInterface;
    public ClientAuthProxy (BuyInterface buyInterface){
        this.buyInterface=buyInterface;

    }
    @Override
    public void buyTF() {
        System.out.println("开始验证权限");
        buyInterface.buyTF();
        System.out.println("结束验证权限");
    }
}

 日志代理:

package StaticProxy;

import com.sun.org.apache.xml.internal.resolver.helpers.PublicId;

public class ClientLogProxy implements BuyInterface {
   private BuyInterface buyInterface;
   public ClientLogProxy (BuyInterface buyInterface){
       this.buyInterface=buyInterface;

    }
    @Override
    public void buyTF() {
        System.out.println("开始打印日志");
        buyInterface.buyTF();
        System.out.println("结束打印日志");
    }
}

调用运行:

public class MainControl {


    public static void main(String[] args) {

        TFClient me=new TFClient();
        ClientAuthProxy clientAuthProxy=new ClientAuthProxy(me);
        ClientLogProxy clientLogProxy=new ClientLogProxy(clientAuthProxy);
         clientLogProxy.buyTF();

    }
}

运行结果:


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值