设计模式这种古老的问题现在好想没什么人问了,今天看曾经写的代码中,有一些关于代理模式的例子,不作为只是扩充,算是笔记吧,由于东西很简单并且只是用于当笔记所以开门见山
代理模式分静态代理和动态代理,这篇博客主要说下静态代理。
静态代理的实现很简单,可以通过继承或者聚合,接下来分别给出继承和聚合的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毫秒
发信息告诉老婆到家了下车了