1. Java之代理模式(Proxy Pattern)

(1)概述:

代理模式的作用是:为其他对象提供一种代理以控制对这个对象的访问。

在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。

2. 应用场景:

(1)简介:

      例如:假设有一组对象都实现同一个接口,实现同样的方法,但这组对象中有一部分对象需要有单独的方法,传统的笨办法是在每一个应用端都加上这个单独的方法,但是代码重用性低,耦合性高。
如果用代理的方法则很好的解决了这个问题。
 
      比如在玩“极品飞车”这款游戏,如果游戏者手中的金钱达到了一定的数量就可以到车店买一部性能更高的赛车,那么这个卖车的“车店”就是一个典型的“汽车厂家”的“代理”,他为汽车厂家“提供卖车的服务”给有需求的人士。从面向对象的方面考虑,“销售汽车的代理”也是一个对象,那么这个对象也具有一定的状态,在软件项目中这个对象也具有管理财务进销存的基本功能,那么在设计时就要以面向OOP编程的思想来考虑软件的类结构,这个销售汽车的代理也是一个类了。
 
(2)代理模式UML图:
 
 

 • 抽象对象角色:声明真实对象和代理对象的共同接口。

 • 代理对象角色代理对象角色内部含有对真实对象的引用,从而可以操作真实对象,同时代理对象提供与真实对象相同的接口以便在任何时刻都能够代替真实对象。同时,代理对象可以在执行真实对象操作时,附加其他的操作,相当于对真实对象进行封装。

 • 真实对象角色代理角色所代表的真实对象,是我们最终要引用的对象。

2. 应用场景代码:

(1)定义一个抽象对象角色,定义公共接口buy_car,如下:

  1. /**
  2. *
  3. *抽象对象角色(公共接口)
  4. */
  5. public interface buy_car {
  6. public void buy_mycar();
  7. }

(2)定义一个真实对象角色,这个真实对象角色实现了上面的公共接口,如下:

新建一个people人类,具有买车的行为,所以实现接口buy_car

  1. /**
  2. *真实对象角色,它实现公共接口
  3. */
  4. class people implements buy_car {
  5. private int cash;
  6. private String vip;
  7. private String username;
  8. @Override
  9. public void buy_mycar() {
  10. // TODO Auto-generated method stub
  11. System.out.print(username+"是vip 客户,可以直接购买新车!");
  12. }
  13. public int getCash(){
  14. return cash;
  15. }
  16. public void setCash(int cash){
  17. this.cash = cash;
  18. }
  19. public String getUsername(){
  20. return username;
  21. }
  22. public void setUsername(String username){
  23. this.username = username;
  24. }
  25. public String getVip(){
  26. return vip;
  27. }
  28. public void setVip(String vip){
  29. this.vip = vip;
  30. }
  31. }

(3)定义一个代理对象角色,如下:

people类不能拥有车,必须经过proxy代理类的认证,符合条件之后才可以拥有车辆,新建一个代理,这个代理类来考察当前的people是否有资格进行买车:

  1. /**
  2. *代理对象角色
  3. */
  4. class proxyclass implements buy_car {
  5. private people people;
  6. public people getPeople(){
  7. return people;
  8. }
  9. public void setPeople(people people){
  10. this.people = people;
  11. }
  12. @Override
  13. public void buy_mycar() {
  14. // TODO Auto-generated method stub
  15. if (people.getVip() == "vip"){
  16. people.buy_mycar();
  17. return ;
  18. }
  19. if(people.getCash()>=50000){
  20. System.out.println(people.getUsername()+"买了新车,交易结束!");
  21. }
  22. else
  23. {
  24. System.out.println(people.getUsername()+"钱不够,不能买车,继续比赛!");
  25. }
  26. }
  27. }

(4)最后一个客户端测试类,如下:

最后创建一个客户端,用来模拟买车的行为:

  1. public class run_main {
  2. public static void main(String[] args) {
  3. // TODO Auto-generated method stub
  4. people people_1 =new people();
  5. people_1.setCash(60000);
  6. people_1.setUsername("jeck");
  7. people people_2 =new people();
  8. people_2.setCash(40000);
  9. people_2.setUsername("rose");
  10. people people_3 =new people();
  11. people_3.setCash(0);
  12. people_3.setUsername("tom");
  13. people_3.setVip("vip");
  14. proxyclass proxy_buy = new proxyclass();
  15. proxy_buy.setPeople(people_1);
  16. proxy_buy.buy_mycar();
  17. proxy_buy.setPeople(people_2);
  18. proxy_buy.buy_mycar();
  19. proxy_buy.setPeople(people_3);
  20. proxy_buy.buy_mycar();
  21. }
  22. }

程序运行结果如下:

  1. jeck买了新车,交易结束!
  2. rose钱不够,不能买车,继续比赛!
  3. tomvip 客户,可以直接购买新车!

代理模式主要使用了java的多态,干活的是被代理类,代理类主要是接活,你让我干活,好,我交给幕后的类去干,你满意就成,那怎么知道被代理类能不能干呢?同根就成,大家知根知底,你能做啥,我能做啥都清楚得很,同样一个接口。

