美文网首页
设计模式-装饰模式(八)

设计模式-装饰模式(八)

作者: 巨子联盟 | 来源:发表于2018-05-23 16:25 被阅读0次

装饰器模式是一种对客户端透明的方式扩展对象的功能,是继承关系的一种替代方案
装饰类的排列组合

装饰模式.png

利用装饰类的排列组合可以产生不同效果,比继承功能强大
虽然装饰模式比继承强大可以随便排列组合,但是也容易出错,比如弄个死循环或者奇葩的东东出来

合成模式的区别:
合成模式,树型结构,分树枝和树叶,
和合成模式类似都是传递一个实现了共同接口的类进去,
但是合成模式一般是树枝包含很多个(所以它要add,remove等方法),这个装饰模式就一个

  • 装饰模式可以为合成模式添加新的行为

  • 装饰模式和适配器模式的区别在于,装饰器是为了增强所考虑对象的功能,
    而适配器是为了改变所考虑对象的接口而不改变其功能

  • 代码示例:
  1. 先定一个接口,抽象构件角色,装饰类和其他类都要实现
package com.byedbl.decorator;

/**
 *  The top abstract where concrete component and decorator
 *  should be derived from
 */
public interface Component  {
    void printString(String s);
}
  1. 定义一个实现类,
package com.byedbl.decorator;
/**
 *  A Concrete Component
 */
public class ConcreteComponent implements Component {
    public ConcreteComponent() {
    }
    public void printString(String s) {
        System.out.println("Input String is:" + s);
    }
}
  1. 现在我们想对ConcreteComponent 的功能进行扩展,利用装饰模式,我们先定义一个装饰类
package com.byedbl.decorator;

/**
 *  The Decorator
 */
public class Decorator implements Component {
    private Component component;
    public Decorator(Component c) {
        component = c;
    }
    public void printString(String s) {
        component.printString(s);
    }
}
  1. 实现一种装饰
package com.byedbl.decorator;
/**
 *  The Concrete Decorator
 */
public class ConcreteDecoratorA extends Decorator {
    public ConcreteDecoratorA(Component c) {
        super(c);
    }
    public void printString(String s) {
        super.printString(s);
        printStringLen(s);
    }
    public void printStringLen(String s) {
        System.out.println("The length of string is:" + s.length());
    }
}
  1. 实现另外一种装饰类
package com.byedbl.decorator;
/**
 *  The Concrete Decorator
 */
public class ConcreteDecoratorB extends Decorator {
    public ConcreteDecoratorB(Component c) {
        super(c);
    }
    public void printString(String s) {
        super.printString(s);
        printStringLen(s);
    }
    public void printStringLen(String s) {
        System.out.println("BBBBBBBBBBBBBBBBBBB");

    }
}
  1. 然后客户端就可以随意的排列组合产生不同的功能了
package com.byedbl.decorator;

/**
 *  <pre>
 *  A simple test
 *  利用装饰类的排列组合可以产生不同效果,比继承功能强大
 *
 *  合成模式的区别:
 *  合成模式,树型结构,分树枝和树叶,
 *  和合成模式类似都是传递一个实现了共同接口的类进去,
 *  但是合成模式一般是树枝包含很多个(所以它要add,remove等方法),这个装饰模式就一个
 *
 *  装饰模式可以为合成模式添加新的行为
 *
 *  装饰模式比继承强大可以随便排列组合,但是也容易出错,比如弄个死循环或者奇葩的东东出来
 *
 *  装饰模式和适配器模式的区别在于,装饰器是为了增强所考虑对象的功能,
 *      而适配器是为了改变所考虑对象的接口而不改变其功能
 *
 */
public class Test1  {
    public static void main(String[] args) {
        Component myComponent = new ConcreteComponent();
        myComponent.printString("A test String");
        Decorator myDecorator = new ConcreteDecoratorA(myComponent);
        myDecorator.printString("A test String");
        myDecorator = new ConcreteDecoratorB(myDecorator);
        myDecorator.printString("B test String");
    }
}

输出:

Input String is:A test String
Input String is:A test String
The length of string is:13
Input String is:B test String
The length of string is:13
BBBBBBBBBBBBBBBBBBB

实例有:JDK源码IO部分


image.png

相关文章

  • 9、结构型模式-装饰器设计模式

    1、如虎添翼的设计模式-装饰器设计模式 简介:讲解-装饰器设计模式介绍和应用场景 装饰器设计模式(Decorato...

  • 设计模式-装饰模式(八)

    装饰器模式是一种对客户端透明的方式扩展对象的功能,是继承关系的一种替代方案装饰类的排列组合 利用装饰类的排列组合可...

  • 设计模式(八)装饰模式

    01.模式动机 一般有两种方式可以实现给一个类或对象增加行为: 继承机制,使用继承机制是给现有类添加功能的一种有效...

  • 设计模式笔记汇总

    目录 设计原则 “依赖倒置”原则 未完待续... 设计模式 设计模式——策略模式 设计模式——装饰者模式 设计模式...

  • 11.4设计模式-装饰模式-讲解

    设计模式-装饰模式 装饰模式详解 装饰模式在android中的实际运用,避免了耦合 1. 装饰模式详解 2.装饰模...

  • 设计模式

    设计模式 单例模式、装饰者模式、

  • 设计模式

    常用的设计模式有,单例设计模式、观察者设计模式、工厂设计模式、装饰设计模式、代理设计模式,模板设计模式等等。 单例...

  • 设计模式(八)-- 装饰器模式

    源代码GitHub源代码 1.本文目标 本文目标是为了让大家认识并理解装饰器模式 2.基本套路 定义:在不改变原有...

  • 设计模式(八):装饰器模式

    装饰器模式(Decorator) 装饰器模式能够从一个对象的外部动态地给对象添加功能。 一般的,我们为了扩展一个类...

  • python设计模式(八):装饰模式

    装饰模式指的是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰...

网友评论

      本文标题:设计模式-装饰模式(八)

      本文链接:https://www.haomeiwen.com/subject/dgoljftx.html