設計模式這種古老的問題現在好想沒什麼人問了,今天看曾經寫的代碼中,有一些關於代理模式的例子,不作爲只是擴充,算是筆記吧,由於東西很簡單並且只是用於當筆記所以開門見山
代理模式分靜態代理和動態代理,這篇博客主要說下靜態代理。
靜態代理的實現很簡單,可以通過繼承或者聚合,接下來分別給出繼承和聚合的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毫秒
發信息告訴老婆到家了下車了