`
duolaaqian
  • 浏览: 14117 次
  • 性别: Icon_minigender_1
  • 来自: 天津
社区版块
存档分类
最新评论

[初级]设计模式--静态代理模式

阅读更多

 

/**
 * 通过接口方式实现静态代理(聚合)
 * 
 * 	1、定义公共接口(IMoveable)
 * 	2、定义真实对象 继承接口(IMoveable) 实现功能(Tank)
 * 	3、定义代理类 继承接口(IMoveable) 实现前后逻辑/业务逻辑(TankTimeProxy/TankLogProxy)
 * 
 * 调用的时候可以通过修改代理顺序来来改变逻辑实现顺序(test1/test2)
 * 优点:
 * 		业务类只关注逻辑本身,灵活,重用性较好
 * 缺点:
 * 		1)一个接口只能服务于一种功能类,多功能类就需要多接口+多代理类(此时代理类里的逻辑很可能是重复的)
 * 		2)接口不能随便修改,接口一修改,所有的真实对象和代理类都要改,维护性不好
 */
public class StaticProxy2 {
	public static void main(String[] args) {
		test1();
		System.out.println("-----------------------------");
		test2();
	}
	/**
	 * 先进行时间记录,再进行log记录
	 */
	public static void test1(){
		Tank t = new Tank();
		TankTimeProxy ttp = new TankTimeProxy(t);
		TankLogProxy tlp = new TankLogProxy(ttp);
		tlp.move();
	}
	/**
	 * 先进行log记录,再进行时间记录
	 */
	public static void test2(){
		Tank t = new Tank();
		TankLogProxy tlp = new TankLogProxy(t);
		TankTimeProxy ttp = new TankTimeProxy(tlp);
		ttp.move();
	}
}

/**
 * 公共接口
 */
interface IMoveable{
	public void move();
}
/**
 * 真实对象
 */
class Tank implements IMoveable{
	@Override
	public void move() {
		for(int i=1;i<5;i++){
			try {
				Thread.sleep(500);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			System.out.println("坦克前行"+i*100+"米....");
		}
	}
}
/**
 * 记录时间代理类
 */
class TankTimeProxy implements IMoveable{
	IMoveable m;
	public TankTimeProxy(IMoveable m){
		this.m = m;
	}
	@Override
	public void move() {
		System.out.println("[TankTimeProxy]开始计时....");
		long start = System.currentTimeMillis();
		m.move();
		long end = System.currentTimeMillis();
		System.out.println("[TankTimeProxy]计时结束 共运行"+(end-start));
	}
}
/**
 * 记录日志代理类
 */
class TankLogProxy implements IMoveable{
	IMoveable m;
	public TankLogProxy(IMoveable m){
		this.m = m;
	}
	@Override
	public void move() {
		System.out.println("[TankLogProxy] print before log");
		m.move();
		System.out.println("[TankLogProxy] print after log");
	}
}

 

分享到:
评论

相关推荐

    设计模式的解析和实现(C++)共二十一篇

    本系列共包含二十一篇关于设计模式的解析与实现,旨在帮助中级程序员提升技能,同时为初级开发者提供编程思维的指导。 1. **单例模式**:确保一个类只有一个实例,并提供全局访问点。在C++中,可以使用静态成员、...

    Java 与模式 pdf格式

    《Java与模式》这本书深入探讨了Java编程语言中常见的设计模式,这些模式是软件开发中的宝贵经验总结,有助于提升代码的可读性、可维护性和复用性。本书面向初级程序员,旨在帮助他们理解并掌握如何在实际项目中有效...

    互联网大厂Java初级工程师岗位面试真题

    【Java面试题】Java初级工程师面试中常见的知识点涵盖了多个领域,包括并发控制、反射机制、网络协议、依赖注入以及设计模式等。以下是这些知识点的详细解释: 1. **并发控制**: - **synchronized**:Java中的...

    DesignModeTest.zip

    "DesignModeTest.zip"这个压缩包包含了C++设计模式的实例代码,旨在帮助初级程序员理解并掌握设计模式的运用,特别适合正在学习设计模式的开发者。 首先,我们来探讨其中的“单例模式”。单例模式确保一个类只有一...

    Java八股文+Java面试题,面试找工作,基础薄弱,初中高级开发都适用+面试题,基础学习

    - 代理模式:静态代理、动态代理(JDK Proxy、CGLIB)。 - 观察者模式、装饰者模式、策略模式等常见设计模式的理解与应用。 7. **JVM**: - 类加载机制:加载、验证、准备、解析、初始化五个阶段。 - 堆内存和...

    java面试题

    Java面试题是评估应聘者Java技能的关键环节,涵盖了语言基础、多线程、集合框架、JVM优化、网络编程、设计模式等多个方面。以下是一些关键的知识点: 1. **Java语言基础**: - 基本语法:变量、数据类型、运算符、...

    .net/C#软件工程师面试题目汇总

    在.NET/C#软件工程师的面试过程中,面试官通常会围绕以下几个核心领域来考察候选人的专业能力:基础知识、C#编程语言、.NET框架、数据库交互、设计模式与架构、软件工程实践以及项目经验。下面,我们将详细探讨这些...

    java高级工程师面试总结

    - Hibernate通过代理模式实现延迟加载,只有当真正访问关联属性时才会加载。 #### JVM虚拟机 - **GC算法有哪些**: - **标记-清除(Mark-Sweep)**:先标记后清除。 - **复制(Copy)**:将存活对象复制到另一...

    大数据教程大纲

    - **Nginx反向代理实战**:演示如何设置Nginx作为反向代理服务器。 - **Nginx动静分离URL转发**:通过URL转发实现静态和动态内容的分离处理。 - **调度策略**:Nginx的upstream支持的分配方式,包括轮询(默认)、...

    2018JAVA经典就业面试大纲

    熟悉常见的23种设计模式,如工厂模式、单例模式、装饰器模式、观察者模式等,并能根据实际情况灵活运用。 八、数据库基础 1. SQL语言:掌握SQL的增删改查操作,理解索引、视图和存储过程。 2. 数据库事务:理解...

    Java初中级程序员面试宝典共36页.pdf.zip

    - **常用设计模式**:单例、工厂、装饰器、代理、观察者等模式的应用与实现。 这份面试宝典可能会对这些知识点进行深入剖析,并结合实际案例进行讲解,帮助求职者准备面试,提升技术水平。同时,它可能还会涵盖...

Global site tag (gtag.js) - Google Analytics