zoukankan      html  css  js  c++  java
  • 大话设计模式--第七章 代理模式

    代理模式

    场景描述:

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

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

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

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

    追求者

    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() + " 送你巧克力");
        }
        
    }

    被追求者

    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;
        }
        
    }

    客户端

    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. 戴励送的礼物是卓贾易买的

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

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

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

    代码实现如下:

    礼物抽象类

    package com.designModel.chapter7_proxyModel.step2;
    
    /**
     * 送礼物抽象类
     */
    public abstract class SendGift {
        
        public abstract void sendDolls();
        
        public abstract void sendChocolate();
        
        public abstract void sendFlower();
    }

    追求者

    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() + " 送你巧克力");
        }
    
    }

    代理

    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();
        }
       
    }

    被追求者

    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;
        }
        
    }

    客户端

    public static void main(String[] args) {
        SchoolGril sg = new SchoolGril();
        sg.setName("娇娇");
            
        Proxy proxy = new Proxy(sg);
        proxy.sendChocolate();
        proxy.sendDolls();
        proxy.sendFlower();
    }

    运行结果:

    娇娇 送你巧克力
    娇娇 送你洋娃娃
    娇娇 送你鲜花
  • 相关阅读:
    oralce索引的使用
    oracle中connect by prior的使用
    oracle函数listagg使用
    oracle函数的使用
    redis高可用集群搭建
    Node.js安装及环境配置之Windows篇
    Repeater 合并单元格
    c#16进制转浮点数单精度类型
    EF Core 实体映射表或视图
    docker 构建filebeat镜像
  • 原文地址:https://www.cnblogs.com/ITPower/p/9152192.html
Copyright © 2011-2022 走看看