大话设计模式--第七章 代理模式

2020-09-27 16:21:39 浏览数 (1)

代理模式

场景描述:

1. 卓贾易喜欢娇娇, 但是, 娇娇并不认识卓贾易, 那么他给娇娇送花, 送巧克力,送洋娃娃

2. 卓贾易也可以不这么做, 他喜欢娇娇, 找一个人, 让这个人吧鲜花, 巧克力和洋娃娃送给娇娇.

这是两种方式, 但达到的目的是一样的。我们下面来看看这两个代码的实现:

第一种: 卓贾易喜欢娇娇, 那么他给娇娇送花, 送巧克力,送洋娃娃

追求者

代码语言:javascript复制
package com.designModel.chapter7_proxyModel.step1;
/**
 * 追求者
 */
public class Pursuit {
    
    //追求的对象
    private SchoolGril sg;
    
    public Pursuit(SchoolGril sg){
        this.sg = sg;
    }
    
    // 行为: 给被追求者送花,送巧克力, 送洋娃娃
    public void sendFllower(){
        System.out.println(sg.getName()   " 送你鲜花");
    }
    
    public void sendDolls(){
        System.out.println(sg.getName()   " 送你洋娃娃");
    }
    
    public void sendChocolate(){
        System.out.println(sg.getName()   " 送你巧克力");
    }
    
}

被追求者

代码语言:javascript复制
package com.designModel.chapter7_proxyModel.step1;

/**
 * 被追求者
 */
public class SchoolGril {
    private String name;

    public String getName() {
        return name;
    }

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

客户端

代码语言:javascript复制
public static void main(String[] args) {
   SchoolGril sg = new SchoolGril();
   sg.setName("娇娇");
        
   Pursuit pursuit = new Pursuit(sg);
        
   pursuit.sendChocolate();
   pursuit.sendDolls();
   pursuit.sendFllower();
}

从代码来看, 卓贾易和娇娇是认识的. 并且, 卓贾易直接把鲜花, 巧克力, 洋娃娃送给了娇娇.

而实际上, 卓贾易和娇娇可能是不认识的. 这时候, 卓贾易也不好直接把鲜花, 巧克力, 洋娃娃送给娇娇. 于是, 就找了一个和娇娇熟悉的人戴励, 把礼物送给娇娇.

这时候, 戴励就是一个中间的代理. 他替卓贾易送礼品, 但实际上礼品是卓贾易买的. 找戴励送过去的. 这个代码怎么实现呢?注意一下几点:

1. 戴励和卓贾易的行为是一样的. 送礼物

2. 戴励送的礼物是卓贾易买的

既然戴励和卓贾易的行为都是一样的. 用面向对象的思想考虑. 肯定要把变化点抽象出来了. 结构图如下:

首先有一个父类: 送礼物.

代理和追求者都实现了送礼物这个类, 代理还关联追求者类。

代码实现如下:

礼物抽象类

代码语言:javascript复制
package com.designModel.chapter7_proxyModel.step2;

/**
 * 送礼物抽象类
 */
public abstract class SendGift {
    
    public abstract void sendDolls();
    
    public abstract void sendChocolate();
    
    public abstract void sendFlower();
}

追求者

代码语言:javascript复制
package com.designModel.chapter7_proxyModel.step2;

/**
 * 追求者
 */
public class Pursuit extends SendGift {
    
    private SchoolGril sg;
    
    public Pursuit(SchoolGril sg) {
        this.sg = sg;
    }
    
    // 行为: 给被追求者送花,送巧克力, 送洋娃娃
    @Override
    public void sendFlower(){
        System.out.println(sg.getName()   " 送你鲜花");
    }
    
    @Override
    public void sendDolls(){
        System.out.println(sg.getName()   " 送你洋娃娃");
    }
    
    @Override
    public void sendChocolate(){
        System.out.println(sg.getName()   " 送你巧克力");
    }

}

代理

代码语言:javascript复制
package com.designModel.chapter7_proxyModel.step2;

public class Proxy extends SendGift {

    private Pursuit pu;
    
    public Proxy(SchoolGril sg){
        pu = new Pursuit(sg);
    }
    
    @Override
    public void sendDolls() {
        pu.sendDolls();
    }

    @Override
    public void sendChocolate() {
        pu.sendChocolate();
    }

    @Override
    public void sendFlower() {
        pu.sendFlower();
    }
   
}

被追求者

代码语言:javascript复制
package com.designModel.chapter7_proxyModel.step2;

/**
 * 被追求者
 */
public class SchoolGril {
    private String name;

    public String getName() {
        return name;
    }

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

客户端

代码语言:javascript复制
public static void main(String[] args) {
    SchoolGril sg = new SchoolGril();
    sg.setName("娇娇");
        
    Proxy proxy = new Proxy(sg);
    proxy.sendChocolate();
    proxy.sendDolls();
    proxy.sendFlower();
}

运行结果:

代码语言:javascript复制
娇娇 送你巧克力
娇娇 送你洋娃娃
娇娇 送你鲜花

0 人点赞