装饰者模式(附与代理模式的区别,乍看挺像)

原创 2016年05月31日 22:49:10

一.装饰模式介绍

装饰模式也称为包装模式,结构设计模式之一,就像房子一个,房子盖好都是毛坯房,但是装修之后,有简单装修,精装修,豪华装修,各有不同,这个就可以理解为装饰模式,不管你怎么装修,最开始都是毛坯房,或者一个人每天穿不同的衣服(装饰),但是本质还是同一个人没有发生改变

 

二.装饰模式的定义

动态的给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类而言更加简单

 

三.装饰模式的使用场景

需要透明并且动态的扩展类的功能时。

 

四.简单实现

//Component.java

public abstract class Component {
    /**
     * 抽象的方法
     * */
    public abstract void operate();
}


//ConcreteComponent.java

public class ConcreteComponent extends  Component {
    @Override
    public void operate() {
        System.out.println("xcqw 我是小明");
    }
}

//Decorator.java

public abstract class Decorator extends Component {
    private Component component;//持有一个Component对象的引用

    /**
     * 必要的构造方法  需要一个Component类型的对象
     * */
    public Decorator(Component component) {
        this.component = component;
    }

    @Override
    public void operate() {
        component.operate();
    }
}


//ConcreteDecoratorA.java
public class ConcreteDecoratorA extends Decorator {
    /**
     * 必要的构造方法  需要一个Component类型的对象
     *
     * @param component
     */
    public ConcreteDecoratorA(Component component) {
        super(component);
    }

    @Override
    public void operate() {
        //装饰方法A和B  (也就是带了个帽子 ,穿了双跑鞋)
        super.operate();
    }

    public void operateA(){
        //装饰方法逻辑
        System.out.println("我戴了帽子");
    }

    public void operateB(){
        //装饰方法逻辑
        System.out.println("我穿了双跑鞋");
    }
}


 //ConcreteDecoratorB

public class ConcreteDecoratorB extends Decorator {
    /**
     * 必要的构造方法  需要一个Component类型的对象
     *
     * @param component
     */
    public ConcreteDecoratorB(Component component) {
        super(component);
    }

    @Override
    public void operate() {
        //装饰方法A和B  (也就是带了个大金链子 ,穿了木屐)
        super.operate();
    }

    public void operateA(){
        //装饰方法逻辑
        System.out.println("我带了个大金链子");
    }

    public void operateB(){
        //装饰方法逻辑
        System.out.println("我穿了木屐");
    }
}

//MainActivity.java

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //构造被装饰的组件对象
        Component component = new ConcreteComponent();

        //根据组件对象构造装饰者对象A并调用,此时相当于给组件对象增加装饰者A的方法
        Decorator decoratorA = new ConcreteDecoratorA(component);
        decoratorA.operate();

        //根据组件对象构造装饰者对象B并调用,此时相当于给组件对象增加装饰者B的方法
        Decorator decoratorB = new ConcreteDecoratorB(component);
        decoratorB.operate();


    }
}

 

结果可以看到  一个是戴帽子穿跑鞋的小明,一个则是代金链子,穿木屐的小明,着装风格不一样,但是都是小明

 

Component:抽象组件

可以是一个接口或者抽象类,其充当的就是被装饰的原始对象

 

ConcreteComponent:组件具体实现类

