zoukankan      html  css  js  c++  java
  • 代理模式Proxy

    需求:

    小明帮小张送礼物给娇娇。

    代码编写:

    package com.t_11;
    
    import org.junit.Test;
    
    /**
     *  代理模式
     * @author Administrator
     *    故事情节:
     *    小张请小明帮忙追小娇
     */
    public class t1 {
        @Test
        public void fun(){
            XiaoZhang xiaozhang=new XiaoZhang();
            xiaozhang.giveFlower();
            xiaozhang.giveMilk();
            xiaozhang.getChocolate();
        }
        @Test
        public void fun2(){
            XiaoMing xiaozhang=new XiaoMing();
            xiaozhang.giveFlower();
            xiaozhang.giveMilk();
            xiaozhang.getChocolate();
        }
        @Test
        public void fun3(){
            XiaoMing1 xiaoming=new XiaoMing1("娇娇");
            xiaoming.getChocolate();
            xiaoming.giveFlower();
            xiaoming.giveMilk();
        }
    }
    class XiaoZhang{
        public void giveFlower(){
            System.out.println("小娇,花");
        }
        public void getChocolate(){
            System.out.println("小娇,巧克力");
        }
        public void giveMilk(){
            System.out.println("小娇,牛奶");
        }
    }
    /*前面那是小张直接追求的小娇,也就没有代理这一说法,实际上,小张与小娇是不认识的*/
    class XiaoMing{
        public void giveFlower(){
            System.out.println("小娇,花");
        }
        public void getChocolate(){
            System.out.println("小娇,巧克力");
        }
        public void giveMilk(){
            System.out.println("小娇,牛奶");
        }
    }
    /*第二次忽视了小张的存在,也不应该是这样的,应该是小明帮小张送花,本质是小张的行为,而且,小张应该不认识小娇,所以不能直接给名字。*/
    abstract class Gift{
        public abstract void giveFlower();
        public abstract void getChocolate();
        public abstract void giveMilk();
    }
    class XiaoZhang1 extends Gift{
        private String name;
        public XiaoZhang1(String name){this.name=name;}
        @Override
        public void giveFlower() {
            System.out.println(name+",花");
        }
    
        @Override
        public void getChocolate() {
            System.out.println(name+",巧克力");
        }
    
        @Override
        public void giveMilk() {
            System.out.println(name+",牛奶");
        }
        
    }
    class XiaoMing1 extends Gift{
        private XiaoZhang1 xiaozhang1;
        public XiaoMing1(String girlName){
            xiaozhang1=new XiaoZhang1(girlName);
        }
        @Override
        public void giveFlower() {
            xiaozhang1.giveFlower();
        }
    
        @Override
        public void getChocolate() {
            xiaozhang1.getChocolate();
        }
    
        @Override
        public void giveMilk() {
            xiaozhang1.giveMilk();
        }
        
    }
    /*
     * 第三次使用的是代理模式,代理对象内部构成了一个原对象,然后使用原对象的方法完成指定操作。与装饰者模式类似,不同的是传入的只是构造原对象的重要组件,而不是原对象,而且不存在增强。
     * */

    代理模式图解:

    实际操作:

    让代理类和实际操作类实现同一个接口。代理类中包含一个实际类对象,在创建代理类对象的时候隐式创建实际类对象,然后调用代理类的方法本质上都是调用是实际类对象的对应方法。

    与装饰者模式类似。

  • 相关阅读:
    Spring -- spring 和 hibernate 整合
    文件:一个任务
    文件:因为懂你,所以永恒
    集合:在我的世界里,你就是唯一
    总结回顾
    快速排序的优化
    快速排序
    归并排序(迭代实现)- 数据结构和算法95
    归并排序(递归实现)- 数据结构和算法94
    堆排序的代码实现
  • 原文地址:https://www.cnblogs.com/aigeileshei/p/6021821.html
Copyright © 2011-2022 走看看