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

原创 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就使用了装饰者模式,看图就很清晰了




六.跟代理模式的区别

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

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

IBM.Rational.Rose.Enterprise.v7.0 下载

很多人都在找rational软件,很多都是2003的,有的宣称是2007,但结果还是2003。也许真的不存在Rational.Rose 2007,不过有IBM.Rational.Rose.Enterp...

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

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

常用的几种设计模式

1.单例设计模式singleton——只能产生一个实例化对象的设计模式 (为什么不用静态变量代替呢?因为静态变量在程序一开始就创建了对象,可能会比较消耗资源)public class Singleto...

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

原文链接:http://www.cnblogs.com/onlywujun/archive/2013/03/28/2985887.html 装饰模式:以对客户端透明的方式扩展对象的功能,是继承关...

结合代码分析装饰者模式和代理模式的区别

结合AIDL的代码分析装饰者模式和代理模式的区别

设计模式之代理模式和装饰者模式的区别(java)

为了能让自己写出更优美的代码,最近开始学习设计模式方面的知识。之前只在项目中简单的使用过单例模式和观察者模式,对于其他的几种(据说有23种)设计模式都有些混淆不清。以后一定要把每一种的梳理清楚。   ...

java 设计模式中 装饰者模式 与 代理模式的区别

Java 代理模式和装饰者模式的区别 转自 装饰模式:以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案; 代理模式:给一个对象提供一个代理对象,并有代理对象来控制对原有...

装饰者,适配器,代理和外观模式的区别

装饰者: 封装一个对象,并提供额外的行为,用组合的方式来替代继承以扩展类的功能 适配器:封装一个对象,并提供接口的转换,主要的目的是在不修改已经存在的类的前提下,让他们可以在新的框架...
  • wind19
  • wind19
  • 2012-03-20 14:15
  • 3905

设计模式之代理模式and装饰者模式

注意:本文不讲具体的概念,只是谈谈自己的一些想法。 代理模式分为:静态代理,动态代理(jdk动态代理,cglib动态代理) 静态代理:静态代理就是在开发的时候直接编码到程序中,也就是在编码的时候...

Java模式之装饰者模式&代理模式 装饰模式与代理模式区别

1.2.2 装饰模式:就是可以动态的在目标对象中添加一些功能,有装饰者,有被装饰者。 其实它跟代理模式特别像。               例子:可以把它理解为Spring的AOP,可以通...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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