设计模式中有很多种,这里介绍下面试中可能会被问到的一个问题:代理模式和装饰者模式的区别。
先看一下代理模式的设计图:
再看一下代理模式的代码:
第一步:定义一个接口:
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
或者
上完自习再说
装饰者模式的设计原理:
对,你没有看错,是一毛一样的。
接下来,看一下代码的实现。不同的地方,只有装饰类,其余不在展示
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
所以最终两者的区别是:
代理模式:对于被代理的对象有控制权,可以执行或者不执行。
装饰着模式:没有控制权,肯定会执行,但是增加了一层装饰的功能。