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

      


    • 总结

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

  • 相关阅读:
    Open source cryptocurrency exchange
    Salted Password Hashing
    95. Unique Binary Search Trees II
    714. Best Time to Buy and Sell Stock with Transaction Fee
    680. Valid Palindrome II
    Java compiler level does not match the version of the installed Java project facet.
    eclipse自动编译
    Exception in thread "main" java.lang.StackOverflowError(栈溢出)
    博客背景美化——动态雪花飘落
    java九九乘法表
  • 原文地址:https://www.cnblogs.com/fonxi/p/10859992.html
Copyright © 2011-2022 走看看