代理模式之靜態代理

設計模式這種古老的問題現在好想沒什麼人問了,今天看曾經寫的代碼中,有一些關於代理模式的例子,不作爲只是擴充,算是筆記吧,由於東西很簡單並且只是用於當筆記所以開門見山

代理模式分靜態代理和動態代理,這篇博客主要說下靜態代理。

靜態代理的實現很簡單,可以通過繼承或者聚合,接下來分別給出繼承和聚合的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毫秒

發信息告訴老婆到家了下車了


現在有沒有稍微體會到聚合的優勢,可以動手自己操作下,靜態代理的分享就到這裏




發佈了65 篇原創文章 · 獲贊 7 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章