今天学习了代理模式。

相对于适配器模式,或者说装饰器模式,代理模式理解起来更加简单。

代理这个词应该比較好理解,取代去做就是代理。

比方,我们买卖房子,那么我们会找中介,我要卖房子,可是我们没有时间去卖,我主动交给中介,中介会帮我公布,会帮我找买家,带买家看房,最后我仅仅要收到钱即可了。

买家的目的:卖房拿钱。。卖加终于的目的就是把房子换成钱。

中介的工作:收集房产信息,公布房产信息,等买家打电话来,带买家看房,买家看中了,付钱给中介,中介办理过户手续,过户成功,抽掉自己的佣金,付钱给卖家。

卖家的目的,给钱,拿房子

卖家也许非常忙,根本没有时间去办这么多的事情。

我们换成工作中的样例。。。。

数据库层,他仅仅负责接收请求的參数,返回数据。它并不真正的去关心数据怎样怎样去处理,返回到展示层是一种什么样的格式,可是展示层又不关心。

正如卖家根本不关心谁来看房子,谁来给我传入钱这个參数,我给谁return 一个房子。

而前台展示层是负责传递參数,他不关心卖家究竟是谁,给钱就要拿到房子。

那么中间那些办证看房的过程究竟谁来做,当然是由房产中介来做。

那如今,我们来实现整个买房的过程。

为了不像之前那么抽象的去理解适配器模式和装饰器模式,这次我们引入參数和返回值。

先定一个卖房子的接口。

public interface Sell {
public String sellHoues(int money);
}

再来座房子把。

public class House {
private String houseHost; public House(String houseHost){
this.houseHost = houseHost;//构造方法传入户主的名字
}
public String getHouseHost() {
return houseHost;
} public void setHouseHost(String houseHost) {
this.houseHost = houseHost;
} }

然后,我们定义一个卖家,这个卖家是没有钱的,他仅仅有房子。。。他如今须要卖房子,所以实现卖房子的接口。对于卖家来说,他所谓的卖房子就是谁给我钱,我就给谁房子,我不去关心房产证过户啊这些东西。

public class Seller implements Sell {
private String name;//卖家的名字
private House house;//卖家的房子
private int money;//卖家的钱 Seller(String name){
this.name = name;
house = new House(name);//实例化一座房子,并传入户主名字
} //卖房子的方法,给我钱,房子就是你的
public House sellHoues(int money){
this.money = this.money+money;
System.out.println("卖家收到钱");
return this.house;
}
}

接着是买家,买家有钱,没房子,所以他有2个方法,付钱,拿房子。

public class Buyer {
private int money;
private House house; public Buyer(){
//买家仅仅有钱没有房子
this.money= 9999;//9999元钱,预计能买1平方
String house="";//没房子
} public void giveMoney(int toPay){
this.money=this.money-toPay;//买家的钱减去价格
System.out.println("买家付钱");
} public void getHouse(House house){
this.house = house;
System.out.println("买家得到房子");
} public int getMoney() {
return money;
} public House getHouse() {
return house;
} }

假设不用代理模式,我们要让让买家直接和卖家,卖家的卖房子肯定须要重写,这肯定是卖家不愿意的,这为浪费卖家极大的时间。就如同我们的项目里,假如一个DAO类是用于对数据库操作的,有些用户也许我们仅仅能提供给他查询的权限,并不提供改动的权限,这时候用代理模式,用一个代理类Proxy来操作这个这个DAO的对象,对于不同的用户提供不同的代理类,这样既不须要改动原先的代码,又能够满足业务的要求。

以下我们用一个中介人来直接和卖家对接

public class Proxy implements Sell  {
Seller seller;
public Proxy(){
this.seller = new Seller("卖家");//中介在出现的时候就应该手里有一个客户,而且这个客户有套房子,否则他的出现没有不论什么意义
}
//卖房子的方法,这种方法主要服务于卖家,给卖家钱,卖家给你房子,可是相对于卖家
@Override
public House sellHoues(int money) {
// TODO Auto-generated method stub
House house = seller.sellHoues(money);//中介从买家那得到房子。。開始进行过户手续
System.out.println("已付钱给卖家,中介拿到房子");
house.setHouseHost("买家");//过户,将房子的名字改为买家的
System.out.println("已经过户成功");
return house;
}
}

最后来測试一下,看看整个买房流程是否成功

public class test {
public static void main(String[] args) {
Sell proxy =new Proxy();
Buyer buyer = new Buyer();
buyer.giveMoney(8888);
House house = proxy.sellHoues(8888);
buyer.getHouse(house);
System.out.println("买家剩余钱:"+buyer.getMoney());
System.out.println("房主姓名:"+buyer.getHouse().getHouseHost());
}
}

输出结果:

好了,又到了大家最讨厌的装B总结时刻:代理模式最显著的特点就是在代理类里已经持有了目标类的对象,所以在外部看来,你根本无需去关心目标类,目标类根本就不曾出现过,最大的优点就是,让别人看到你想让他看到的,就这么简单。代理模式还是秉承了设计的原则,对内关闭改动,对外开放扩展的思路。

事实上写完这些的时候,我突然对代理模式,装饰器模式,适配器模式又再一次混淆了。所以,我准备再写一篇文章分析这3种模式的异同点,让自己好好理解一下这几个模式。

