Java设计模式--装饰模式

装饰模式的定义是:装饰模式又名包装(Wrapper)模式。装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案。

装饰模式的主要目的是动态地给对象添加一些额外的职责。它的类图如下:

下载.png

举例说明如下:
规定接口:

public interface Component{
    public void method();
}

被装饰类:

public class ConcreateComponent implements Component{
    @Override
    public void method() {
        System.out.println("被装饰类实现的方法");
    }
}

装饰角色:

public class Decorator implements Component{
    private Component component;
  
    public Decorator(Component component){
        this.component = component;
    }

    @Override
    public void sampleOperation() {
        // 委派给构件
        component.sampleOperation();
    }
}

具体装饰类:

class ConcreateDecorator implements Component{
    private Component component;
    public ConcreateDecorator(Component component) {
        this.component = component;
    }
    @Override
    public void method() {
        this.component.method();
        //自定义代码
    }
}

测试类:

public class Test {
    public static void main(String[] args) {
        ConcreateDecorator cd = new ConcreateDecorator(new ConcreateComponent());
        cd.method();
        
    }
}

这样你就将ConcreateComponent 类包装为ConcreateDecorator 类,并且在其method方法中扩展了自己的相关代码。
其实在Java的java.io包中就使用了装饰模式,如图:

![E2JO04}U7COX2SVRM]XB64X.png](http://upload-images.jianshu.io/upload_images/5700787-8768af4eb530c715.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

我们经常写的代码:

public class Test {
    public static void main(String[] args) {
        try {
            BufferedInputStream bfin = new BufferedInputStream(new FileInputStream("asd"));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

其实就是将FileInputStream包装成BufferedInputStream 。

装饰模式的优点

(1)装饰模式与继承关系的目的都是要扩展对象的功能,但是装饰模式可以提供比继承更多的灵活性。装饰模式允许系统动态决定“贴上”一个需要的“装饰”,或者除掉一个不需要的“装饰”。继承关系则不同,继承关系是静态的,它在系统运行前就决定了。

(2)通过使用不同的具体装饰类以及这些装饰类的排列组合,设计师可以创造出很多不同行为的组合。

装饰模式的缺点

产生过多相似的对象,不易排错!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 定义 装饰者模式动态的将功能加到对象上,若要扩展功能,装饰者提供了比继承更有弹性的替代方案。 几个要点 装饰者和被...
    LeaYw阅读 385评论 2 4
  • 1 场景问题# 1.1 复杂的奖金计算## 考虑这样一个实际应用:就是如何实现灵活的奖金计算。 奖金计算是相对复杂...
    七寸知架构阅读 4,104评论 4 67
  • 装饰模式 1.定义: 动态的给一个对象添加一些额外的职责。就增加功能来讲,装饰模式比生成子类更为灵活。 2.使用场...
    TangBuzhi阅读 260评论 0 0
  • 黑夜梦着黑色的梦,像流星划过夜空, 碎落天际,是无法拾回的记忆 重温一段经历,未必她还在意 可能已经忘记 曾默默憧...
    ballnl阅读 196评论 0 2
  • 现在社会上大多数人接触或学到的知识都是碎片化,和我上学在校园里学习方式不同,我们在学校里学习的每一个学科是系统化...
    漫老牛阅读 1,303评论 0 1