zoukankan      html  css  js  c++  java
  • 设计模式之静态代理

    一、代理模式的作用

    代理模式的作用是:为其他对象提供一种代理以控制对这个对象的访问。

    在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。

    二、代理模式一般涉及到的角色

    抽象角色:声明真实对象和代理对象的共同接口。

    代理角色:代理对象角色内部含有对真实对象的引用,从而可以操作真实对象,同时代理对象提供与真实对象相同的接口以便在任何时刻都能够代替真实对象。同时,代理对象可以在执行真实对象操作时,附加其他的操作,相当于对真实对象进行封装。

    真实角色:代理角色所代表的真实对象,是我们最终要引用的对象。

    例证:以下程序使用静态代理实现一个大写字母的转换功能。

    接口类ISomeService:

    package com.ietree.basicskill.designpattern.staticproxy;
    
    /**
     * 接口类
     * 
     * @author Root
     */
    public interface ISomeService {
        
        String doFirst();
        
        void doSecond();
    }

    实现类SomeServiceImpl:

    package com.ietree.basicskill.designpattern.staticproxy;
    
    /**
     * 实现类
     * 
     * @author Root
     */
    public class SomeServiceImpl implements ISomeService {
    
        @Override
        public String doFirst() {
            System.out.println("执行doFirst()...");
            String result = "abcde";
            return result;
        }
    
        @Override
        public void doSecond() {
            System.out.println("执行doSecond()...");
        }
    
    }

    代理类SomeServiceProxy:

    package com.ietree.basicskill.designpattern.staticproxy;
    
    /**
     * 代理类
     * 
     * @author Root
     */
    public class SomeServiceProxy implements ISomeService {
        
        private ISomeService target;
        
        public SomeServiceProxy() {
            super();
            target = new SomeServiceImpl();
        }
    
        @Override
        public String doFirst() {
            String result = target.doFirst();
    // 实现了将小写字母转换为大写字母
    return result.toUpperCase(); } @Override public void doSecond() { target.doSecond(); } }

    测试类Main:

    package com.ietree.basicskill.designpattern.staticproxy;
    
    public class Main {
        public static void main(String[] args) {
            
            ISomeService service = new SomeServiceProxy();
            String result = service.doFirst();
            System.out.println(result);
            
            service.doSecond();
        }
    }

    三、总结 

    如果要按照上述的方式(静态代理)使用代理模式,那么真实角色必须是实现已经存在的,并将其作为代理对象的内部属性。

    但是实际使用时,一个真实角色必须对应一个代理角色,但如果大量使用会导致类的急剧膨胀;此外,如果事先并不知道真实角色,该如何使用代理呢?这个问题可以通过Java的动态代理类来解决。

  • 相关阅读:
    Android底部菜单栏的两种实现方式 附完整源码
    如何创建WebView
    实现 unity MonoBehaviour API5.4 的消息
    linux常用命令2
    Mac 自带的Apache php 狼神的
    高频sql语句汇总。不断更新。。
    4.数据库mysql相关
    Android keystore文件查看应用签名md5
    Java 多线程进阶-并发协作控制
    Java 多线程进阶-并发数据结构
  • 原文地址:https://www.cnblogs.com/Dylansuns/p/6984437.html
Copyright © 2011-2022 走看看