该类是Component类的基本实现,也就是我们装饰的具体对象(也就是小明

 

Decorator:抽象装饰者

装饰我们的组件对象,其内部一定要有一个指向组件对象的引用。

 

ConcreteDecorateA:装饰着具体实现类

只是对抽象装饰着作出具体的实现(具体扩展的方法,精装修还是豪华装修

 

ConcreteDecorateB:装饰着具体实现类

只是对抽象装饰着作出具体的实现(具体扩展的方法,精装修还是豪华装修

 

Client :客户类

 

 

五.Android源码中的模式实现



在Android中常用的Context就使用了装饰者模式,看图就很清晰了




六.跟代理模式的区别

一句话,装饰者模式是增强对象功能(穿不同的衣服),代理模式是控制代理的对象,但不对其做功能增加

代理模式与装饰模式的异同

代理模式和装饰模式有很大的相似之处,看代理模式的类图,可以看做是代理模式的类图,也可以看做是装饰模式的类图,因为他们之间太像了,像到什么程度?把实现的代码改一下就是装饰模式,改回来就是代理模式。 ...
  • hitprince
  • hitprince
  • 2011年09月20日 18:22
  • 18257

菜鸟版JAVA设计模式—适配器模式,装饰模式,代理模式异同

节前把3个设计模式的学习心得分享了一下,分别是适配器模式,装饰模式,代理模式。 但是似乎越写越有些迷糊,这三种模式都有着一些大同小异的地方,总是有些搞不清。 今天再重新学习下,把学习心得分享给大家一下...
  • lulei9876
  • lulei9876
  • 2014年10月14日 10:55
  • 12063

代理模式和装饰模式的差别

学了代理模式之后发现代理模式和装饰模式非常的相似,代理类和被代理的客户实现同一个接口,装饰者和被装饰者也是实现的同一个接口,实现方式也类似。搜索之,得到结论:代理模式主要是控制对某个特定对象访问,而装...
  • chenchaofuck1
  • chenchaofuck1
  • 2016年03月31日 21:51
  • 1097

[jvm解析系列][十四]动态代理和装饰模式,带你看源码深入理解装饰模式和动态代理的区别。

不知道大家知不知道设计模式中有一种叫做装饰,举一个简单的例子。 一天一个年轻领导小王讲话:咳咳,我们一定要xxx抓紧xxxx学习xxx的精神!好,今天的会议结束! 然后有一个老领导李同志接过来说:...
  • u014629433
  • u014629433
  • 2016年06月16日 19:26
  • 1156

java设计模式之装饰模式代理模式区别

初次看装饰模式的时候首先想到了上节讲的代理模式,代理模式与装饰者模式看起来很像,都实现基础对象实现的接口,在其自身对象中都保存着对被代理/被装饰者的对象引用。 各用一句话描述两个模式应该是这样的: 装...
  • crazy_meng
  • crazy_meng
  • 2016年04月13日 15:33
  • 1392

设计模式之装饰模式和代理模式区别与联系

一.你在一个地方写装饰,大家就知道这是在增加功能,你写代理,大家就知道是在限制      1.最常见的代理就是权限判断了,权限就肯定是限制了      2.装饰模式是指增强被包装对象的功能   ...
  • sky_100
  • sky_100
  • 2016年09月13日 17:32
  • 10095

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

之前了解过“代理模式”,最经典的例子就是“房屋中介”,房东是被代理对象(也称为真实对象),中介公司是代理对象,共同实现同一个接口,而租房子的家伙就是客户端调用者。租房狗调用一个租房接口,实现自己的租房...
  • DavidPeterMan
  • DavidPeterMan
  • 2016年09月11日 11:02
  • 163

装饰模式(Decorator)与代理模式(Proxy)的区别与联系

学习AOP时,教材上面都说使用的是动态代理,可是在印象中代理模式一直都是控制访问什么的,怎么又动态增加行为了,动态增加行为不是装饰器模式吗?于是 找了很多资料,想弄清楚这两者之间到底有什么区别。结果发...
  • small_june
  • small_june
  • 2014年06月05日 15:38
  • 929

设计模式--装饰者模式与代理模式

这次主要总结下装饰着模式和代理模式,这两个一起进行总结,主要是因为两个设计模式特别的类似。先依次说一下两个设计模式,然后再说下两个模式的不同。...
  • u013159433
  • u013159433
  • 2016年05月25日 17:11
  • 846

继承,装饰者模式和动态代理之间的区别

* 继承 被增强的对象固定的 增强的内容也是固定的 * 装饰者模式 被增强的对象是可以切换的 增强的内容是固定的 还有一种更加灵活的方式,面向切面编程(AOP) ,比装饰者模式更加灵...
  • qq_32101859
  • qq_32101859
  • 2016年02月24日 21:14
  • 2486
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:装饰者模式(附与代理模式的区别,乍看挺像)
举报原因:
原因补充:

(最多只允许输入30个字)