代理模式之静态代理

设计模式这种古老的问题现在好想没什么人问了,今天看曾经写的代码中,有一些关于代理模式的例子,不作为只是扩充,算是笔记吧,由于东西很简单并且只是用于当笔记所以开门见山

代理模式分静态代理和动态代理,这篇博客主要说下静态代理。

静态代理的实现很简单,可以通过继承或者聚合,接下来分别给出继承和聚合的demo

原始接口

public interface Moveable {

	void move();
	
	void stop();
}

只有两个方法,这是一个行驶的接口

原始类

public class Car implements Moveable {

	@Override
	public void move() {
		//实现开车
		try {
			Thread.sleep(1000);
			System.out.println("汽车行驶中");
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	@Override
	public void stop() {
		System.out.println("汽车打算停下");
		
	}
	

	

}
它实现了行驶接口的方法

下面我们有一个新要求,就是记录一下汽车行驶的时间,下面先给出继承的方式实现

public class Car2 extends Car {

	@Override
	public void move() {
		long starttime = System.currentTimeMillis();
		System.out.println("汽车开始行驶");
		super.move();
		long endtime = System.currentTimeMillis();
		System.out.println("汽车结束行驶,行驶时间:" + (endtime - starttime ) +"毫秒");
	}
	
}
我们需要打印时间的话使用Car2就可以了,这么做有一个缺点就是我要再加一个别的功能 我还要再写一个类继承Car,这样不方便管理,下面给出聚合的方式实现

public class Car3 implements Moveable {

	public Car3(Car car){
		super();
		this.car = car;
	}
	
	private Car car;
	
	@Override
	public void move() {
		long starttime = System.currentTimeMillis();
		System.out.println("汽车开始行驶");
		car.move();
		long endtime = System.currentTimeMillis();
		System.out.println("汽车结束行驶,行驶时间:" + (endtime - starttime ) +"毫秒");
	}

	@Override
	public void stop() {
		// TODO Auto-generated method stub
		
	}

}

我们可以看到构造方法入参是原始类Car,因此我们实现接口里move的方法的时候可以使用原始类car的move方法和我们要增加的方法聚合在一起实现新的move方法

可能这么说大家感觉不出为什么聚合更适合静态代理,我在加难点需求,我现在要在开车前发信息给老婆说我在开车(意思是让她不要给我打电话)然后在我开到家以后告诉她我到家了,这样如果用继承的方法 是不是又要写个新的类实现这个和打印行驶时间的方法,有没有发现两个类都打印了行驶时间有点浪费,如果我再给出更多的要求,那么你就要写更多的类了,并且里面有可能有些事情是重复的,我们看聚合是如何实现的

public class CarTimeProxy implements Moveable {

	public CarTimeProxy(Moveable m){
		super();
		this.m = m;
	}
	
	private Moveable m;
	
	@Override
	public void move() {
		long starttime = System.currentTimeMillis();
		System.out.println("汽车开始行驶");
		m.move();
		long endtime = System.currentTimeMillis();
		System.out.println("汽车结束行驶,行驶时间:" + (endtime - starttime ) +"毫秒");
	}

	@Override
	public void stop() {
		// TODO Auto-generated method stub
		
	}

}


public class CarLogProxy implements Moveable {

	public CarLogProxy(Moveable m){
		super();
		this.m = m;
	}
	
	private Moveable m;
	
	@Override
	public void move() {

		System.out.println("发信息给老婆说正在开车");
		m.move();
		System.out.println("发信息告诉老婆到家了下车了");
	}

	@Override
	public void stop() {
		// TODO Auto-generated method stub
		
	}

}


看下测试类

public class Client {

	public static void main(String[] args) {
		
		Car car = new Car();
		CarTimeProxy ctp = new CarTimeProxy(car);
		CarLogProxy clp = new CarLogProxy(ctp);
		clp.move();
		
		
	}

}
打印结果是

发信息给老婆说正在开车

汽车开始行驶

汽车行驶中

汽车结束行驶,行驶时间:1004毫秒

发信息告诉老婆到家了下车了


现在有没有稍微体会到聚合的优势,可以动手自己操作下,静态代理的分享就到这里




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值