`

Java 静态代理模式与装饰者模式的本质区别

 
阅读更多

 

       我们在学习 Spring 时会先学习代理模式:包括静态代理与动态代理。

 

       在学习静态代理模式时,总感觉与装饰者模式特别像,有时候会特别迷茫,自己写的到底是代理模式还是装饰者模式。那么代理模式与装饰者模式的本质区别是什么呢?

 

        我也看过很多大牛写的关于两者的区别,意思是说到了,但是总感觉写得太多专业,不太好理解。

 

        那么如何更简单的理解两者的区别呢?其实非常简单,从使用者的角度来理解,是最简单的。

 

        如下代码:代理模式

public class Client {

	public static void main(String[] args) {
		
		/**
		 * 使用者只与代理类交互,根本不知道代理类调用IUserService 哪个实现类
		 * 
		 * 这种就是代理模式
		 * 
		 */
		IUserService userService = new UserServiceProxy();
		userService.addUser();
		
	}

}

 

   装饰者模式:

     

public class Client {

	public static void main(String[] args) {
		
		/**
		 * 使用者自己创建IUserSerivce的实现类,然后将创建的对象,交由装饰器进行装饰,即是进行功能加强
		 * 
		 * 这种就是装饰者模式。
		 */
		IUserService userServiceImpl = new UserServiceImpl();
		IUserService userService = new UserServiceDecorator(userServiceImpl);
		userService.addUser();
		
		
		/**
		 * 使用者只与代理类交互,根本不知道代理类调用IUserService 哪个实现类
		 * 
		 * 这种就是代理模式
		 * 
		 */
		//IUserService userService = new UserServiceProxy();
		//userService.addUser();
		
	}

}

 

    通过使用者可以看出:

            代理模式:使用者根本不用关心实现类是谁。

            装饰者模式:使用者需要自己创建实现类对象,然后转给装饰器进行功能加强。

 

   看似是两个小小的区别,在现实生活中,可以很容易找到原型。

   (1)我们租房子时,我们只要去房屋中介说我要租房子。根本不用关心房东是谁,如何找到房东,中介会帮我们搞定。所以代理模式的本质就是使用者根本不用关心具体的实现类。

 

    (2)装饰者模式,比如我们买了一套房子,我们要装修,我们去装修公司说,我的这套房子(具体的对象)要装修,那么装修公司就会以你传入的对象(你的房子)作为基础来进行装修。

 

     其实我们再看看代理模式与装饰者模式的代码,主能看出,其实写法差异并不大。

 

     (1)创建一个 IUserService 接口,暂时只有一个方法,添加用户 addUser()

       

/**
 * 客户服务接口
 * 
 * @author hasee
 *
 */
public interface IUserService {
	
	public void addUser();
	
}

   

     (2) 具体的实现类 UserServiceImpl

   

     

public class UserServiceImpl implements IUserService {
	
	@Override
	public void addUser() {
		System.out.println("UserService 添加用户!");
	}
	
}

 

   (3) 创建代理类,主要是代理类同样也实现 IUserService 接口,并创建一个具体对象的引用,

        并在构造方法中自己创建具体实现类对象。

       

public class UserServiceProxy implements IUserService {
	
	private IUserService userService;
	
	public UserServiceProxy() {
		this.userService = new UserServiceImpl();
	}
	
	public void addUser() {
		this.userService.addUser();
		log("成功添加一条客户数据!");
	}
	
	public void log(String content) {
		System.out.println("添加日志:" + content);
	}
	
}

 

   (4)创建装饰者类,同样实现IUserService ,只是实现类需要使用者传入。

    

public class UserServiceDecorator implements IUserService {

	private IUserService userService;
	
	public UserServiceDecorator(IUserService userService) {
		this.userService = userService;
	}
	
	@Override
	public void addUser() {
		this.userService.addUser();
		log("成功添加一条客户数据!");
	}
	
	public void log(String content) {
		System.out.println("添加日志:" + content);
	}

}

 

   

 

 

 

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics