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();
        }
        
    }
    /*
     * 第三次使用的是代理模式,代理对象内部构成了一个原对象,然后使用原对象的方法完成指定操作。与装饰者模式类似,不同的是传入的只是构造原对象的重要组件,而不是原对象,而且不存在增强。
     * */

    代理模式图解:

    实际操作:

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

    与装饰者模式类似。

  • 相关阅读:
    【FROM】java控件重绘AWT/SWINGPainting in AWT and Swing (EN)
    linux yum使用管理详细使用
    远程控制 vc++实现
    java 鼠标事件Dragged和Moved 及java显示GIF在JLabel、JButton
    C语言字符串函数大全
    C# 训练场(四)创建系统热键,并向活动窗口输入信息
    潜移默化学会WPF(样式) DataGrid(转载)
    时间查询
    Sqlserver2012 根据数据库mdf文件生成log文件,解决无法附加mdf文件
    我知道的一些 ”运行“ 窗体下的命令,个人使用
  • 原文地址:https://www.cnblogs.com/aigeileshei/p/6021821.html
Copyright © 2011-2022 走看看