• 菜鸟版JAVA设计模式—从买房子看代理模式


    今天学习了代理模式。

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

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

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

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

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

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


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

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

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

    正如卖家根本不关心谁来看房子,谁来给我传入钱这个參数,我给谁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种模式的异同点,让自己好好理解一下这几个模式。

  • 相关阅读:
    charles的完整使用
    优雅重启uwsgi的配置
    mysql数据库,创建只读用户
    无线技术
    Selenium
    Hexo博客美化之蝴蝶(butterfly)主题魔改
    什么是Hexo博客
    java实现链表反转
    你不知道的Java引用
    Jquery判断数组中是否包含某个元素$.inArray()
  • 原文地址:https://www.cnblogs.com/blfshiye/p/4299527.html
Copyright © 2020-2023  润新知