设计模式 代理模式和装饰者模式的区别

设计模式中有很多种,这里介绍下面试中可能会被问到的一个问题:代理模式和装饰者模式的区别。

先看一下代理模式的设计图:

设计模式 代理模式和装饰者模式的区别_第1张图片

再看一下代理模式的代码:

第一步:定义一个接口:

package com.interview.designModel.agentModel;
/**
 * 第一步:定义一个接口
 * @author EdwardShen
 *
 * 2018年4月13日
 */
public interface Girl {
    void behavior();
}


第二步:定义接口的实现,即为被代理的类

package com.interview.designModel.agentModel;
/**
 * 第二步:定义真实的被代理的类
 * @author EdwardShen
 *
 * 2018年4月13日
 */
public class NiceGirl implements Girl{
	private String name;
	public NiceGirl(String name)
	{
		this.name = name;
	}

	@Override
	public void behavior() {
		System.out.println(name+"说话很nice");
		System.out.println(name+"长的很nice");
	}
	
}

第三步:定义代理类

package com.interview.designModel.agentModel;

import java.util.Random;

/**
 * 第三步:定义代理类
 * 代理类,代理的对象是Girl
 * @author EdwardShen
 *
 * 2018年4月13日
 */
public class GirlAgent implements Girl{
	private Girl girl;
	
	public GirlAgent(Girl girl)
	{
		this.girl = girl;
	}
	
	public void behavior()
	{
		Random random = new Random();
		if(random.nextBoolean())
		{
			System.out.println("我安排你们上自习");
			girl.behavior();
		}
		else
		{
			System.out.println("上完自习再说");
		}
	}
}

第四步:定义测试类

package com.interview.designModel.agentModel;

import org.junit.Test;

/**
 * 第四步:定义测试类
 * 装饰者模式:可以对被代理的对象有控制权,决定被代理的对象执行还是不执行
 * @author EdwardShen
 *
 * 2018年4月13日
 */
public class Client {
	@Test
	public void showInfo()
	{
		Girl girl = new NiceGirl("小美");
		Girl friend = new GirlAgent(girl);
		friend.behavior();
	}
}

最后,正确的代码展示结果:

我安排你们上自习
小美说话很nice
小美长的很nice
或者
上完自习再说

装饰者模式的设计原理:

设计模式 代理模式和装饰者模式的区别_第2张图片

对,你没有看错,是一毛一样的。

接下来,看一下代码的实现。不同的地方,只有装饰类,其余不在展示

package com.interview.designModel.decoratorModel;

import com.interview.designModel.agentModel.Girl;
/**
 * 装饰者需要与装饰的对象相关联
 * @author EdwardShen
 *
 * 2018年4月13日
 */
public class GirlDecorator implements Girl{
	private Girl girl;
	public GirlDecorator(Girl girl)
	{
		this.girl = girl;
	}

	@Override
	public void behavior() {
		System.out.println("我的闺蜜不但知书达理,还会洗衣做饭");
		girl.behavior();
	}

}

正确的代码展示的结果

我的闺蜜不但知书达理,还会洗衣做饭
小美说话很nice
小美长的很nice

所以最终两者的区别是:

代理模式:对于被代理的对象有控制权,可以执行或者不执行。

装饰着模式:没有控制权,肯定会执行,但是增加了一层装饰的功能。

你可能感兴趣的:(设计模式)