码迷,mamicode.com
首页 > 编程语言 > 详细

JAVA设计模式——代理(静态代理)

时间:2018-10-30 21:56:25      阅读:211      评论:0      收藏:0      [点我收藏+]

标签:方法   proxy   system   null   逻辑   设计模式   代理   override   直接   

定义

为其它的对象提供一种代理,以控制这个对象的访问

使用场景

当不想直接访问某个对象的时候,就可以通过代理

1.不想买午餐,同事帮忙带 
2.买车不用去厂里,去4s店 
3.去代理点买火车票,不用去车站

UML

技术分享图片

 

介绍下上面的UML图的意思,以购买火车票为例:

 

定义代理的接口,买票

1)IProxy


代理的对象,完成代理的任务,设置具体的代理,调用具体的代理方法等

2)ProxyObject

 

被代理对象,处理具体的业务逻辑

3)RealObject

代码实现

上面我们已经很清晰的明白了他们之间的关系,所以接下来就用代码演示,将上面我们的想法和逻辑用代码表现出来:

(1)定义代理接口

package com.zengtao.demo.proxy;

public interface IProxy {

    void buyTicket();

}

 

(2)代理类

package com.zengtao.demo.proxy;

/**
 * 代理
 */
public class Proxy implements IProxy {

    private RealProxy realClient;

    public Proxy(RealProxy realClient) {
        this.realClient = realClient;
    }

    @Override
    public void buyTicket() {
        realClient.buyTicket();
    }

}

 

(3)被代理对象买票

package com.zengtao.demo.proxy;

import com.zengtao.demo.bean.User;

/**
 * 具体代理买票
 */
public class RealProxy implements IProxy {

    private User user;

    public RealProxy() {

    }

    public RealProxy(User user) {
        this.user = user;
    }

    public void setUser(User user) {
        this.user = user;
    }

    @Override
    public void buyTicket() {
        // 具体实现逻辑
        if (user != null) {
            System.out.println("***********我要买票***********");
            System.out.println("信息如下:");
            System.out.println("姓名:" + user.getName());
            System.out.println("性别:" + user.getSex());
            System.out.println("身份证号:" + user.getCardCode());
            System.out.println("住址:" + user.getHomeAddress());

            System.out.println("***********信息已核对***********");
            System.out.println("出票成功:动车D2222次09车20A");
        }
    }
}

 

(4)用户对象

package com.zengtao.demo.bean;

import java.io.Serializable;

@SuppressWarnings("serial")
public class User implements Serializable {

    private String cardCode;
    private String name;
    private String homeAddress;
    private String sex;

    public String getCardCode() {
        return cardCode;
    }

    public void setCardCode(String cardCode) {
        this.cardCode = cardCode;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getHomeAddress() {
        return homeAddress;
    }

    public void setHomeAddress(String homeAddress) {
        this.homeAddress = homeAddress;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }
}

 

(6)具体调用

package com.zengtao.demo;

import com.zengtao.demo.bean.User;
import com.zengtao.demo.proxy.Proxy;
import com.zengtao.demo.proxy.RealProxy;

public class Main {

    public static void main(String[] str) {
        // 用户信息
        User user = new User();
        user.setCardCode("510522177709096836");
        user.setSex("男");
        user.setName("无名氏");
        user.setHomeAddress("地球村第七号店铺");

        // 具体代理
        RealProxy realClient = new RealProxy();
        realClient.setUser(user);

        // 代理
        Proxy proxy = new Proxy(realClient);
        proxy.buyTicket();
    }
}

 

(7)结果

技术分享图片

以上以代理模式的方式,简陋的实现了购票的流程。

 

总结

  大家也可以看到,其实代理模式,说白了就是委托,将所有的事情都委托给别人帮你完成,你所要做的,就是给代理一些东西,接下来所有的事情都是代理帮你完成,你完全不用去关心内部是如何实现的。

代理模式:一般可以分为两种,一种为静态代理,一种为动态代理

(1)静态代理

静态代理:就是我们上述所写的,代理代码是由我们自己去生成的固定的代码进行编译

(2)动态代理

动态代理:动态代理,跟静态代理相反,它是用反射机制动态的生成代理的对象,我们不需要知道谁代理谁

传送门:JAVA设计模式——代理(静态代理)

 

JAVA设计模式——代理(静态代理)

标签:方法   proxy   system   null   逻辑   设计模式   代理   override   直接   

原文地址:https://www.cnblogs.com/TvvT-kevin/p/9879732.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!