/** * 通过接口方式实现静态代理(聚合) * * 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"); } }
相关推荐
初级程序员可以学习如何编写优秀代码,高级程序员可以全面理解设计模式及Java的高级技巧,而顶级系统分析师则可以通过本书找到解决项目共性问题的方法。 书中按照25章详细介绍了众多设计模式,从基础的策略模式到...
本系列共包含二十一篇关于设计模式的解析与实现,旨在帮助中级程序员提升技能,同时为初级开发者提供编程思维的指导。 1. **单例模式**:确保一个类只有一个实例,并提供全局访问点。在C++中,可以使用静态成员、...
《Java与模式》这本书深入探讨了Java编程语言中常见的设计模式,这些模式是软件开发中的宝贵经验总结,有助于提升代码的可读性、可维护性和复用性。本书面向初级程序员,旨在帮助他们理解并掌握如何在实际项目中有效...
【Java面试题】Java初级工程师面试中常见的知识点涵盖了多个领域,包括并发控制、反射机制、网络协议、依赖注入以及设计模式等。以下是这些知识点的详细解释: 1. **并发控制**: - **synchronized**:Java中的...
"DesignModeTest.zip"这个压缩包包含了C++设计模式的实例代码,旨在帮助初级程序员理解并掌握设计模式的运用,特别适合正在学习设计模式的开发者。 首先,我们来探讨其中的“单例模式”。单例模式确保一个类只有一...
- 代理模式:静态代理、动态代理(JDK Proxy、CGLIB)。 - 观察者模式、装饰者模式、策略模式等常见设计模式的理解与应用。 7. **JVM**: - 类加载机制:加载、验证、准备、解析、初始化五个阶段。 - 堆内存和...
Java面试题是评估应聘者Java技能的关键环节,涵盖了语言基础、多线程、集合框架、JVM优化、网络编程、设计模式等多个方面。以下是一些关键的知识点: 1. **Java语言基础**: - 基本语法:变量、数据类型、运算符、...
在.NET/C#软件工程师的面试过程中,面试官通常会围绕以下几个核心领域来考察候选人的专业能力:基础知识、C#编程语言、.NET框架、数据库交互、设计模式与架构、软件工程实践以及项目经验。下面,我们将详细探讨这些...
- Hibernate通过代理模式实现延迟加载,只有当真正访问关联属性时才会加载。 #### JVM虚拟机 - **GC算法有哪些**: - **标记-清除(Mark-Sweep)**:先标记后清除。 - **复制(Copy)**:将存活对象复制到另一...
- **Nginx反向代理实战**:演示如何设置Nginx作为反向代理服务器。 - **Nginx动静分离URL转发**:通过URL转发实现静态和动态内容的分离处理。 - **调度策略**:Nginx的upstream支持的分配方式,包括轮询(默认)、...
熟悉常见的23种设计模式,如工厂模式、单例模式、装饰器模式、观察者模式等,并能根据实际情况灵活运用。 八、数据库基础 1. SQL语言:掌握SQL的增删改查操作,理解索引、视图和存储过程。 2. 数据库事务:理解...
- **常用设计模式**:单例、工厂、装饰器、代理、观察者等模式的应用与实现。 这份面试宝典可能会对这些知识点进行深入剖析,并结合实际案例进行讲解,帮助求职者准备面试,提升技术水平。同时,它可能还会涵盖...