# 23种设计模式-代理模式

# 1.代理模式

为其他对象提供一个代理以控制对这个对象的访问

# 优缺点

# 优点:

分离目标对象 : 代理模式能将代理对象与真实被调用的目标对象分离 ; 降低耦合 : 在一定程度上, 降低了系统耦合性 , 扩展性好 ; 保护目标对象 : 代理类代理目标对象的业务逻辑 , 客户端直接与代理类进行交互, 客户端与实际的目标对象之间没有关联 ; 增强目标对象 : 代理类可以在目标对象基础上 , 添加新的功能 ;

# 缺点:

类个数增加 : 代理模式会造成系统中类的个数增加 , 比不使用代理模式增加了代理类 ,系统的复杂度增加; ( 所有的设计模式都有这个缺点 ) 性能降低 : 在客户端和目标对象之间,增加了一个代理对象,造成请求处理速度变慢 ;

# 使用场景

# 实现方式

# 美女类

public class BeautifulGirl {
    String name;

    public BeautifulGirl(String name){
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

# 抽象主题,送礼物接口

public interface GiveGift {
    /**
     * 送花
     */
    void giveFlowers();
    
    /**
     * 送巧克力
     */
    void giveChocolate();
    
    /**
     * 送书
     */
    void giveBook();
}

# 自己的类

public class You implements GiveGift {
    BeautifulGirl mm ;     //美女
    
    public You(BeautifulGirl mm){
        this.mm = mm;
    }
    
 
    public void giveBook() {
        System.out.println(mm.getName() +",送你一本书....");
    }
 
    public void giveChocolate() {
        System.out.println(mm.getName() + ",送你一盒巧克力....");
    }
 
    public void giveFlowers() {
        System.out.println(mm.getName() + ",送你一束花....");
    }
}

# 她闺蜜室友

public class HerChum implements GiveGift{
 
    You you;
    
    public HerChum(BeautifulGirl mm){
        you = new You(mm);
    }
    
    public void giveBook() {
        you.giveBook();
    }
 
    public void giveChocolate() {
        you.giveChocolate();
    }
 
    public void giveFlowers() {
        you.giveFlowers();
    }
}

# 测试类

public class Client {
    public static void main(String[] args) {
        BeautifulGirl mm = new BeautifulGirl("小屁孩...");
        
        HerChum chum = new HerChum(mm);
        
        chum.giveBook();
        chum.giveChocolate();
        chum.giveFlowers();
    }
}

参考博客:https://blog.csdn.net/qq_25017839/article/details/89633681