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

2018-05-23  本文已影响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
上一篇下一篇

猜你喜欢

热点阅读