zoukankan      html  css  js  c++  java
  • ProxyPattern(23种设计模式之一)


    设计模式六大原则(1):单一职责原则 设计模式六大原则(2):里氏替换原则 设计模式六大原则(3):依赖倒置原则 设计模式六大原则(4):接口隔离原则 设计模式六大原则(5):迪米特法则 设计模式六大原则(6):开闭原则

    参考书籍:设计模式-可复用面向对象软件基础(黑皮书)

    代理模式,在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用,其特征是代理类与委托类有同样的接口

    简单的典型实例:上网行为中的代理模式

    ProxyPattern,UML抽象图百度找,代码实现如下

    使用代理模式设计上网行为

    代理与实体公共接口

    package ProxyPattern;
    public interface NetWork {
    	public abstract void browser();
    }
    

    实体类

    package ProxyPattern.RealSubject;
    import ProxyPattern.NetWork;
    public class Real implements NetWork {
    	public void browser() {
    		System.out.println("上网浏览信息");
    	}
    }
    

    代理类

    package ProxyPattern.Proxy;
    import ProxyPattern.NetWork;
    public class Proxy implements NetWork{
    	private NetWork netWork;
    	public Proxy(NetWork netWork){
    		this.netWork = netWork;
    	}
    	public void browser() {
    		checkName();
    		this.netWork.browser();
    	}
    	private void checkName(){
    		//业务逻辑
    	}
    }
    

    测试类

    package ProxyPattern;
    import ProxyPattern.Proxy.Proxy;
    import ProxyPattern.RealSubject.Real;
    public class Test {
    	public static void main(String[] args) {
    		new Proxy(new Real()).browser();
    	}
    }
    


    待续



    关于日志代理

    代理与被代理接口

    package ProxyPattern;
    interface AbstractLog {
    	public void method();
    }
    

    被代理类

    package ProxyPattern;
    import java.text.SimpleDateFormat;
    import java.util.Random;
    public class LogRecord implements AbstractLog{
    	@Override
    	public void method() {
    		try{
    			java.util.Date date = new java.util.Date();
    			SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    			String time = format.format(date);
    			System.out.println("方法method被调用,调用时间为:" + time);
    			
    			//除零失败异常测试
    			Random random = new Random();
    			int a = random.nextInt(10);
    			int b = random.nextInt(2);
    			int c = a/b;
    			System.out.println("方法method调用成功");
    			System.out.println("除零失败测试数据为:" + c);
    		}catch(Exception e){
    			System.out.println("方法method调用失败");
    		}
    	}
    
    }
    

    代理类

    package ProxyPattern;
    public class LogProxy implements AbstractLog {
    	/*
    	 * 远程代理可以隐藏一个对象存在于不同地址空间的事实
    	 * 虚代理可以进行最优化,例如根据要求创建对象
    	 * 保护代理和智能指针都允许访问一个对象时有一些附加的内务处理
    	 * */
    	private LogRecord lp;
    	public LogProxy(){
    		lp = new LogRecord();
    	}
    	@Override
    	public void method() {
    		//代理方法实现
    		//使用代理模式的动机:用户希望程序和某个对象打交道,程序不希望用户直接访问该对象
    		lp.method();
    	}
    }
    

    测试类

    package ProxyPattern;
    public class Test {
    	/**
    	 * @param args
    	 */
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		AbstractLog al = new LogProxy();
    		al.method();
    	}
    }
    


    待续


  • 相关阅读:
    腾讯云通信服务端返回签名
    synchronized同步语句块
    synchronized同步方法
    springjdbc的批量操作
    yield方法
    暂停线程
    【jdk源码学习】HashMap
    diamond types are not supported at this language level
    【java基础系列】一、常用命令行
    Socket通信综合示例
  • 原文地址:https://www.cnblogs.com/1996jiwei/p/6701790.html
Copyright © 2011-2022 走看看