定义:动态的给一个对象添加额外的职责,就增加功能来说,装饰模式比给子类继承要灵活。
角色分析:
1. 抽象主体行为接口Component:规定添加装饰功能接口
2. 装饰角色类Deactor:持有Compoent对象的装饰类
3. 主体类CreateComponent:主体类接受装类所给的功能
4. 具体装饰类CreateDeactorA,CreateDeactorA:装饰具体的功能
示例代码
/**抽象主体行为接口 */
public interface Compoent {
public void operation();
}
/**持有Compoent对象的装饰类*/
public class Deactor implements Component{
protected Component component;
public void setComponent(Component component){
this.component =component;
}
public void operation() {
if(component !=null){
component.operation();
}
}
}
/**主体类接受装类所给的功能*/
public class CreateComponent implements Component{
public void operation() {
System. out.println("具体对象的操作" );
}
}
/**装饰具体的功能A*/
public class CreateDeactorA extends Deactor{
public void operation() {
super.operation();
System. out.println("具体装修A的操作" );
}
}
/**装饰具体的功能B*/
public class CreateDeactorB extends Deactor{
public void operation() {
super.operation();
System. out.println("具体装修A的操作" );
}
}
调用者
CreateComponent component=new CreateComponent();
CreateDeactorA a= new CreateDeactorA ();
CreateDeactorB b= new CreateDeactorB ();
a.setComponent(component);
b.setComponent(a);
b.operation();
图例UML
装饰:顾名思义就是额外的装扮,就像人一样,人是主体,但人需要衣服鞋子等等 ,并且我们经常换不同的款式和风格,有时候感觉设计模式也是源于生活。
以人穿衣服为例
public interface PersonOperation {
void operation();
}
public class PersonDeactor implements PersonOperation{
private PersonOperation personOperation;
public void setPersonOperation(PersonOperation personOperation){
this.personOperation = personOperation;
}
public void operation() {
if(personOperation !=null){
personOperation.operation();
}
}
}
public class Person implements PersonOperation{
public String name;
public Person(){}
public Person(String name){
this.name =name;
}
public void operation() {
System. out.println(name +"穿了一件上衣" );
}
}
public class PantsDeactor extends PersonDeactor{
@Override
public void operation() {
super.operation();
System. out.println("加了条裤子。。。" );
}
}
public class ShirtsDeactor extends PersonDeactor{
@Override
public void operation() {
super.operation();
System. out.println("加了双鞋子" );
}
}
Person person=new Person( "小花");
ShirtsDeactor deactor= new ShirtsDeactor();
PantsDeactor pantsDeactor= new PantsDeactor();
deactor.setPersonOperation(person);
pantsDeactor.setPersonOperation(deactor);
pantsDeactor.operation();
总结:装饰模式是为已有的功能动态的添加更多功能的一种方式,当系统需要新的功能的时候,是向旧的类中添加新的代码,这些新加的代码通常装饰了原有类的核心职责或主要行为
比如上面的例子:用鞋子和裤子装饰小花,如果在主类中加入新的字段和方法逻辑,从而增加了主类的复杂度。而装饰模式却提供了一个非常好的解决方案,把每个要装饰的功能放在单独的类中并让这个类包装它所以装饰的对象,客户端代码就可以在调用时根据需求有选择的按顺序的使用装饰功能包装对象.
装饰模式的优点:把类中的装饰功能从类中搬移去除,这样可以简化原有的类,有效地把类的核心职责和装饰功能区分开了,而且可以去除相关类中重复的装饰逻辑