zoukankan      html  css  js  c++  java
  • 常见的设计模式 ----- 代理模式

    代理模式

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

    举个例子,大家买火车票的时候,可以去火车站买,我们都知道,火车站的人很多,买票需要排队。

    如果不想排队,可以去代理点儿那儿买。

    代理就是这个意思,代我们去买火车票哈!

    代理分为静态代理和动态代理,下面分别举例说明。

    静态代理:

    票务系统接口:

    1 public interface TiketsSystem {
    2     void buyTicket();
    3 }

    火车站实现了这个票务系统的接口,可以买票:

    1 public class TrainStation implements TiketsSystem{
    2     public void buyTicket(){
    3         System.out.println("buy a ticket");
    4     }

    这个就是代理,同样实现了票务系统的接口

     1 public class TicketsProxy implements TiketsSystem{
     2     TiketsSystem proxy;
     3     TicketsProxy(){}
     4     @Override
     5     public void buyTicket() {
     6         if (proxy == null) {
     7             proxy = new TrainStation();
     8         }
     9         proxy.buyTicket();
    10     }
    11 }

    测试:

    我们买票的时候就可以不去火车站了,到路边的代理点可以更高效的买到车票,虽然有手续费,但性价比高呀,用钱来买排队的时间哈。

    public class ProxyTest {
        public static void main(String[] args) {
            TicketsProxy proxy = new TicketsProxy();
            proxy.buyTicket();
        }
    }

    动态代理:

    只对上面的TicketsProxy进行修改

     1 import java.lang.reflect.InvocationHandler;
     2 import java.lang.reflect.Method;
     3 import java.lang.reflect.Proxy;
     4 
     5 public class TicketsProxy implements InvocationHandler{
     6     private Object proxy;
     7     
     8     // 返回TrainStation的实例来作为代理
     9     public Object getProxy (Object p) {
    10         proxy = p;
    11         return Proxy.newProxyInstance(proxy.getClass().getClassLoader(), proxy.getClass().getInterfaces(), this);
    12     }
    13     
    14     // InvocationHandler接口定义的方法
    15     @Override
    16     public Object invoke(Object proxy, Method method, Object[] args)
    17             throws Throwable {
    18         // 通过反射调用TrainStation的buyTicket方法
    19         Object obj = method.invoke(this.proxy, args);
    20         return obj;
    21     }
    22     
    23 }

    测试:

    1 public class ProxyTest {
    2     public static void main(String[] args) {
    3         // 通过getProxy方法获得火车站买票的代理权
    4         TiketsSystem proxy = (TiketsSystem)new TicketsProxy().getProxy(new TrainStation());
    5         // 代理来买票
    6         proxy.buyTicket();
    7     }
    8 }
  • 相关阅读:
    BZOJ 1072: [SCOI2007]排列perm
    BZOJ 1071: [SCOI2007]组队
    HDP集群部署
    使用Kubeadm部署kubernetes集群
    Docker 私有仓库
    Docker Compose
    Dockerfile使用
    Docker应用部署(Mysql、tomcat、Redis、redis)
    Docker 容器的数据卷 以及 数据卷容器
    Docker 服务、镜像、容器简单命令使用
  • 原文地址:https://www.cnblogs.com/keyiei/p/3597467.html
Copyright © 2011-2022 走看看