您的位置:首页 > 其它

设计模式(3)-结构型-装饰模式(Decorator)

2016-07-09 03:55 495 查看
意图:

动态地给一个对象添加一些额外的职责。就增加功能来说,Decorator 模式相比生成子类更为灵活。

个人理解:

结合代码注释理解。

适用性:

在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责。

处理那些可以撤消的职责。

当不能采用生成子类的方法进行扩充时。一种情况是,可能有大量独立的扩展,为支持每一种组合将产生大量的子类,使得子类数目呈爆炸性增长。另一种情况可能是因为类定义被隐藏,或类定义不能用于生成子类。

简单代码,便于理解:

//抽象类
public interface Component {
public void sampleOperation();
}

//具体实现类A
public class ConcreteComponentA implements Component {
@Override
public void sampleOperation() {
// 写相关的业务代码,不同于B
}
}

//具体实现类B
public class ConcreteComponentB implements Component {
@Override
public void sampleOperation() {
// 写相关的业务代码,不同于A
}
}

//装饰类/委托类
//实现统一接口,用于将具体实现类委托给装饰类。
//根据接口注入具体实现类,完成委托,便于装饰。
//装饰类让具体实现类与具体装饰类在互不影响的情况下完成功能的增删改。
public class Decorator implements Component{

private Component component;

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

@Override
public void sampleOperation() {
// 委派给构件,只做委托,不做其他操作。
component.sampleOperation();
}
}

//具体装饰类A。
//可有多种装饰类,每种装饰类统一增加所有具体实现类的部分功能。
public class ConcreteDecoratorA extends Decorator {

public ConcreteDecoratorA(Component component) {
//注入具体实现类
super(component);
}

@Override
public void sampleOperation() {
     super.sampleOperation();
//在具体实现类的基础上新增操作
}
}

//具体装饰类B
//可有多种装饰类,每种装饰类统一增加所有具体实现类的部分功能。
public class ConcreteDecoratorB extends Decorator {

public ConcreteDecoratorB(Component component) {
super(component);
}

@Override
public void sampleOperation() {
      super.sampleOperation();
//在具体实现类的基础上新增操作
}
}

//使用方式
//可以看出,装饰模式最大的优势就在于动态的组合具体装饰类与具体实现类。
//当组合模式变多时,使用装饰远远优于使用继承。
public static void main(String[] args) {
//AA组合
ConcreteDecoratorA AA = new ConcreteDecoratorA(new ConcreteComponentA());
//AB组合
ConcreteDecoratorA AB = new ConcreteDecoratorA(new ConcreteComponentB());
//BA组合
ConcreteDecoratorB BA = new ConcreteDecoratorB(new ConcreteComponentA());
//BB组合
ConcreteDecoratorB BB = new ConcreteDecoratorB(new ConcreteComponentB());
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  设计模式