必威体育Betway必威体育官网
当前位置:首页 > IT技术

Java学习-设计模式-装饰器模式和代理模式的区别

时间:2019-10-11 05:42:09来源:IT技术作者:seo实验室小编阅读:75次「手机版」
 

代理器

java学习-设计模式-装饰器模式和代理模式的区别

区别:

**装饰器模式: ** 关注于在一个对象上动态的添加方法。当我们使用装饰器模 式的时候,我们通常的做法是将原始对象作为一个参数传给装饰者的构造器。

**代理模式: ** 关注于控制对对象的访问。用代理模式,代理类(proxy class)可以对它的客户隐藏一个对象的具体信息。因此,当使用代理模式的时候,我们常常在一个代理类中创建一个对象的实例。

**装饰模式: ** 注重对对象功能的扩展,

它不关心外界如何调用,只注重对对象功能的加强,装饰后还是对象本身。

**代理模式: ** 注重对对象某一功能的流程把控和辅助。它可以控制对象做某些事,偏重因自己无法完成或自己无需关心,需要他人干涉事件流程,更多的是对对象的控制

重心是为了借用对象的功能完成某一流程,而非对象功能如何。

**装饰模式: ** 对被装饰的对象增加额外的职责,满足里氏代换原则(子类可以代替父类)

如:画画,你可以画圆形、画正方形等等,还可以画红色的、画绿色的等等,但是你都是在画画,你想怎么画你就怎么装饰。

**代理模式: ** 对被代理的对象提供访问控制。

如:老师叫你去画一个图形,你这边根据判断调用代理类,去画一个红色的圆形,下一次老师叫你再去画,根据老师的要求你画了一个绿色的正方形。你必须按照要求实现代理的功能。

**举个例子: ** A类是原始功能的类, B是装饰模式中对A类的扩展之后的类, C是代理模式中对A类的扩展

对于用户调用来说:

使用装饰模式, 用户更关系的是B的功能(包含A的原始功能)。

使用代理模式,用户更关心A的功能。并不关系(c的功能)。

**所以:

对于代理类,如何调用对象的某一功能是思考重点,而不需要兼顾对象的所有功能; 对于装饰类,如何扩展对象的某一功能是思考重点,同时也需要兼顾对象的其它功能,因为再怎么装饰,本质也是对象本身,要担负起对象应有的职责。

​ 使用代理模式,代理和真实对象之间的的关系通常在编译时就已经确定了,而装饰者能够在运行时递归地被构造。 **

// 装饰器模式需要指定你要装饰的类,可以叠加装饰
package Practices.Mode.Decorator_Pattern;
// 3. 创建一个装饰类去实现进多种货(逻辑在理解中)
public class Purchase1 implements Fruit_Shop {
    private Fruit_Shop fruitShop;

    // 这里在初始化的时候需要指定你要装饰的类
    public Purchase1(Fruit_Shop fruitShop) {
        this.fruitShop = fruitShop;
    }
	// 选择你想装饰的样子装饰,可以嵌套装饰,用户还是要知道原来的样子,慢慢装饰出想要的样子
    public void Purchase() {
        fruitShop.Purchase();
        System.out.println("进苹果");
    }
}
// 来源于装饰模式练习
// 代理模式在编译的时候就已经确定了要代理的类,不用指定
package Practices.Mode.Proxy_Pattern;

import java.util.Random;

// 3. 创建一个代理类,根据外卖派送员的状态来决定送不送这份外卖
public class Send_Food_people {
    private foods food;

    // 代理类在初始化的时候就已经指定了
    public Send_Food_people() {
        this.food = new food1("鱼香茄子");
    }

    // 代理类主要是根据当前情况实现代理功能,对于用户而言,只要知道代理类就好了
    public void getfood(){
        Status enums[] = Status.values();
        Random random = new Random();
        Status ed = enums[random.nextint(enums.length)];

        if(ed==Status.busy){
            System.out.println("业务繁忙,暂不接单");
        }else{
            food.shopping_foods();
        }
    }
}

// 使用枚举定义外卖派送员的状态
enum Status{
    busy,
    idle;
}

相关阅读

微信小店、拍拍小店、京东微店入驻条件的区别

微店号称“精而简,小而美”是众多电商企业的新宠儿,出现在消费者眼中最多的就是微信小店、拍拍小店、京东微店,今天小编给大家说说三

exit()与_exit()函数的区别

原文地址:http://blog.csdn.net/zz709196484/article/details/54770017 注:exit()就是退出,传入的参数是程序退出时的状态码,0表示

代理服务器(proxy server)简介

看图就明白了, 以qq为例:再来看看:

京东自营店是正品吗?和旗舰店有什么区别?

京东商城和天猫平台一样,是国内首屈一指的电商平台,天猫有各种天猫旗舰店,也有天猫超市,同样,京东商城也有京东旗舰店和自营店。我们今

git 设置 socks5 代理

GitHub提供两种clone方式 Clone with HTTPS: git clone https://github.com/xxx/xxx.git Clone with SSH: git clone git@

分享到:

栏目导航

推荐阅读

热门阅读