设计模式-装饰模式(八)
2018-05-23 本文已影响0人
巨子联盟
装饰器模式是一种对客户端透明的方式扩展对象的功能,是继承关系的一种替代方案
装饰类的排列组合
利用装饰类的排列组合可以产生不同效果,比继承功能强大
虽然装饰模式比继承强大可以随便排列组合,但是也容易出错,比如弄个死循环或者奇葩的东东出来
合成模式的区别:
合成模式,树型结构,分树枝和树叶,
和合成模式类似都是传递一个实现了共同接口的类进去,
但是合成模式一般是树枝包含很多个(所以它要add,remove等方法),这个装饰模式就一个
-
装饰模式可以为合成模式添加新的行为
-
装饰模式和适配器模式的区别在于,装饰器是为了增强所考虑对象的功能,
而适配器是为了改变所考虑对象的接口而不改变其功能 -
代码示例:
- 先定一个接口,抽象构件角色,装饰类和其他类都要实现
package com.byedbl.decorator;
/**
* The top abstract where concrete component and decorator
* should be derived from
*/
public interface Component {
void printString(String s);
}
- 定义一个实现类,
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);
}
}
- 现在我们想对
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);
}
}
- 实现一种装饰
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());
}
}
- 实现另外一种装饰类
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");
}
}
- 然后客户端就可以随意的排列组合产生不同的功能了
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