zoukankan      html  css  js  c++  java
  • 设计模式-代理模式学习笔记

    前言:不包含动态代理

    代理模式

    代理模式为其他对象提供一种代理以控制对这个对象的访问。(代理类替代具体的实现类,代理类可根据需求添加内容而不用修改实现类)


    • 优缺点

    优点:

    1. 满足了开闭原则
    2. 可扩展性高(当需求添加内容可通过代理类添加)
    3. 保护了实现类(可以隐藏并且不用修改),也增强了实现类的功能

    缺点:

    1. 在实现类和调用类之间出现代理类,影响请求速度
    2. 类的数量增加,程序变得复杂

    • 结构

    Subject:代理类和实现类的父类

    RealSubject:具体的实现类,被代理对象

    Proxy:代理类(代理对象,调用时被调用的对象)


    • 代码

    引用《大话设计模式》中的例子,为人做嫁衣,一位同学想追求李娇娇同学,但是由于含羞,所以请另一位同学代为送礼物

        抽出父类

    /**
     * @ Author     :fonxi
     * @ Date       :2019/5/13 5:11
     * @ Description:代理和被代理对象的共同父类
     */
    public interface GiveGift {
        void giveDolls();
        void giveFlowers();
        void giveChocolate();
    }
    

        女孩类

    /**
     * @ Author     :fonxi
     * @ Date       :2019/5/13 5:08
     * @ Description:女孩
     */
    public class SchoolGirl {
        private String name;
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    }
    

     被代理对象,实现具体的操作

    /**
     * @ Author     :fonxi
     * @ Date       :2019/5/13 5:08
     * @ Description:被代理类  追求者类
     */
    public class Pursuit implements GiveGift{
        SchoolGirl mm;
    
        public Pursuit(SchoolGirl mm){
            this.mm = mm;
        }
    
        @Override
        public void giveDolls() {
            System.out.println(mm.getName()+"送你洋娃娃");
        }
    
        @Override
        public void giveFlowers() { System.out.println(mm.getName()+"送你鲜花");
        }
    
        @Override
        public void giveChocolate() {
            System.out.println(mm.getName()+"送你巧克力");
        }
    }
    

     代理对象,调用被代理对象的操作,并且可以提供增强的操作 

    /**
     * @ Author     :fonxi
     * @ Date       :2019/5/13 5:12
     * @ Description:代理类
     */
    public class Proxy implements GiveGift{
        Pursuit pursuit;
    
        public Proxy(SchoolGirl mm){
            pursuit = new Pursuit(mm);
        }
    
        @Override
        public void giveDolls() { pursuit.giveDolls();
        }
    
        @Override
        public void giveFlowers() { pursuit.giveFlowers();
        }
    
        @Override
        public void giveChocolate() {
            pursuit.giveChocolate();
        }
    
        //代理对象新增的操作
        public void giveBook(){
            System.out.println("送书");
        }
    }
    

      

    /**
     * @ Author     :fonxi
     * @ Date       :2019/5/13 5:15
     * @ Description:客户端调用类
     */
    public class TestController {
        public void print(){
            SchoolGirl mm = new SchoolGirl();
            mm.setName("李娇娇");
    
            Proxy proxy = new Proxy(mm);
            proxy.giveDolls();
            proxy.giveChocolate();
            proxy.giveFlowers();
            proxy.giveBook();
        }
    }
    

      


    • 总结

    代理模式可以让具体的操作对象被隐藏,并且可以在不修改操作对象的情况下扩展它的功能。

  • 相关阅读:
    sed command
    【Python3】作用域(局部变量、全局变量)
    【Python3】函数与参数
    【Python3】编程范式
    【Python3】字符解码与编码
    【Python3】文件操作
    【Python3】集合
    【Python3】目录
    【Python3】字典
    【Python3】字符串操作
  • 原文地址:https://www.cnblogs.com/fonxi/p/10859992.html
Copyright © 2011-2022 走看看