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

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

  • 装饰者模式(Decorator)
    先来看类图:
    Java编程开发设计模式之--装饰者模式(Decorator)与代理模式(Proxy)_第1张图片

装修接口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)
    代理模式就是多一个代理类出来,替原对象进行一些操作,并进行必要的前期与后期操作。类图如下:
    Java编程开发设计模式之--装饰者模式(Decorator)与代理模式(Proxy)_第2张图片

先创建一个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)可以对它的客户隐藏原始对象的具体信息(这就像房产中介不想让房东与购买者直接联系,为了防止跳单)。因此,当使用代理模式的时候,我们常常在一个代理类中自己创建一个原始类的实例。并且,当我们使用装饰器模式的时候,我们通常的做法是将原始对象作为一个参数传给装饰者的构造器。

你可能感兴趣的:(JAVA)