结构型模式
建型模式介绍了创建对象的一些设计模式,这节介绍的结构型模式旨在通过改变代码结构来达到解耦的目的,使得我们的代码容易维护和扩展。
代理模式
第一个要介绍的代理模式是最常使用的模式之一了,用一个代理来隐藏具体实现类的实现细节,通常还用于在真实的实现的前后添加一部分逻辑。
既然说是代理,那就要对客户端隐藏真实实现,由代理来负责客户端的所有请求。当然,代理只是个代理,它不会完成实际的业务逻辑,而是一层皮而已,但是对于客户端来说,它必须表现得就是客户端需要的真实实现。
理解代理这个词,这个模式其实就简单了。 下面上代码理解。 代理接口:
//要有一个代理接口让实现类和代理实现类来实现。
public interface FoodService {
Food makeChicken();
}
被代理的实现类:
public class FoodServiceImpl implements FoodService {
@Override
public Food makeChicken() {
Food f = new Chicken();
f.setChicken("1kg");
f.setSpicy("1g");
f.setSalt("3g");
System.out.println("鸡肉加好佐料了");
return f;
}
}
被代理实现类就只需要做自己该做的事情就好了,不需要管别的。
代理实现类:
public class FoodServiceProxy implements FoodService {
// 内部一定要有一个真实的实现类,当然也可以通过构造方法注入
private FoodService foodService = new FoodServiceImpl();
@Override
public Food makeChicken() {
System.out.println("开始制作鸡肉");
// 如果我们定义这句为核心代码的话,那么,核心代码是真实实现类做的,
// 代理只是在核心代码前后做些“无足轻重”的事情
Food food = foodService.makeChicken();
System.out.println("鸡肉制作完成啦,加点胡椒粉");
food.addCondiment("pepper");
System.out.println("上锅咯");
return food;
}
}
客户端调用,注意,我们要用代理来实例化接口:
// 这里用代理类来实例化
FoodService foodService = new FoodServiceProxy();
foodService.makeChicken();
所谓代理模式,就是对被代理方法包装或者叫增强,这样用户就是用FoodServiceProxy(); 而且代理的实现不变,如果需要更改功能,只需要修改被代理的类foodServiceImpl() 具体的实现。从而做到对使用者的隔离。