设计模式之装饰模式

设计模式目录
http://blog.csdn.net/fenglailea/article/details/52733435
风.fox

装饰模式 Decorator Pattern

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

通用类图

装饰模式

组成

  • 抽象组件角色(Component)
    定义一个接口或者抽象类,以规范准备接受附加责任的对象,即可以给这些对象动态地添加职责。
  • 具体组件角色(ConcreteComponent)
    被装饰者
  • 抽象装饰器(Decorator)
    维持一个指向构件Component对象的实例,并定义一个与抽象组件角色Component接口一致的接口
  • 具体装饰器角色(ConcreteDecorator)
    向组件添加职责

案例

JAVA

// 抽象组件角色(Component)
public abstract class Component{
    public abstract void operate();
}
//具体组件角色(ConcreteComponent) 
public class ConcreteComponent extends Component{
    @OVerride
    public abstract void operate(){
        System.out.println("do Something");
    }
}
//抽象装饰器(Decorator)
public abstract class Decorator extends Component{
    private Component component=null;
    //通过构造函数传递被修饰者
    public Decorator(Component _component){
        THIS.component=_component;
    }
    //委托给被修饰者执行
    @OVerride
    public void operate(){
        this.component=operate();
    }
}
//具体装饰器角色(ConcreteDecorator)
public class ConcreteDecorator1 extends Decorator{
    //定义被修饰着
    public ConcreteDecorator1(Component _component){
        super(_component);
    }
    //定义自己的修饰方法
    private void method1(){
        System.out.println("method1 修饰");
    }
    //重写父类的operate方法
    public void operate(){
        this.method1();
        super.operate();
    }
}
public class ConcreteDecorator2 extends Decorator{
    //定义被修饰着
    public ConcreteDecorator2(Component _component){
        super(_component);
    }
    //定义自己的修饰方法
    private void method2(){
        System.out.println("method2 修饰");
    }
    //重写父类的operate方法
    public void operate(){
        this.method2();
        super.operate();
    }
}

//场景
public class Client{
    public static void main(String[] args){
        Component component= new ConcreteDecorator();
        // 第一次修饰
        component= new ConcreteDecorator1(component);
        // 第二次修饰
        component= new ConcreteDecorator2(component);
        // 修饰后执行
        component.operate();
    }
}

优点

装饰类和被装饰类可以独立发展,而不会相互耦合
装饰模式是继承关系的一个替代方案
装饰模式可以动态地扩展一个实现类的功能

使用场景

需要扩展一个类的功能,或给一个类增加附加功能
需要动态地给一个对象增加功能,这些功能可以再动态地撤销
需要为一批的兄弟类进行改装或加装功能,当然是首选装饰模式

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页