Java设计模式11:常用设计模式之代理模式(结构型模式)的更多相关文章

  1. 设计模式之美:Structural Patterns(结构型模式)

    结构型模式涉及到如何组合类和对象以获得更大的结构. 结构型类模式采用继承机制来组合接口实现. 结构型对象模式不是对接口和实现进行组合,而是描述了如何对一些对象进行组合,从而实现新功能的一些方法. 因为 ...

  2. 设计模式(十二): Flyweight享元模式 -- 结构型模式

    说明: 相对于其它模式,Flyweight模式在PHP实现似乎没有太大的意义,因为PHP的生命周期就在一个请求,请求执行完了,php占用的资源都被释放.我们只是为了学习而简单做了介绍. 1. 概述 面 ...

  3. 代理模式/proxy模式/结构型模式

    代理模式proxy 定义 为其他对象提供一种代理,并以控制对这个对象的访问.最简单的理解,买东西都是要去商店的,不会去工厂. java实现三要素 proxy(代理)+subject(接口)+realS ...

  4. 设计模式(十三): Proxy代理模式 -- 结构型模式

      设计模式(十一)代理模式Proxy(结构型) 1.概述 因为某个对象消耗太多资源,而且你的代码并不是每个逻辑路径都需要此对象, 你曾有过延迟创建对象的想法吗 ( if和else就是不同的两条逻辑路 ...

  5. 设计模式学习之路——Facade 外观模式(结构型模式)

    动机: 组件的客户和组件中各种复杂的子系统有了过多的耦合,随着外部客户程序和各子系统的演化,这种过多的耦合面临很多变化的挑战.如何简化外部客户程序和系统间的交互接口?如何将外部客户程序的演化和内部子系 ...

  6. 设计模式(十):Decorator装饰者模式 -- 结构型模式

    1. 概述 若你从事过面向对象开发,实现给一个类或对象增加行为,使用继承机制,这是所有面向对象语言的一个基本特性.如果已经存在的一个类缺少某些方法,或者须要给方法添加更多的功能(魅力),你也许会仅仅继 ...

  7. 设计模式(十一):FACADE外观模式 -- 结构型模式

    1. 概述 外观模式,我们通过外观的包装,使应用程序只能看到外观对象,而不会看到具体的细节对象,这样无疑会降低应用程序的复杂度,并且提高了程序的可维护性.例子1:一个电源总开关可以控制四盏灯.一个风扇 ...

  8. 设计模式(七):Adapter 适配器模式 -- 结构型模式

    1. 概述: 接口的改变,是一个需要程序员们必须(虽然很不情愿)接受和处理的普遍问题.程序提供者们修改他们的代码;系统库被修正;各种程序语言以及相关库的发展和进化.  例子1:iphone4,你即可以 ...

  9. 设计模式(八):Bridge桥接模式 -- 结构型模式

    1. 概述 在软件系统中,某些类型由于自身的逻辑,它具有两个或多个维度的变化,那么如何应对这种“多维度的变化”?如何利用面向对象的技术来使得该类型能够轻松的沿着多个方向进行变化,而又不引入额外的复杂度 ...

  10. 设计模式学习之适配器模式(Adapter,结构型模式)(14)

    参考链接:http://www.cnblogs.com/zhili/p/AdapterPattern.html一.定义:将一个类的接口转换成客户希望的另一个接口.Adapter模式使得原本由于接口不兼 ...

随机推荐

  1. 《锋利的Jquery第二版》读书笔记 第一章

    按照书本介绍顺序整理jquery库相关的语法.要点. window.onload与$(document).ready()功能类似,前者需要所有资源加载完毕,且不能同时编写多个:后者加载完DOM结构即执 ...

  2. RabbitMQ (四) 路由选择 (Routing) -摘自网络

    本篇博客我们准备给日志系统添加新的特性,让日志接收者能够订阅部分消息.例如,我们可以仅仅将致命的错误写入日志文件,然而仍然在控制面板上打印出所有的其他类型的日志消息. 1.绑定(Bindings) 在 ...

  3. 第二百六十三天 how can I 坚持

    今天解脱了,放下了,小罗娜,不给力,话说下一步该咋办呢. 鱼不想过双十一自杀了.这都二十二号了,好快. 该把给罗娜说的那些话保存下来.可惜已经删了. 不知道做的对不对,反正就是没缘分,就这样吧. 睡觉 ...

  4. Hibernate之基于主键映射的一对一关联关系

    1. 基于主键的映射策略:指一端的主键生成器使用foreign策略,表明根据"对方"的主键来生成自己的主键,自己并不能独立生成主键.并用<param> 子元素指定使用当 ...

  5. UOJ Test Round #2

    昨天晚上打的这个比赛,简直一颗赛艇啊-- 感觉发挥的并不好.比赛的时候比较紧张,最后一题还脑残写了个离散化结果爆零了,哎我怎么这么逗逼-- 讲讲比赛经过吧. 比赛之前逗逼地以为是8:00开始,然后淡定 ...

  6. C#多线程(上) 分类: C# 线程 2015-03-09 10:35 174人阅读 评论(0) 收藏

    一.多线程的相关概念 什么是进程? 当一个程序开始运行时,它就是一个进程,进程包括运行中的程序和程序所使用到的内存和系统资源. 而一个进程又是由多个线程所组成的. 什么是线程? 线程是程序中的一个执行 ...

  7. Python3爬取百度百科(配合PHP)

    用PHP写了一个网页,可以获取百度百科词条.源代码已分享至github:https://github.com/1049451037/xiaobaike/tree/master 那么通过Python来爬 ...

  8. Cocos2d-x——支持多触点

    1:在AppController的didFinishLaunchingWithOptions中,加入 [__glView setMultipleTouchEnabled:YES]; 2:在CCLaye ...

  9. .NET下的延迟加载

    在应用中有很多实例可能需要延迟创建对象, 比如设计模式中的单例模式就是一种非常常见的情况.如果不考虑线程安全我们通常会编写如下代码: public class SingleInstance { pri ...

  10. SqlServer获取表结构语句

    --sql server 2005-- 1. 表结构信息查询 -- ================================================================== ...