Java编程开发设计模式之--装饰者模式(Decorator)与代理模式(Proxy)

来源:互联网 发布:淘宝皇冠多少信誉 编辑:程序博客网 时间:2024/05/22 14:34
  • 装饰者模式(Decorator)与代理模式(Proxy)
    装饰者模式(Decorator)是给一个已知对象动态增加一些必要的功能方法,并需保证被装饰对象与装饰者实现的是相同接口,设计思想是装饰者持有一个被装饰对象的实例。举一个现实中的应用场景例子,您买了一套毛坯房,现在想要装修,可对装饰房屋的具体工作无法自己一个人做好,那么你可以将这套房子,托付给房屋装修公司,让其帮您,按照其提供的一整套流程(设计,选材,人工分派,施工,验收,交付等等。。)去装修房子。代理模式(Proxy),核心思路是,创建一个代理类,替原对象完成一些功能操作,比如您有意愿在某城区买一套房子时,可能就会想到去找一个房屋中介,因为您可能对这个地区的房源信息掌握的不多,而中介公司对这方面更熟悉,此处的代理就是这个概念。用功能实现上来看装饰者模式与代理模式很相似,但现实中却分别独立存在,因为它们在某些层面上来说是有分别存在的意义的,它们之间的区别后面会讲到。

  • 装饰者模式(Decorator)
    先来看类图:
    这里写图片描述

装修接口Decoratable :

public interface Decoratable {    public void decorat();}

毛坯房屋类NewHouse实现接口Decoratable :

public class NewHouse implements Decoratable{    @Override    public void decorat() {        System.out.println(String.format("%s.%s called!", this.getClass().getName(), "decorat()"));    }}

装修公司类DecoratCompany 实现接口Decoratable并持有一个NewHouse实例:

public class DecoratCompany implements Decoratable {    private NewHouse newHouse = null;    public DecoratCompany(NewHouse newhouse) {        newHouse = newhouse;    }    @Override    public void decorat() {        if (null != newHouse) {            design();            newHouse.decorat();            deliver();        }    }    private void design() {        System.out.println(String.format("%s.%s called!", this.getClass().getName(), "design()"));    }    private void deliver() {        System.out.println(String.format("%s.%s called!", this.getClass().getName(), "deliver()"));    }}

测试类:

public class WorkClass {    public void test() {        NewHouse newHouse =new NewHouse();        DecoratCompany decoratCompany = new DecoratCompany(newHouse);        decoratCompany.decorat();    }}

输出结果:
I/System.out: com.example.qinghua_liu.myapplication.designpatten.struct.adapt.DecoratCompany.design() called!
I/System.out: com.example.qinghua_liu.myapplication.designpatten.struct.adapt.NewHouse.decorat() called!
I/System.out: com.example.qinghua_liu.myapplication.designpatten.struct.adapt.DecoratCompany.deliver() called!

  • 代理模式(Proxy)
    代理模式就是多一个代理类出来,替原对象进行一些操作,并进行必要的前期与后期操作。类图如下:
    这里写图片描述

先创建一个Purchasable接口

public interface Purchasable {    public void purchase();}

HouseBuyer类实现Purchasable接口:

public class HouseBuyer implements Purchasable {    @Override    public void purchase() {        System.out.println(String.format("%s.%s called!", this.getClass().getName(), "purchase()"));    }}

代理中介类HouseProxy 实现Purchasable接口,并持有一个HouseBuyer 的实例:

public class HouseProxy implements Purchasable {    private HouseBuyer houseBuyer;    public HouseProxy() {        houseBuyer = new HouseBuyer();    }    @Override    public void purchase() {        if (null != houseBuyer) {            search();            houseBuyer.purchase();            transfer();        }    }    private void search() {        System.out.println(String.format("%s.%s called!", this.getClass().getName(), "search()"));    }    private void transfer() {        System.out.println(String.format("%s.%s called!", this.getClass().getName(), "transfer()"));    }}

测试类代码:

public class WorkClass {    public void test() {        HouseProxy houseProxy =new HouseProxy();        houseProxy.purchase();    }}

输出结果:
I/System.out: com.example.qinghua_liu.myapplication.designpatten.struct.adapt.HouseProxy.search() called!
I/System.out: com.example.qinghua_liu.myapplication.designpatten.struct.adapt.HouseBuyer.purchase() called!
I/System.out: com.example.qinghua_liu.myapplication.designpatten.struct.adapt.HouseProxy.transfer() called!
房屋代理中介在购买者购买房屋之前帮忙做了房源搜索,之后做了房产产权迁移等服务行为。

  • 装饰者模式(Decorator)与代理模式(Proxy)的区别
    我们使用上述不论哪一个模式,都可以很容易地在真实对象的方法前面或者后面加上自定义的方法,但装饰器模式关注于在一个对象上动态的添加方法,然而代理模式关注于控制对对象的访问。换句话 说,用代理模式,代理类(proxy class)可以对它的客户隐藏原始对象的具体信息(这就像房产中介不想让房东与购买者直接联系,为了防止跳单)。因此,当使用代理模式的时候,我们常常在一个代理类中自己创建一个原始类的实例。并且,当我们使用装饰器模式的时候,我们通常的做法是将原始对象作为一个参数传给装饰者的构造器。
0 0
原创粉丝点击