优点:
- 降低耦合,将装饰类和被装饰类单独发展
- 是继承方式的一种替代方案
- 装饰可以动态地扩展一个实现类的功能
缺点:
- 多层装饰比较复杂
应用场景:
- 需要扩展一个类功能
- 需要动态给一对象增加功能,在可以动态撤销
- 需要为一批的兄弟类进行改装和加装功能
角色分类:
- Component抽象构件
- ConcreteComponent具体构件
- Decorator装饰角色
Component抽象构建
package com.memory.decorate;
/**
* 抽象构件
*
* @马上春节了,有钱/没钱,都得看长辈
* @开始计划一下吧,不然来年回来,馒头也没有吃了♞♞♞♞
*
* @author Administrator
*
*/
public abstract class Component {
//媳妇亲戚
public abstract void WRelative();
//自己亲戚
public abstract void ORelatvie();
}
ConcreteComponent
package com.memory.decorate;
/**
* 开始商场购物吧
*
* @author Administrator
*
*/
public class ConcreteComponent extends Component {
@Override
public void WRelative() {
// TODO Auto-generated method stub
System.out.println("媳妇亲戚购物清单如下");
System.out.println("牛栏山,蛋糕,衣服.....");
System.out.println("媳妇亲戚购物清单结束");
System.out.println("当前时间"+System.currentTimeMillis());
}
@Override
public void ORelatvie() {
// TODO Auto-generated method stub
System.out.println("自已亲戚购物清单如下,多买点");
System.out.println("牛栏山,烟,蛋糕,衣服.....");
System.out.println("自已亲戚购物清单结束");
}
}
Decorator装饰角色
package com.memory.decorate;
/**
* 装饰角色
*
* @离家一年多,家里变化应该很大,所以得有预备方案
*
* @author Administrator
*
*/
public abstract class Decorator extends Component {
private Component mComponent;
public Decorator(Component component) {
// TODO Auto-generated constructor stub
this.mComponent = component;
}
/**
* 被修饰执行
*/
@Override
public void WRelative() {
// TODO Auto-generated method stub
System.out.println("女方父类装饰");
this.mComponent.WRelative();
}
/**
* 被修饰执行
*/
@Override
public void ORelatvie() {
// TODO Auto-generated method stub
System.out.println("男方父类装饰");
this.mComponent.ORelatvie();
}
}
ConcreteDecorator
package com.memory.decorate;
/**
* 装饰具体角色
*
* @author Administrator
*
*/
public class ConcreteDecorator extends Decorator {
public ConcreteDecorator(Component component) {
super(component);
// TODO Auto-generated constructor stub
}
/**
* 预备方案,具体开始执行,
*/
private void method() {
System.out.println("预备方案中---亲戚家增加一个小人,红包呢,给吧!");
}
/**
* 被修饰执行
*/
@Override
public void WRelative() {
// TODO Auto-generated method stub
method();
super.WRelative();
}
/**
* 被修饰执行
*/
@Override
public void ORelatvie() {
// TODO Auto-generated method stub
method();
super.ORelatvie();
}
}
ConcreteDecorator2
package com.memory.decorate;
/**
* 装饰具体角色
*
* @author Administrator
*
*/
public class ConcreteDecorator2 extends Decorator {
public ConcreteDecorator2(Component component) {
super(component);
// TODO Auto-generated constructor stub
}
/**
* 预备方案,具体开始执行,
*/
private void method1() {
System.out.println("预备方案中---同学聚会,AA吧");
}
/**
* 被修饰执行
*/
@Override
public void WRelative() {
// TODO Auto-generated method stub
method1();
super.WRelative();
}
/**
* 被修饰执行
*/
@Override
public void ORelatvie() {
// TODO Auto-generated method stub
method1();
super.ORelatvie();
}
}
测试
// 装饰模式
Component component = new ConcreteComponent();
component = new ConcreteDecorator(component);
component = new ConcreteDecorator2(component);
// 修饰后
component.WRelative();
//输出结果/
启动应用成功!开启美好的一天
预备方案中---同学聚会,AA吧
女方父类装饰
预备方案中---亲戚家增加一个小人,红包呢,给吧!
女方父类装饰
媳妇亲戚购物清单如下
牛栏山,蛋糕,衣服.....
媳妇亲戚购物清单结束