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();
	}
}


待续


posted @ 2017-04-12 22:34  纪伟  阅读(241)  评论(0编辑  收藏  举报