zoukankan      html  css  js  c++  java
  • Java设计模式之代理模式

    代理模式的定义:为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。
    代理模式:
      人如其名,代理相信大家都可以经常看到什么什么代理,现实中代理太多了。感受最真实的是火车票的代理,经常可以在街上看到,你买票的是在代理商买的,但是付的钱依然会交给铁大哥,这就是代理。现实中的你可能会接触的例子就是叫同学去给你买票,实际上不是你去买,但是是票是你的。这也是代理。
    代理模式组成:
      抽象角色:通过接口或抽象类声明真实角色实现的业务方法。
      代理角色:实现抽象角色,是真实角色的代理,通过真实角色的业务逻辑方法来实现抽象方法,并可以附加自己的操作。
      真实角色:实现抽象角色,定义真实角色所要实现的业务逻辑,供代理角色调用。
    代理的UML图
      
    代理的优点:
      (1).职责清晰 真实的角色就是实现实际的业务逻辑,不用关心其他非本职责的事务,通过后期的代理完成一件完成事务,附带的结果就是编程简洁清晰。叫你去买票,我管你有没有摔跤撒的,不需要关注这种问题。
      (2).代理对象可以在客户端和目标对象之间起到中介的作用,这样起到了中介的作用和保护了目标对象的作用。别人在路上一看,以为是你同学要买票去哪里,实际上买的是你的,保护了你。
      (3).高扩展性 只要符合火车站规定的人,同学都可以去代人买票。
    下面就用代码来实现着一个过程。
     1 package com.roc.prory;
     2 
     3 /**
     4  * 定义一个种类的人 抽象角色
     5  * 
     6  * @author liaowp
     7  * 
     8  */
     9 public interface Person {
    10 
    11     /**
    12      * 可以去火车站买票
    13      */
    14     public void buyTicket();
    15 
    16 }
    package com.roc.prory;
    /**
     * 小王 代理角色
     * @author liaowp
     *
     */
    public class XiaoWang implements Person {
        
        private Person  person = null;//默认就是一个人
        
        public XiaoWang(){//小王比较聪明,知道带别人买票赚钱。默认是只赚小明的钱
            this.person = new XiaoMing();
        }
        
        public XiaoWang(Person per){//赚小明的不够,只要是人就赚。
            this.person = per;
        }
        
        /**
         * 小王也是人,也可以去买票。
         */
        public void buyTicket() {//调不然方法去买票,代理商
            this.person.buyTicket();
        }
    
    }
    package com.roc.prory;
    
    /**
     * 小明 真实角色
     * @author liaowp
     *
     */
    public class XiaoMing implements Person {
    
        //比较懒
        
        /* 
         * 小明也是人,也可以去买票。
         * @see com.roc.prory.Person#buyTicket()
         */
        @Override
        public void buyTicket() {
            System.out.println("买小明的票");
        }
    
    }
    package com.roc.prory;
    /**
     * 小丽
     * @author liaowp
     *
     */
    public class XiaoLi implements Person {
    
        /**
         * 小丽也可以自己买票。
         */
        public void buyTicket() {
            System.out.println("买小丽的票");
        }
    
    }
    package com.roc.prory;
    /**
     * 测试代理模式
     * @author liaowp
     *
     */
    public class Client {
        public static void main(String[] args) {
            XiaoWang xiaoWang = new XiaoWang();//new 的小王
            xiaoWang.buyTicket();//小王去买了小明的票,这就是代理
            
            XiaoLi xiaoLi = new XiaoLi();//买票也要有这个人呀。先把小丽 new 出来。
            XiaoWang mrWang = new XiaoWang(xiaoLi);//小丽说:小王帮我去买个票呗
            mrWang.buyTicket();//屁颠屁颠的跑去买了
        }
    }
    作者:鹏鹏
             
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。如有问题请联系906522957@qq.com
  • 相关阅读:
    【原】 OPenCV学习笔记1:imread()
    windows8下:OpenCV2.2.0 +VS2005/2008/2010
    数组指针和指针数组的区别
    虚函数和纯虚函数 覆盖和隐藏
    C/C++文件之eof()
    【转】 CvArr、Mat、CvMat、IplImage、BYTE转换(总结而来)
    HTML 5是如何流行起来的
    Java程序员要注意的10个问题————————好东西就是要拿来分享
    祈福雅安
    对软件工程的思考
  • 原文地址:https://www.cnblogs.com/liaoweipeng/p/5342214.html
Copyright © 2011-2022 走看看