代理模式(Proxy Pattern)
背景介绍:
小胖子决定开启加盟模式,允许其他商家加盟他的披萨店。然而,为了保护自己的品牌和经营理念,小胖子不希望直接将自己的披萨制作流程和食品信息完全暴露给加盟商。为了解决这个问题,小胖子决定引入代理模式,通过代理来控制和保护核心功能。
设计模式应用:
代理模式
为了控制和保护披萨店的核心功能,小胖子引入了代理模式。他创建了一个披萨制作代理类,该代理类通过实现与披萨制作相关的接口,代理了真正的披萨制作类。通过这样的设计,小胖子可以在代理中控制访问、记录日志、验证权限等,确保披萨店的核心信息受到保护。
代码示例:
// 披萨制作接口
interface PizzaMaking {
void prepareIngredients();
void spreadSauce();
void addToppings();
void bakePizza();
void slicePizza();
void deliverPizza();
}
// 真正的披萨制作类
class RealPizzaMaking implements PizzaMaking {
@Override
public void prepareIngredients() {
System.out.println("准备披萨材料");
}
@Override
public void spreadSauce() {
System.out.println("涂抹酱料");
}
@Override
public void addToppings() {
System.out.println("加入配料");
}
@Override
public void bakePizza() {
System.out.println("烘焙披萨");
}
@Override
public void slicePizza() {
System.out.println("切片披萨");
}
@Override
public void deliverPizza() {
System.out.println("交付披萨");
}
}
// 披萨制作代理类
class PizzaMakingProxy implements PizzaMaking {
private RealPizzaMaking realPizzaMaking;
public PizzaMakingProxy() {
// 在代理类中持有真正的披萨制作类的实例
this.realPizzaMaking = new RealPizzaMaking();
}
@Override
public void prepareIngredients() {
// 代理操作
System.out.println("代理操作:检查材料新鲜度");
// 调用真正的披萨制作类的方法
realPizzaMaking.prepareIngredients();
}
@Override
public void spreadSauce() {
// 代理操作
System.out.println("代理操作:检查酱料用量");
// 调用真正的披萨制作类的方法
realPizzaMaking.spreadSauce();
}
@Override
public void addToppings() {
// 代理操作
System.out.println("代理操作:检查配料均匀性");
// 调用真正的披萨制作类的方法
realPizzaMaking.addToppings();
}
@Override
public void bakePizza() {
// 代理操作
System.out.println("代理操作:监控烘焙过程");
// 调用真正的披萨制作类的方法
realPizzaMaking.bakePizza();
}
@Override
public void slicePizza() {
// 代理操作
System.out.println("代理操作:控制切片均匀度");
// 调用真正的披萨制作类的方法
realPizzaMaking.slicePizza();
}
@Override
public void deliverPizza() {
// 代理操作
System.out.println("代理操作:记录交付信息");
// 调用真正的披萨制作类的方法
realPizzaMaking.deliverPizza();
}
}
// 客户端
public class ProxyPatternExample {
public static void main(String[] args) {
// 使用代理来进行披萨制作
PizzaMaking pizzaMaking = new PizzaMakingProxy();
// 调用代理的方法,实际上会调用真正的披萨制作类的对应方法
pizzaMaking.prepareIngredients();
pizzaMaking.spreadSauce();
pizzaMaking.addToppings();
pizzaMaking.bakePizza();
pizzaMaking.slicePizza();
pizzaMaking.deliverPizza();
}
}
通过代理控制核心功能
在这个例子中,代理模式帮助小胖子通过代理类对披萨制作的核心功能进行控制。代理类中可以添加一些额外的逻辑,比如权限验证、日志记录等,确保核心功能的安全和可控性。