【GOF】代理模式(proxy)之靜態代理

    上篇文章中介紹了單例模式的使用,它避免不一致問題,防止狀態變化!這篇文章介紹一下代理模式,代理模式爲其他對象提供一種代理,以控制對這個對象的訪問,它可以在保證不改變原有類的前提下完成對目標類的完善。是給某一個對象提供一個替代者(佔位者),使之在client對象和subject對象之間編碼更有效率。代理可以提供延遲實例化(lazy instantiation),控制訪問等等,代理模式分爲靜態代理&動態代理。

靜態代理結構圖:

   

UserManager代碼段:

<span style="font-family:KaiTi_GB2312;font-size:18px;">public interface UserManager {

	public void addUser(String userId,String userName);
	
	public void delUser(String userId);
	
	public void modifyUser(String userId,String userName);
	
	public String findUser(String userId);
}</span>
UserManagerImpl代碼段:

<span style="font-family:KaiTi_GB2312;font-size:18px;">public class UserManagerImpl implements UserManager {

	@Override
	public void addUser(String userId, String userName) {
		System.out.println("addUser() userid=" + userId);
	}

	@Override
	public void delUser(String userId) {
		System.out.println("delUser() userid=" + userId);
	}

	@Override
	public void modifyUser(String userId, String userName) {
		System.out.println("modifyUser() userid=" + userId);
	}

	@Override
	public String findUser(String userId) {
		System.out.println("findUser() userid=" + userId);
		return null;
	}

}</span>
UserManagerImplProxy代碼段:

<span style="font-family:KaiTi_GB2312;font-size:18px;">public class UserManagerImplProxy implements UserManager {

	private UserManager userManager;

	public UserManagerImplProxy(UserManager userManager) {
		this.userManager = userManager;
	}

	@Override
	public void addUser(String userId, String userName) {
		// System.out.println("UserManagerImplProxy/addUser() userid=" +
		// userId);
		userManager.addUser(userId, userName);
	}

	@Override
	public void delUser(String userId) {

	}

	@Override
	public void modifyUser(String userId, String userName) {

	}

	@Override
	public String findUser(String userId) {
		return null;
	}

}</span>
Client代碼段:

<span style="font-family:KaiTi_GB2312;font-size:18px;">public class Client {

	public static void main(String[] args) {
		// UserManager userManager = new UserManagerImpl();
		UserManager userManager = new UserManagerImplProxy(
				new UserManagerImpl());

		userManager.addUser("1200", "zhangsan");
	}
}</span>
輸出結果:

    通過代理類的方法調用了目標類中的方法,實現了在不違背“開閉原則”的前提下對目標類的修飾,提高了接口的可維護性!但這樣這樣對每個接口方法都需要一一修改,儘管提高了接口的可維護性,但帶來的工作量卻是巨大的,所以這就需要作出優化,動態代理便應用而生,下一篇文章中將詳細介紹動態代理的原理以及他們之間的區別。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章