菜鸟版JAVA设计模式—从买房子看代理模式的更多相关文章

  1. java设计模式(一)动态代理模式,JDK与CGLIB分析

    -本想着这个知识点放到Spring Aop说说可能更合适一点,但因为上一篇有所提到就简单分析下,不足之处请多多评论留言,相互学习,有所提高才是关键! 什么是代理模式: 记得有本24种设计模式的书讲到代 ...

  2. 【java设计模式】(3)---代理模式(案例解析)

    设计模式之代理模式 一.概述 1.什么是代理模式? 解释第一遍:代理模式主要由三个元素共同构成: 1)一个接口,接口中的方法是要真正去实现的. 2)被代理类,实现上述接口,这是真正去执行接口中方法的类 ...

  3. Java设计模式(八)Proxy代理模式

    一.场景描述 代理在生活中并不少见,租房子需要找中介,打官司需要找律师,很多事情我们需要找专业人士代理我们做,另一方面,中介和律师也代理了房东.法律程序与我们打交道. 当然,设计模式中的代理与广义的代 ...

  4. java设计模式(10):代理模式(Proxy)

    一,定义:  代理模式(Proxy):为其他对象提供一种代理以控制对这个对象的访问. 二,其类图: 三,分类一:静态代理 1,介绍:也就是需要我们为目标对象编写一个代理对象,在编译期就生成了这个代理对 ...

  5. Java设计模式之(五)——代理模式

    1.什么是代理模式 Provide a surrogate or placeholder for another object to control access to it. Proxy Patte ...

  6. 菜鸟版JAVA设计模式-从抽象与实现说桥接模式

    桥接模式,初学的时候事实上非常不理解为什么要把这个模式命名为桥接模式,脑海里突然联想到.事实上我学习是一件比較痛苦的事情,由于我必需要知道来龙去脉才干学的进去,所以,非常快我就对这个命名产生了兴趣,桥 ...

  7. 菜鸟版JAVA设计模式—外观模式

    外观模式是一种比較easy理解的模式,作用非常easy.就是解耦合. 结构也是非常easy,一个外观类.这个外观类持有非常多的业务类. 再由客户类去调用这个外观类去实现一些列的业务操作... 这个模式 ...

  8. Java设计模式(四) 装饰 代理模式

    (七)装饰 Decorator 装饰是一个对象,以动态地增加一些新功能. 象与被装饰的对象须要实现同一个接口.装饰对象持有被装饰对象的实例. interface DecoratorSourceable ...

  9. 设计模式之第16章-代理模式(Java实现)

    设计模式之第16章-代理模式(Java实现) “现在朋友圈真是太让人蛋疼了啊.”“怎么说?”“一堆代理,各种卖东西的,看着好烦人.”“哎,删了呗.”“都是朋友,哪里好意思删啊.”“这倒也是...哎,迫 ...

随机推荐

  1. 问题在哪?动态菜单条-------Day86

    今天做了一个动态菜单条,先上图片,简单说一下我想实现的效果: 就是以下这个地方,随着鼠标指到哪,它就划到哪,并有一个惯性的幅度,并且滑动距离越远,停住的时候惯性越大,摆动幅度越大,这就是我大概想实现的 ...

  2. 数据库基础学习3-T-SQL语句

    一.语句操作的基本方法 1.选中执行. 2.注释的方法‘--’. 二.数据类型 整数:int,bigint,smallint 小数:float,decimal(长度,精度) 字符:char(n),va ...

  3. BZOJ 2427: [HAOI2010]软件安装( dp )

    软件构成了一些树和一些环, 对于环我们要不不选, 要么选整个环. 跑tarjan缩点后, 新建个root, 往每个入度为0的点(强连通分量) 连边, 然后跑树dp( 01背包 ) ---------- ...

  4. 调试出不来 断点不起作用 调试技巧 MyEclipse进不了调试

    1:今天遇到了web项目调试总是不起作用,后来经人指点才知,当调试的断点仅仅是一个小圆圈时断点是不起作用的,这是可以重启下tomcat服务器再重新访问断点才会起作用,这是你会发现断点的小圆点左下角有个 ...

  5. Oracle单表的简单查询

    Oracle单表的简单查询 查看表结构 desc emp; 查询所有列 Select * from emp; 查找所以部门编号(查指定的列) select deptnofrom emp; 查找编号不同 ...

  6. ios开发问题:添加库和复制其它工程文件编译错误问题

    首先添加库问题: 选择页签Build Phases->Link Binary With Libraries点+添加库 然后command+shift+k清除历史debug的垃圾 复制其它工程文件 ...

  7. ZOJ 3829 Known Notation 乱搞

    乱搞: 1.数字的个数要比*的个数多一个,假设数字不足须要先把数字补满 2.最优的结构应该是数字都在左边,*都在右边 3.从左往右扫一遍,遇到数字+1,遇到*-1,假设当前值<1则把这个*和最后 ...

  8. Android圆环形颜色选择器:HoloColorPicker

    HoloColorPicker实现圆环形颜色选择器,可以改变颜色饱和度来选择颜色.选择颜色时,可以用手指沿着圆环滑动一个滑块,从而选择颜色. 添加以下XML至你的布局中: ? 1 2 3 4 < ...

  9. encode_json 会对给定的Perl的数据结构转换为一个UTF-8 encoded, binary string.

    use JSON qw/encode_json decode_json/ ; use Encode; my $data = [ { 'name' => 'Ken' , 'age' => 1 ...

  10. 基于visual Studio2013解决C语言竞赛题之1019填数

         题目 解决代码及点评 /* 19. 找3个数字,填在下面式子中,使等式成立. _6325 = 6325_ × ____ (等号左边是五位) 1,若答案有多个,则打印一组即 ...