`
duolaaqian
  • 浏览: 14424 次
  • 性别: 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");
	}
}

 

分享到:
评论

相关推荐

    23种GoF设计模式Java版.pdf

    **3.2 代理模式** - 为其他对象提供一个代理以控制对这个对象的访问。 **3.3 适配器模式** - 将一个类的接口转换成客户希望的另一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。 ...

    常见的23个设计模式详解

    《常见的23个设计模式详解》一书深入探讨了软件工程领域中最为广泛接受和应用的设计模式,旨在帮助不同层次的开发人员、系统分析师及架构师掌握这些模式的核心概念与实践技巧。本书不仅覆盖了从初级到高级的技术细节...

    java设计模式之禅

    初级程序员可以学习如何编写优秀代码,高级程序员可以全面理解设计模式及Java的高级技巧,而顶级系统分析师则可以通过本书找到解决项目共性问题的方法。 书中按照25章详细介绍了众多设计模式,从基础的策略模式到...

    java设计模式详细解说

    本书《Java设计模式详细解说》旨在为不同水平的读者提供全面而深入的设计模式学习资料,无论是初级程序员还是经验丰富的系统分析师都能从中获益。 #### 第1章:策略模式【STRATEGY PATTERN】 **定义与作用:** ...

    设计模式的解析和实现(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