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

61 篇文章 0 订阅
48 篇文章 1 订阅

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;
}
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值