静态代理和装饰者模式的区别

静态代理是一种编译期增强,还没运行就已经知道增强的目标对象。

装饰者是运行时增强,只有运行时才知道具体增强的目标。

  • Code show time

  静态代理:

package com.zjt.test;

interface Duck {
    void swim();
}

class DuckImpl implements Duck{
    @Override
    public void swim() {
        System.out.println("小鸭子会游泳");
    }
}

class ProxyDuck implements Duck{
    Duck duck;   //一个空的构造函数,且代理类中明确声明需要代理的目标对象
    public ProxyDuck(){
        this.duck=new DuckImpl();
    }

    @Override
    public void swim() {
        System.out.println("噶嘎嘎。。。");
        duck.swim();
    }
}

class Test{
    public static void main(String[] args) {
        Duck duck = new ProxyDuck();
        duck.swim();
    }
}

  装饰者模式:

package com.zjt.test;

public interface Duck {
    void swim();
}
class DuckImpl implements Duck{

    @Override
    public void swim() {
        System.out.println("swim....");
    }
}

class Director implements Duck{
    Duck duck;
    //编译期不知道具体的目标对象,只有运行期调用者手动传入才知道
    public Director(Duck duck){
      this.duck=duck;
    }

    @Override
    public void swim() {
        System.out.println("gagaga.....1");
        duck.swim();
        System.out.println("gagaga.....2");
    }
}

class Test{
    public static void main(String[] args) {
        Duck duck = new Director(new DuckImpl());
        duck.swim();
    }
}

  

原文地址:https://www.cnblogs.com/zjting/p/12547092.html

时间: 2024-11-09 00:12:30

静态代理和装饰者模式的区别的相关文章

代理模式与装饰器模式的区别

代理模式与装饰器模式的区别,主要大于,从使用者(客户端)的角度来看的: //装饰器的客户public class Client{ public static void main(String[] args){ //客户指定了装饰者需要装饰的是哪一个类 Component component = new Decorator(new ConcreteComponent()); - }}//代理的客户public class Client{ public static void main(String

Java 代理模式和装饰者模式的区别

装饰模式:以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案:代理模式:给一个对象提供一个代理对象,并有代理对象来控制对原有对象的引用: 装饰模式应该为所装饰的对象增强功能:代理模式对代理的对象施加控制,并不提供对象本身的增强功能 二者的实现机制确实是一样的,可以看到他们的实例代码重复是很多的.但就语义上说,这两者的功能是相反的,模式的一个重要作用是简化其他程序员对你程序的理解, 你在一个地方写装饰,大家就知道这是在增加功能,你写代理,大家就知道是在限制, 虽然代码很可能相同,但如果你

设计模式回顾:策略模式、代理模式、装饰者模式的区别

前言 设计模式有很多,但设计模式的目的是一致的,都是为了提升代码的可读性和可扩展性.设计模式都遵循一些基本的原则,设计模式是为了遵循这些原则而创造的工具. - 单一职责原则:就一个类而言,应该仅有一个引起它变化的原因.这一点是说,如果有一些类过于臃肿,承担了过多的职责,就应当分解他. - 开放-封闭原则:软件实体(类.模块.函数等)应该可以扩展,但是不可修改.这一点是说,拒绝硬编码,拒绝直接修改原有代码. - 依赖倒转原则:高层模块不应该以来低层模块.两个都应该以来抽象.抽象不应该依赖细节.细节

适配器模式和装饰者模式的区别

适配器模式将一个类的接口,转化成客户期望的另一个接口,适配器让原本接口不兼容的类可以合作无间. 装饰者模式:动态的将责任附加到对象上(因为利用组合而不是继承来实现,而组合是可以在运行时进行随机组合的).若要扩展功能,装饰者提供了比继承更富有弹性的替代方案(同样地,通过组合可以很好的避免类暴涨,也规避了继承中的子类必须无条件继承父类所有属性的弊端). 特点: 1. 装饰者和被装饰者拥有相同的超类型(可能是抽象类也可能是接口) 2. 可以用多个装饰类来包装一个对象,装饰类可以包装装饰类或被装饰对象

外观模式的介绍以及与适配器模式和装饰者模式的区别

外观模式 定义:提供了一个统一的接口,用来访问子系统中的一群接口,外观定义了一个高层接口,让子系统更容易使用. 举例:我需要打开微信发送给某个好友某些内容,其中的过程包括了,下载微信,输入账号密码,点击登陆,找到好友,发送消息.这些整体封装成了一个对外的方法,当我调用需要这个流程的时候,我通过一个方法的调用,直接就能实现全部的流程,不需要在请求方,去组合方法去完成这个操作. 设计原则:莫忒耳原则又称最少知识原则,只和你的密友谈话,通过"举例",可以明白这个原则的定义. 原则缺点:采用这

java代理模式与装饰者模式

静态代理和装饰者模式的区别: 先来看一下装饰者模式的定义:装饰者模式动态地将责任附加到对象上.若要扩展功能,装饰者提供了比继承更有弹性的替代方案. 总结一下采用装饰者模式是为了增强或拓展原对象的功能. 而静态代理除了能够提供功能增强外(AOP增加日志监控等,但不提供原对象本身的增强功能)还通常起到了控制访问的作用. 另外装饰者模式适用于递归组合. 看见百度静态代理和装饰者模式的区别出来前几个博客实在是无力吐槽,连装饰者模式其实就是动态代理模式都有人说的出来.. 相关连接: https://sta

装饰器模式和代理模式区别

代理模式和装饰者模式上在语法形式上几乎完全一样,那么它们的区别在哪里呢? 装饰者模式:动态地给一个对象添加一些额外的职责.就增加功能来说,装饰模式相比生成子类更加灵活 代理模式:为其它对象提供一种代理以控制对这个对象的访问. 其实,它们的着重点一个在于“增加”职责,另一个在于“控制”访问.这是它们最本质的区别.

装饰者模式,适配器模式,代理模式区别

装饰者模式的关注点在于添加功能 代理模式的关注点在于控制对象的访问,其原型对象对于用户无法得知 适配器模式关注点在于适配,从定义上看装饰模式是对核心对象或者功能的扩展,适配器模式是把对象或者功能放到一个新对象中引用.举个例子,现在书城卖道德经的书,有线装版,有精装版,有日文版,有英文版,其中线装版和精装版就是装饰模式,日文版和英文版就是适配器模式,各种版本都是为迎合不同消费者的不同需求.为什么呢?因为线装版和精装版的道德经虽然包装不同,但内容相同,日文版和英文版就不同,这两个版本的内容就可能和原

装饰器模式与代理模式比较

当有这样的业务需求的时候——要为写好的代码在目标代码之前或者之后添加部分操作时,此时最笨的方法就是直接在目标代码的前后加上我们需要的功能代码,但是这样违背了java封装的特性.更好一点的方法就是使用设计模式——代理模式,然而,装饰器模式也有同类的功能,那么着两种设计模式到底有什么区别呢?下面就分别来学习一下这两种设计模式. 装饰器模式类图如下: 该类图包括几个部分:一个接口(装饰器与需要被装饰的实体类都需要实现该接口,公用方法在该接口中定义),一个实现类,一个装饰器的接口,具体实现的装饰器. 在