GoF設計模式-代理模式

    代理模式(重要):
        對象結構型模式,使用代理對象來間接訪問被代理對象,爲了用戶使用的透明性,代理對象和被代理對象需要實現相同的接口(以便在任何地方替換被代理類),代理類中包含對被代理類的引用
        代理模式的結構:被代理類,代理類,代理類與被代理類要實現的共同抽象接口
        
    代理模式的適用場景:
        根據不同的使用情景使用不同的代理類型:
        1.保護(權限)代理:控制對被代理類的訪問,對於不同的用戶使用不同的權限
        2.遠程代理:在本地提供一個代理對象,這個代理對象負責對遠程服務的調用
        3.虛擬代理:對於一個消耗資源較大的對象,先創建一個小對象代理,被代理對象在需要時再創建,將資源消耗大的對象推遲到使用它的時候才創建,可以加快系統的啓動速度
        4.動態代理:典型應用Spring AOP。使用動態代理的原因:(1)被代理類必須事先已經存在    (2)一個被代理類需要對應一個或多個代理類,系統中類的個數增多在動態代理中無須關心被代理類是什麼,不需要維護對被代理類的引用,用戶可以根據需要自定義被代理類,系統靈活性和可擴展性更好
        
    代理模式的優點:
        1.協調調用者和被調用者,在一定程度上降低了系統的耦合度
        2.增加新的代理類,不需要修改原有代碼,符合開閉原則
        3.具體看是什麼代理,不同的代理具有不同的優點
    
    代理模式的缺點:
        1.增加代理類,可能會使程序運行變慢
        2.實現代理需要額外的工作,有些代理的實現較爲複雜
   

代理模式的例子(保護代理)

User輔助類

public class User {
	
	private String userName;
	private int userLevel;
	
	public String getUserName() {
		return userName;
	}
	
	public void setUserName(String userName) {
		this.userName = userName;
	}
	
	public int getUserLevel() {
		return userLevel;
	}
	
	public void setUserLevel(int userLevel) {
		this.userLevel = userLevel;
	}

	@Override
	public String toString() {
		return "User [userName=" + userName + ", userLevel=" + userLevel + "]";
	}
	
}

共同接口

public interface AbsUserService {
	void add(User user);
	void delete(User user);
	void modify(User user);
	void query(User user);
}

被代理類

public class UserService implements AbsUserService {

	/**
	* @Description: TODO
	* @author doudou
	* @date 2019年10月11日
	* @param user
	* @throws
	* @return
	* @see structual.ProxyPattern.AbsUserService#add(structual.ProxyPattern.User)
	*/
	@Override
	public void add(User user) {
		System.out.println("增加用戶:"+user.toString());
	}

	/**
	* @Description: TODO
	* @author doudou
	* @date 2019年10月11日
	* @param user
	* @throws
	* @return
	* @see structual.ProxyPattern.AbsUserService#delete(structual.ProxyPattern.User)
	*/
	@Override
	public void delete(User user) {
		System.out.println("刪除用戶:"+user.toString());
	}

	/**
	* @Description: TODO
	* @author doudou
	* @date 2019年10月11日
	* @param user
	* @throws
	* @return
	* @see structual.ProxyPattern.AbsUserService#modify(structual.ProxyPattern.User)
	*/
	@Override
	public void modify(User user) {
		System.out.println("修改用戶:"+user.toString());
	}

	/**
	* @Description: TODO
	* @author doudou
	* @date 2019年10月11日
	* @param user
	* @throws
	* @return
	* @see structual.ProxyPattern.AbsUserService#query(structual.ProxyPattern.User)
	*/
	@Override
	public void query(User user) {
		System.out.println("查詢用戶:"+user.toString());
	}

}

代理類

public class UserServiceProxy implements AbsUserService {

	private UserService userService = new UserService();
	/**
	* @Description: TODO
	* @author doudou
	* @date 2019年10月11日
	* @param user
	* @throws
	* @return
	* @see structual.ProxyPattern.AbsUserService#add(structual.ProxyPattern.User)
	*/
	@Override
	public void add(User user) {
		userService.add(user);
	}

	/**
	* @Description: TODO
	* @author doudou
	* @date 2019年10月11日
	* @param user
	* @throws
	* @return
	* @see structual.ProxyPattern.AbsUserService#delete(structual.ProxyPattern.User)
	*/
	@Override
	public void delete(User user) {
		if (user.getUserLevel() == 0) {
			System.out.println("沒有權限刪除用戶:"+user.toString());
		}else {
			userService.delete(user);
		}
	}

	/**
	* @Description: TODO
	* @author doudou
	* @date 2019年10月11日
	* @param user
	* @throws
	* @return
	* @see structual.ProxyPattern.AbsUserService#modify(structual.ProxyPattern.User)
	*/
	@Override
	public void modify(User user) {
		if (user.getUserLevel() == 0) {
			System.out.println("沒有權限修改用戶:"+user.toString());
		}else {
			userService.modify(user);
		}	
	}

	/**
	* @Description: TODO
	* @author doudou
	* @date 2019年10月11日
	* @param user
	* @throws
	* @return
	* @see structual.ProxyPattern.AbsUserService#query(structual.ProxyPattern.User)
	*/
	@Override
	public void query(User user) {
		userService.query(user);
	}

}


    代理模式的應用:
        1.Spring的AOP動態代理       2.Web Service

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